From 99249cfb4ee251bb5db3b93910dce925fac88e21 Mon Sep 17 00:00:00 2001 From: Mathias De Wachter Date: Wed, 15 Oct 2014 08:50:30 -0400 Subject: [PATCH] added python stuff --- elpa/archives/gnu/archive-contents | 47 +- elpa/archives/marmalade/archive-contents | 400 +- elpa/archives/melpa-stable/archive-contents | 2 +- elpa/cider-0.4.0/cider-autoloads.el | 86 + elpa/cider-0.4.0/cider-client.el | 163 + elpa/cider-0.4.0/cider-client.elc | Bin 0 -> 6424 bytes elpa/cider-0.4.0/cider-eldoc.el | 119 + elpa/cider-0.4.0/cider-eldoc.elc | Bin 0 -> 3460 bytes elpa/cider-0.4.0/cider-interaction.el | 1159 + elpa/cider-0.4.0/cider-interaction.elc | Bin 0 -> 41528 bytes elpa/cider-0.4.0/cider-macroexpansion.el | 165 + elpa/cider-0.4.0/cider-macroexpansion.elc | Bin 0 -> 6599 bytes elpa/cider-0.4.0/cider-mode.el | 123 + elpa/cider-0.4.0/cider-mode.elc | Bin 0 -> 4614 bytes elpa/cider-0.4.0/cider-pkg.el | 3 + elpa/cider-0.4.0/cider-pkg.elc | Bin 0 -> 725 bytes elpa/cider-0.4.0/cider-repl.el | 1032 + elpa/cider-0.4.0/cider-repl.elc | Bin 0 -> 38330 bytes elpa/cider-0.4.0/cider-selector.el | 152 + elpa/cider-0.4.0/cider-selector.elc | Bin 0 -> 7102 bytes elpa/cider-0.4.0/cider-util.el | 57 + elpa/cider-0.4.0/cider-util.elc | Bin 0 -> 1280 bytes elpa/cider-0.4.0/cider-version.el | 78 + elpa/cider-0.4.0/cider-version.elc | Bin 0 -> 2063 bytes elpa/cider-0.4.0/cider.el | 110 + elpa/cider-0.4.0/cider.elc | Bin 0 -> 2438 bytes elpa/cider-0.4.0/nrepl-client.el | 888 + elpa/cider-0.4.0/nrepl-client.elc | Bin 0 -> 34049 bytes elpa/cider-0.7.0/cider-mode.elc | Bin 5801 -> 0 bytes elpa/concurrent-0.3.2/concurrent-autoloads.el | 18 + elpa/concurrent-0.3.2/concurrent-pkg.el | 1 + elpa/concurrent-0.3.2/concurrent-pkg.elc | Bin 0 -> 681 bytes elpa/concurrent-0.3.2/concurrent.el | 505 + elpa/concurrent-0.3.2/concurrent.elc | Bin 0 -> 28709 bytes elpa/ctable-0.1.2/ctable-autoloads.el | 18 + elpa/ctable-0.1.2/ctable-pkg.el | 1 + elpa/ctable-0.1.2/ctable-pkg.elc | Bin 0 -> 638 bytes elpa/ctable-0.1.2/ctable.el | 1896 ++ elpa/ctable-0.1.2/ctable.elc | Bin 0 -> 148944 bytes elpa/deferred-0.3.2/deferred-autoloads.el | 18 + elpa/deferred-0.3.2/deferred-pkg.el | 1 + elpa/deferred-0.3.2/deferred-pkg.elc | Bin 0 -> 658 bytes elpa/deferred-0.3.2/deferred.el | 953 + elpa/deferred-0.3.2/deferred.elc | Bin 0 -> 44867 bytes elpa/epc-0.1.1/epc-autoloads.el | 18 + elpa/epc-0.1.1/epc-pkg.el | 1 + elpa/epc-0.1.1/epc-pkg.elc | Bin 0 -> 666 bytes elpa/epc-0.1.1/epc.el | 774 + elpa/epc-0.1.1/epc.elc | Bin 0 -> 50618 bytes elpa/flycheck-0.20/flycheck-autoloads.el | 151 + elpa/flycheck-0.20/flycheck-pkg.el | 10 + elpa/flycheck-0.20/flycheck.el | 6201 ++++ elpa/flycheck-0.20/flycheck.elc | Bin 0 -> 283800 bytes elpa/ipython-2927/ipython-autoloads.el | 18 + elpa/ipython-2927/ipython-pkg.el | 1 + elpa/ipython-2927/ipython-pkg.elc | Bin 0 -> 651 bytes elpa/ipython-2927/ipython.el | 494 + elpa/ipython-2927/ipython.elc | Bin 0 -> 8743 bytes elpa/jedi-0.1.2/Makefile | 168 + elpa/jedi-0.1.2/jedi-autoloads.el | 73 + elpa/jedi-0.1.2/jedi-pkg.el | 6 + elpa/jedi-0.1.2/jedi.el | 1067 + elpa/jedi-0.1.2/jedi.elc | Bin 0 -> 36095 bytes elpa/jedi-0.1.2/jediepcserver.py | 302 + elpa/jedi-0.1.2/setup.py | 3 + elpa/jedi-readme.txt | 0 elpa/python-mode-6.1.3/INSTALL | 24 + elpa/python-mode-6.1.3/LICENSE | 674 + elpa/python-mode-6.1.3/NEWS | 915 + elpa/python-mode-6.1.3/PKG-INFO | 11 + elpa/python-mode-6.1.3/README | 197 + .../byte-compile-directory.sh | 40 + .../completion/auto-complete-pycomplete.el | 47 + .../completion/company-pycomplete.el | 74 + .../completion/pycomplete.el | 436 + .../completion/pycomplete.elc | Bin 0 -> 14647 bytes .../completion/pycomplete.py | 776 + .../completion/test_pycomplete.py | 238 + .../doc/commands-python-mode.org | 5088 +++ .../doc/commands-python-mode.rst | 6309 ++++ .../doc/variables-python-mode.org | 833 + .../doc/variables-python-mode.rst | 995 + .../extensions/column-marker.el | 259 + .../extensions/column-marker.elc | Bin 0 -> 7190 bytes .../extensions/highlight-indentation.el | 103 + .../extensions/highlight-indentation.elc | Bin 0 -> 3088 bytes .../python-mode-autoloads.el | 18 + elpa/python-mode-6.1.3/python-mode-pkg.el | 2 + elpa/python-mode-6.1.3/python-mode-pkg.elc | Bin 0 -> 656 bytes elpa/python-mode-6.1.3/python-mode.el | 26765 ++++++++++++++++ elpa/python-mode-6.1.3/python-mode.elc | Bin 0 -> 882605 bytes elpa/python-mode-6.1.3/setup.py | 14 + elpa/python-mode-6.1.3/test/doctest-mode.el | 2061 ++ elpa/python-mode-6.1.3/test/doctest-mode.elc | Bin 0 -> 56310 bytes .../test/pars-part-output.el | 100 + .../test/pars-part-output.elc | Bin 0 -> 2998 bytes .../test/py-bug-numbered-tests.el | 6228 ++++ .../test/py-bug-numbered-tests.elc | Bin 0 -> 421346 bytes .../test/py-shell-completion-tests.el | 173 + .../test/py-shell-completion-tests.elc | Bin 0 -> 5420 bytes .../test/python-executes-test.el | 123 + .../test/python-executes-test.elc | Bin 0 -> 5070 bytes .../test/python-extended-executes-test.el | 2545 ++ .../test/python-extended-executes-test.elc | Bin 0 -> 150160 bytes .../test/python-mode-ert-tests.el | 582 + .../test/python-mode-ert-tests.elc | Bin 0 -> 71537 bytes .../test/python-mode-test.el | 2399 ++ .../test/python-mode-tests.sh | 1459 + .../test/test-triple-strings.py | 78 + init.el | 16 + 110 files changed, 76691 insertions(+), 173 deletions(-) create mode 100644 elpa/cider-0.4.0/cider-autoloads.el create mode 100644 elpa/cider-0.4.0/cider-client.el create mode 100644 elpa/cider-0.4.0/cider-client.elc create mode 100644 elpa/cider-0.4.0/cider-eldoc.el create mode 100644 elpa/cider-0.4.0/cider-eldoc.elc create mode 100644 elpa/cider-0.4.0/cider-interaction.el create mode 100644 elpa/cider-0.4.0/cider-interaction.elc create mode 100644 elpa/cider-0.4.0/cider-macroexpansion.el create mode 100644 elpa/cider-0.4.0/cider-macroexpansion.elc create mode 100644 elpa/cider-0.4.0/cider-mode.el create mode 100644 elpa/cider-0.4.0/cider-mode.elc create mode 100644 elpa/cider-0.4.0/cider-pkg.el create mode 100644 elpa/cider-0.4.0/cider-pkg.elc create mode 100644 elpa/cider-0.4.0/cider-repl.el create mode 100644 elpa/cider-0.4.0/cider-repl.elc create mode 100644 elpa/cider-0.4.0/cider-selector.el create mode 100644 elpa/cider-0.4.0/cider-selector.elc create mode 100644 elpa/cider-0.4.0/cider-util.el create mode 100644 elpa/cider-0.4.0/cider-util.elc create mode 100644 elpa/cider-0.4.0/cider-version.el create mode 100644 elpa/cider-0.4.0/cider-version.elc create mode 100644 elpa/cider-0.4.0/cider.el create mode 100644 elpa/cider-0.4.0/cider.elc create mode 100644 elpa/cider-0.4.0/nrepl-client.el create mode 100644 elpa/cider-0.4.0/nrepl-client.elc delete mode 100644 elpa/cider-0.7.0/cider-mode.elc create mode 100644 elpa/concurrent-0.3.2/concurrent-autoloads.el create mode 100644 elpa/concurrent-0.3.2/concurrent-pkg.el create mode 100644 elpa/concurrent-0.3.2/concurrent-pkg.elc create mode 100644 elpa/concurrent-0.3.2/concurrent.el create mode 100644 elpa/concurrent-0.3.2/concurrent.elc create mode 100644 elpa/ctable-0.1.2/ctable-autoloads.el create mode 100644 elpa/ctable-0.1.2/ctable-pkg.el create mode 100644 elpa/ctable-0.1.2/ctable-pkg.elc create mode 100644 elpa/ctable-0.1.2/ctable.el create mode 100644 elpa/ctable-0.1.2/ctable.elc create mode 100644 elpa/deferred-0.3.2/deferred-autoloads.el create mode 100644 elpa/deferred-0.3.2/deferred-pkg.el create mode 100644 elpa/deferred-0.3.2/deferred-pkg.elc create mode 100644 elpa/deferred-0.3.2/deferred.el create mode 100644 elpa/deferred-0.3.2/deferred.elc create mode 100644 elpa/epc-0.1.1/epc-autoloads.el create mode 100644 elpa/epc-0.1.1/epc-pkg.el create mode 100644 elpa/epc-0.1.1/epc-pkg.elc create mode 100644 elpa/epc-0.1.1/epc.el create mode 100644 elpa/epc-0.1.1/epc.elc create mode 100644 elpa/flycheck-0.20/flycheck-autoloads.el create mode 100644 elpa/flycheck-0.20/flycheck-pkg.el create mode 100644 elpa/flycheck-0.20/flycheck.el create mode 100644 elpa/flycheck-0.20/flycheck.elc create mode 100644 elpa/ipython-2927/ipython-autoloads.el create mode 100644 elpa/ipython-2927/ipython-pkg.el create mode 100644 elpa/ipython-2927/ipython-pkg.elc create mode 100644 elpa/ipython-2927/ipython.el create mode 100644 elpa/ipython-2927/ipython.elc create mode 100644 elpa/jedi-0.1.2/Makefile create mode 100644 elpa/jedi-0.1.2/jedi-autoloads.el create mode 100644 elpa/jedi-0.1.2/jedi-pkg.el create mode 100644 elpa/jedi-0.1.2/jedi.el create mode 100644 elpa/jedi-0.1.2/jedi.elc create mode 100644 elpa/jedi-0.1.2/jediepcserver.py create mode 100644 elpa/jedi-0.1.2/setup.py create mode 100644 elpa/jedi-readme.txt create mode 100644 elpa/python-mode-6.1.3/INSTALL create mode 100644 elpa/python-mode-6.1.3/LICENSE create mode 100644 elpa/python-mode-6.1.3/NEWS create mode 100644 elpa/python-mode-6.1.3/PKG-INFO create mode 100644 elpa/python-mode-6.1.3/README create mode 100644 elpa/python-mode-6.1.3/byte-compile-directory.sh create mode 100644 elpa/python-mode-6.1.3/completion/auto-complete-pycomplete.el create mode 100644 elpa/python-mode-6.1.3/completion/company-pycomplete.el create mode 100644 elpa/python-mode-6.1.3/completion/pycomplete.el create mode 100644 elpa/python-mode-6.1.3/completion/pycomplete.elc create mode 100644 elpa/python-mode-6.1.3/completion/pycomplete.py create mode 100755 elpa/python-mode-6.1.3/completion/test_pycomplete.py create mode 100644 elpa/python-mode-6.1.3/doc/commands-python-mode.org create mode 100644 elpa/python-mode-6.1.3/doc/commands-python-mode.rst create mode 100644 elpa/python-mode-6.1.3/doc/variables-python-mode.org create mode 100644 elpa/python-mode-6.1.3/doc/variables-python-mode.rst create mode 100644 elpa/python-mode-6.1.3/extensions/column-marker.el create mode 100644 elpa/python-mode-6.1.3/extensions/column-marker.elc create mode 100644 elpa/python-mode-6.1.3/extensions/highlight-indentation.el create mode 100644 elpa/python-mode-6.1.3/extensions/highlight-indentation.elc create mode 100644 elpa/python-mode-6.1.3/python-mode-autoloads.el create mode 100644 elpa/python-mode-6.1.3/python-mode-pkg.el create mode 100644 elpa/python-mode-6.1.3/python-mode-pkg.elc create mode 100644 elpa/python-mode-6.1.3/python-mode.el create mode 100644 elpa/python-mode-6.1.3/python-mode.elc create mode 100644 elpa/python-mode-6.1.3/setup.py create mode 100644 elpa/python-mode-6.1.3/test/doctest-mode.el create mode 100644 elpa/python-mode-6.1.3/test/doctest-mode.elc create mode 100644 elpa/python-mode-6.1.3/test/pars-part-output.el create mode 100644 elpa/python-mode-6.1.3/test/pars-part-output.elc create mode 100644 elpa/python-mode-6.1.3/test/py-bug-numbered-tests.el create mode 100644 elpa/python-mode-6.1.3/test/py-bug-numbered-tests.elc create mode 100644 elpa/python-mode-6.1.3/test/py-shell-completion-tests.el create mode 100644 elpa/python-mode-6.1.3/test/py-shell-completion-tests.elc create mode 100644 elpa/python-mode-6.1.3/test/python-executes-test.el create mode 100644 elpa/python-mode-6.1.3/test/python-executes-test.elc create mode 100644 elpa/python-mode-6.1.3/test/python-extended-executes-test.el create mode 100644 elpa/python-mode-6.1.3/test/python-extended-executes-test.elc create mode 100644 elpa/python-mode-6.1.3/test/python-mode-ert-tests.el create mode 100644 elpa/python-mode-6.1.3/test/python-mode-ert-tests.elc create mode 100644 elpa/python-mode-6.1.3/test/python-mode-test.el create mode 100755 elpa/python-mode-6.1.3/test/python-mode-tests.sh create mode 100644 elpa/python-mode-6.1.3/test/test-triple-strings.py diff --git a/elpa/archives/gnu/archive-contents b/elpa/archives/gnu/archive-contents index 58585df98..911aeb172 100644 --- a/elpa/archives/gnu/archive-contents +++ b/elpa/archives/gnu/archive-contents @@ -5,15 +5,21 @@ ((:keywords "tools" "processes" "convenience") (:url . "https://github.com/leoliu/ack-el"))]) (ada-mode . - [(5 1 5) + [(5 1 6) ((wisi - (1 0 5)) + (1 0 6)) (cl-lib (0 4)) (emacs (24 2))) "major-mode for editing Ada sources" tar - ((:url . "http://stephe-leake.org/emacs/ada-mode/emacs-ada-mode.html"))]) + ((:keywords "languages" "ada") + (:url . "http://stephe-leake.org/emacs/ada-mode/emacs-ada-mode.html"))]) + (ada-ref-man . + [(2012 0) + nil "Ada Reference Manual 2012" tar + ((:keywords "languages" "ada") + (:url . "http://stephe-leake.org/ada/arm.html"))]) (adaptive-wrap . [(0 5) nil "Smart line-wrapping with wrap-prefix" single @@ -65,7 +71,7 @@ ((:url . "http://github.com/defunkt/coffee-mode") (:keywords "coffeescript" "major" "mode"))]) (company . - [(0 8 2) + [(0 8 6) ((emacs (24 1)) (cl-lib @@ -73,6 +79,11 @@ "Modular text completion framework" tar ((:keywords "abbrev" "convenience" "matching") (:url . "http://company-mode.github.io/"))]) + (crisp . + [(1 3 4) + nil "CRiSP/Brief Emacs emulator" single + ((:url . "http://elpa.gnu.org/packages/crisp.html") + (:keywords "emulations" "brief" "crisp"))]) (csv-mode . [(1 2) nil "Major mode for editing comma/char separated values" single @@ -95,7 +106,7 @@ ((:url . "http://www.dr-qubit.org/emacs.php") (:keywords "extensions" "matching" "data structures trie" "tree" "dictionary" "completion" "regexp"))]) (diff-hl . - [(1 5 3) + [(1 6 0) ((cl-lib (0 2))) "Highlight uncommitted changes" tar @@ -175,7 +186,7 @@ ((:url . "http://elpa.gnu.org/packages/flylisp.html") (:keywords))]) (ggtags . - [(0 8 5) + [(0 8 6) ((emacs (24)) (cl-lib @@ -183,6 +194,13 @@ "emacs frontend to GNU Global source code tagging system" single ((:url . "https://github.com/leoliu/ggtags") (:keywords "tools" "convenience"))]) + (gnorb . + [(1) + ((cl-lib + (0 5))) + "Glue code between Gnus, Org, and BBDB" tar + ((:keywords "mail" "org" "gnus" "bbdb" "todo" "task") + (:url . "https://github.com/girzel/gnorb"))]) (gnugo . [(3 0 0) ((ascii-art-to-unicode @@ -205,7 +223,7 @@ ((:url . "http://elpa.gnu.org/packages/ioccur.html") (:keywords))]) (javaimp . - [(0 4) + [(0 5) nil "Add and reorder Java import statements in Maven projects" single ((:url . "http://elpa.gnu.org/packages/javaimp.html") (:keywords "java" "maven" "programming"))]) @@ -297,7 +315,7 @@ ((:url . "http://elpa.gnu.org/packages/omn-mode.html") (:keywords))]) (org . - [(20140804) + [(20141013) nil "Outline-based notes management and organizer" tar nil]) (osc . [(0 1) @@ -320,7 +338,7 @@ ((:url . "http://www.dr-qubit.org/emacs.php") (:keywords "extensions" "data structures" "queue"))]) (rainbow-mode . - [(0 9) + [(0 10) nil "Colorize color names in buffers" single ((:url . "http://elpa.gnu.org/packages/rainbow-mode.html") (:keywords "faces"))]) @@ -390,7 +408,7 @@ nil "Unicode confusables table" tar ((:url . "http://elpa.gnu.org/packages/uni-confusables.html"))]) (vlf . - [(1 5) + [(1 6) nil "View Large Files" tar ((:keywords "large files" "utilities") (:url . "https://github.com/m00natic/vlfi"))]) @@ -407,12 +425,12 @@ (web-server . [(0 1 1) ((emacs - (24 4))) + (24 3))) "Emacs Web Server" tar ((:keywords "http" "server" "network") (:url . "https://github.com/eschulte/emacs-web-server"))]) (websocket . - [(1 1) + [(1 3) nil "Emacs WebSocket client and server" tar ((:keywords "communication" "websocket" "server") (:url . "http://elpa.gnu.org/packages/websocket.html"))]) @@ -422,13 +440,14 @@ ((:url . "http://elpa.gnu.org/packages/windresize.html") (:keywords "window"))]) (wisi . - [(1 0 5) + [(1 0 6) ((cl-lib (0 4)) (emacs (24 2))) "Utilities for implementing an indentation/navigation engine using a generalized LALR parser" tar - ((:url . "http://stephe-leake.org/emacs/ada-mode/emacs-ada-mode.html"))]) + ((:keywords "parser" "indentation" "navigation") + (:url . "http://stephe-leake.org/emacs/ada-mode/emacs-ada-mode.html"))]) (wpuzzle . [(1 1) nil "find as many word in a given time" single diff --git a/elpa/archives/marmalade/archive-contents b/elpa/archives/marmalade/archive-contents index 7ae06f487..29d9a1c3e 100644 --- a/elpa/archives/marmalade/archive-contents +++ b/elpa/archives/marmalade/archive-contents @@ -1,47 +1,4 @@ (1 - (jump-dls . - [(0 4) - nil "Jump to definition of symbol using various methods." single]) - (mv-shell . - [(1 2) - nil "keep buffers in sync with filename throughout 'mv'commands in shell-mode." single]) - (fancy-battery . - [(0 2) - ((emacs - (24 1))) - "Fancy battery display" single]) - (how-many-lines-in-project . - [(0 2) - ((find-file-in-project - (3 3))) - "Calculate how many lines are there in your project." single]) - (clojure-env . - [(0 0 3) - nil "manage clojure environments with Emacs" single]) - (snakehump . - [(0 1 1) - nil "Convert between compound word conventions" tar]) - (env-var-import . - [(2 1) - nil "Import shell environment variables in GUI Emacs" single]) - (eldoro . - [(0 1 0) - nil "A pomodoro timer/tracker that works with org-mode." tar]) - (highlight-sexp . - [(1 0) - nil "highlight current zone according to its context" single]) - (tdd . - [(1 0) - nil "recompile on save and indicate success in the mode line" single]) - (markdown-toc . - [(0 0 6) - ((markdown-mode - (2 0)) - (dash - (2 5 0)) - (s - (1 7 0))) - "A simple TOC generator for markdown file" single]) (zone-matrix . [(0 0 1) nil "Matrix themed Zone mode" tar]) @@ -65,6 +22,9 @@ (zenburn-theme . [(2 1) nil "A low contrast color theme for Emacs." single]) + (zenburn . + [(0 1) + nil "A low contrast colour theme for Emacs" single]) (zen-mode . [(20120627) nil "remove/restore Emacs distractions quickly" tar]) @@ -150,8 +110,8 @@ (24))) "declarative configuration for Emacsen" single]) (with-namespace . - [(1 1) - nil "Poor-man's namespaces for elisp" single]) + [(1 1) + nil "Poor-man's namespaces for elisp" single]) (wisp-mode . [(0 1 5) nil "Tools for wisp: the Whitespace-to-Lisp preprocessor" single]) @@ -228,20 +188,19 @@ [(8 0 4) nil "major mode for editing html templates" single]) (web . - [(0 4 3) + [(0 4 5) ((dash - (2 3 0))) + (2 3 0)) + (s + (1 5 0))) "useful HTTP client" single]) (weather-metno . - [(20140121) + [(20140909) ((emacs (24)) (cl-lib (0 3))) "Weather data from met.no in Emacs" tar]) - (weather . - [(2012 3 27 2) - nil "Get weather reports via worldweatheronline.com" single]) (wcheck-mode . [(2014 6 21) nil "General interface for text checkers" tar]) @@ -251,6 +210,11 @@ (watch-buffer . [(1 0 1) nil "run a shell command when saving a buffer" single]) + (waher-theme . + [(20130917 7) + ((emacs + (24 1))) + "Emacs 24 theme based on waher for st2 by dduckster" single]) (wacspace . [(0 4 2) ((dash @@ -293,9 +257,15 @@ (vcard . [(0 1) nil "vcard parsing and display routines" single]) + (vc-tfs . + [(0 1 2) + nil "Support for TFS version control system" single]) (vc-darcs . [(1 12) nil "a VC backend for darcs" single]) + (vala-mode . + [(0 1) + nil "Vala mode derived mode" single]) (uuid . [(0 0 3) nil "UUID's for EmacsLisp" single]) @@ -426,7 +396,7 @@ (0 4 2))) "Test the content of a value" single]) (tronesque-theme . - [(1 3) + [(1 5) nil "Color Theme based on Tron universe." single]) (troncle . [(0 1 2) @@ -437,7 +407,7 @@ [(12) nil "A theme loosely based on Tron: Legacy colors" single]) (tracking . - [(1 4) + [(1 5) ((shorten (0 3))) "Buffer modification tracking" single]) @@ -454,8 +424,8 @@ [(0 1 3) nil "Mojor mode for editing TOML files" single]) (toggle-test . - [(1 0 1) - nil "Toggle between source and test files. It is language agnostic and creates source/test files if they don't exist." single]) + [(1 0 2) + nil "Toggle between source and test files in various programming languages" single]) (todotxt . [(0 2 3) nil "A major mode for editing todo.txt files" single]) @@ -474,6 +444,9 @@ (thread-dump . [(1 0) nil "java thread dump viewer" single]) + (thesaurus . + [(2012 4 7) + nil "replace a word with a synonym looked up in a web service." single]) (theme-changer . [(2 1 0) nil "Sunrise/Sunset Theme Changer for Emacs" single]) @@ -498,6 +471,9 @@ (tdd-status-mode-line . [(0 1 2) nil "TDD status on the mode-line" single]) + (tdd . + [(1 0) + nil "recompile on save and indicate success in the mode line" single]) (tbemail . [(0 2) nil "Provide syntax highlighting for email editing via" single]) @@ -566,6 +542,9 @@ (sumatra-forward . [(2008 10 8) nil "Provides Sumatra Forward search" single]) + (sudo-edit . + [(0 0 1) + nil "Utilities for opening files with sudo" single]) (sudden-death . [(0 1) nil "Totsuzen-no-Shi" single]) @@ -601,6 +580,9 @@ (yasnippet (0 6 1))) "REQUIRES EMACS 24 - Sublime Text 2 Emulation for Emacs" tar]) + (subatomic-enhanced-theme . + [(1 0 1) + nil "Nice looking emacs 24 theme" single]) (stylus-mode . [(0 1) nil "Major mode for editing stylus templates." single]) @@ -706,6 +688,9 @@ (sokoban . [(1 23) nil "Play the Sokoban game in emacs" single]) + (snakehump . + [(0 1 1) + nil "Convert between compound word conventions" tar]) (smtpmail-multi . [(0 6) nil "Use different smtp servers for sending mail" single]) @@ -736,7 +721,7 @@ [(0 6) nil "vim-like window controlling plugin" single]) (smart-whitespace-comment-fixup . - [(1 0) + [(1 1) nil "Enables advice around yanking/killing lines that auto-indents and formats properly" single]) (smart-tab . [(0 3) @@ -885,6 +870,9 @@ (sequences (0 1 0))) "A dead simple way to load sensitive information" single]) + (sedated . + [(1 0) + nil "A few extremely simple sed functions for familiar text manipulation" single]) (seclusion-mode . [(1 1 1) nil "Edit in seclusion. A Dark Room mode." single]) @@ -913,7 +901,7 @@ [(20110708) nil "Mode-specific scratch buffers" single]) (scpaste . - [(0 6 1) + [(0 6 2) ((htmlize (1 39))) "Paste to the web via scp." single]) @@ -1042,7 +1030,7 @@ (request-deferred . [(0 2 0) ((deferred - (0 3 1)) + (0 3 1)) (request (0 2 0))) "Wrap request.el by deferred" single]) @@ -1075,7 +1063,7 @@ (1 2))) "A library for pasting to https://refheap.com" single]) (recursive-narrow . - [(1 2) + [(20140811 1546) nil "narrow-to-region that operates recursively" single]) (rect-mark . [(1 4) @@ -1102,7 +1090,7 @@ [(0 2) nil "color nicks" single]) (rbenv . - [(0 0 1) + [(0 0 3) nil "Emacs integration for rbenv" single]) (rainbow-delimiters . [(1 3 21) @@ -1126,7 +1114,7 @@ [(1 1) nil "Python Pyvirtualenv support" single]) (pyvenv . - [(1 2) + [(1 4) nil "Python virtual environment interface" single]) (python-pylint . [(1 1) @@ -1229,9 +1217,6 @@ (emacs (24))) "A project explorer sidebar" single]) - (project . - [(1 0) - nil "Keep track of the current project" single]) (processing-snippets . [(1 0 0) ((yasnippet @@ -1345,6 +1330,9 @@ (pep8 . [(1 2) nil "run the python pep8 checker putting hits in a grep buffer" single]) + (peepopen . + [(0 1 0) + nil "Graphical file chooser for Emacs on Mac OS X." single]) (peep-open . [(0 0 2) nil "PeepOpen plugin for emacs." single]) @@ -1475,19 +1463,17 @@ (1 6 8))) "Blog from Org mode to wordpress" tar]) (org-trello . - [(0 4 8) - ((db - (0 0 6)) + [(0 6 2) + ((request-deferred + (0 1 0)) + (deferred + (0 3 2)) (s - (1 7 0)) - (esxml - (0 3 0)) - (elnode - (0 9 9 7 6)) - (request - (0 2 0)) + (1 9 0)) (dash - (2 5 0))) + (2 8 0)) + (emacs + (24))) "Minor mode to synchronize org-mode buffer and trello board" tar]) (org-table-comment . [(0 2) @@ -1503,6 +1489,9 @@ (lib-requires (21 0))) "Integrates Readme.org and Commentary/Change-logs." single]) + (org-publish-agenda . + [(1 5) + nil "Publish org agenda with links to other files" single]) (org-protocol-jekyll . [(0 1) nil "Jekyll's handler for org-protocol" single]) @@ -1522,14 +1511,14 @@ [(20120112) nil "org html export for text/html MIME emails" single]) (org-magit . - [(0 2 0) + [(0 2 2) ((magit - (0 8)) + (1 2 0)) (org (6 1))) "basic support for magit links" single]) (org-journal . - [(1 5 2) + [(1 5 3) nil "a simple org-mode based journaling mode" single]) (org-gnome . [(0 1) @@ -1570,6 +1559,12 @@ (openstack-cgit-browse-file . [(0 2) nil "Browse the current file in OpenStack cgit" single]) + (om-mode . + [(0 5 20140916) + nil "Insert Om component template with life cycle." single]) + (offlineimap . + [(0 1) + nil "Run OfflineIMAP from Emacs" single]) (oddmuse . [(20090222) nil "edit pages on an Oddmuse wiki" single]) @@ -1599,6 +1594,9 @@ (ntcmd . [(1 0) nil "major mode for editing cmd scripts" single]) + (nssh-n . + [(0 9 8) + nil "SSH mode for Emacs" single]) (nsis-mode . [(0 44) nil "NSIS-mode" single]) @@ -1639,12 +1637,12 @@ ((nose (0 1 1))) "Minor mode for running nose tests." tar]) - (nose . - [(0 1 1) - nil "Easy Python test running in Emacs" single]) (noflet . - [(0 0 11) - nil "locally override functions" single]) + [(0 0 12) + nil "locally override functions" single]) + (nodejs-repl . + [(0 0 2 1) + nil "Run Node.js REPL" single]) (no-easy-keys . [(1 0 2) nil "Learn the proper Emacs movement keys" single]) @@ -1674,6 +1672,9 @@ (mwe-log-commands . [(20041106) nil "log keyboard commands to buffer" single]) + (mv-shell . + [(1 2) + nil "keep buffers in sync with filename throughout 'mv'commands in shell-mode." single]) (mustache-mode . [(1 2) nil "A major mode for editing Mustache files." single]) @@ -1709,6 +1710,9 @@ (move-text . [(1 0) nil "Move current line or region with M-up or M-down." single]) + (move-line . + [(0 0 1) + nil "utilities for moving lines in file" single]) (mote-mode . [(1 0 0) ((ruby-mode @@ -1793,11 +1797,14 @@ (maxframe . [(0 5 1) nil "maximize the emacs frame based on display size" single]) + (math-at-point . + [(0 0 1) + nil "Utilities for modifying numbers at point" single]) (master-mode . [(0 1) nil "Become an Emacs master" single]) (marmalade-upload . - [(0 0 4) + [(0 0 5) ((web (0 4 2)) (kv @@ -1807,13 +1814,21 @@ [(0 0 1) nil "A test tarball package." tar]) (marmalade-service . - [(2 0 9) + [(2 0 16) ((dash (1 1 0)) (s (1 6 0)) + (kv + (0 0 16)) + (noflet + (0 0 7)) (elnode - (0 9 9 6 10))) + (0 9 9 8 6)) + (file-format + (0 0 1)) + (htmlize + (1 3 9))) "The Marmalade package store service." tar]) (marmalade-demo . [(0 0 5) @@ -1826,6 +1841,15 @@ (markup-faces . [(1 0 0) nil "collection of faces for markup language modes" single]) + (markdown-toc . + [(0 0 6) + ((markdown-mode + (2 0)) + (dash + (2 5 0)) + (s + (1 7 0))) + "A simple TOC generator for markdown file" single]) (markdown-mode . [(2 0) nil "Emacs Major mode for Markdown-formatted text files" single]) @@ -1856,11 +1880,14 @@ (makefile-runner . [(1 1 2) nil "Searches for Makefile and fetches targets" single]) + (mainline . + [(1 1 0) + nil "modeline replacement forked from an early version of powerline.el" single]) (main-line . - [(1 2 2) + [(1 2 8) nil "modeline replacement forked from an early version of powerline.el" single]) (maildir . - [(0 0 27) + [(0 0 28) ((kv (0 0 17)) (dash @@ -1906,7 +1933,7 @@ [(0 0 1) nil "Mode for automatically handle multiple tags files with Mactag rubygem" single]) (macrostep . - [(0 6) + [(0 8) nil "interactive macro stepper for Emacs Lisp" single]) (macro-utils . [(1 0) @@ -1921,9 +1948,9 @@ [(0 0 2) nil "lxc integration with Emacs" single]) (lui . - [(1 3) + [(1 4) ((tracking - (1 4))) + (1 5))) "Linewise User Interface" tar]) (lua-mode . [(20110428) @@ -1932,8 +1959,8 @@ [(0 1) nil "Insert dummy pseudo Latin text." single]) (loop . - [(1 1) - nil "friendly imperative loop structures" single]) + [(1 1) + nil "friendly imperative loop structures" single]) (look-mode . [(1 0) nil "quick file viewer for image and text file browsing" single]) @@ -1963,6 +1990,9 @@ (livescript-mode . [(0 0 1) nil "Major mode for LiveScript files in Emacs" single]) + (livecoder . + [(0 0 2) + nil "tools for live coders" single]) (list-utils . [(0 4 2) nil "List-manipulation utility functions" single]) @@ -1981,6 +2011,9 @@ (linum-off . [(0 1) nil "Provides an interface for turning line-numbering off" single]) + (linky-client . + [(0 0 2) + nil "a client for linky.elnode.org" single]) (lineno . [(0 1) nil "Alternate mode to display line numbers." single]) @@ -2075,6 +2108,9 @@ (kanban . [(0 1 2) nil "Parse org-todo headlines to use org-tables as Kanban tables" single]) + (jump-dls . + [(0 4) + nil "Jump to definition of symbol using various methods." single]) (jump-char . [(0 1) nil "navigation by char" single]) @@ -2171,6 +2207,9 @@ (isgd . [(20130927) nil "Shorten URLs using the isgd.com shortener service" single]) + (isearch-switch . + [(1 0) + nil "switch the manner you are isearching in." single]) (isea . [(0 0 2) ((elpakit @@ -2282,7 +2321,7 @@ (0 0 6))) "chainsaw powered logging" single]) (hungry-delete . - [(1 0) + [(1 1) nil "hungry delete minor mode" single]) (httpd . [(1 0 1) @@ -2305,6 +2344,11 @@ (ht . [(1 5) nil "The missing hash table library for Emacs" single]) + (how-many-lines-in-project . + [(0 3) + ((find-file-in-project + (3 3))) + "Calculate how many lines are there in your project." single]) (hook-utils . [(1 0) nil "Add a few utility functions for manipulating hooks" single]) @@ -2345,6 +2389,9 @@ (highlight-symbol . [(1 1) nil "automatic and manual symbol highlighting" single]) + (highlight-sexp . + [(1 0) + nil "highlight current zone according to its context" single]) (highlight-parentheses . [(1 0 1) nil "highlight surrounding parentheses" single]) @@ -2361,7 +2408,7 @@ [(21 0) nil "Highlighting commands." single]) (hideshowvis . - [(0 3) + [(0 5) nil "Add markers to the fringe for regions foldable by hideshow.el" single]) (hide-lines . [(20130623 1701) @@ -2488,6 +2535,9 @@ (graphviz-dot-mode . [(0 3 7) nil "Mode for the dot-language used by graphviz (att)." single]) + (grails-mode . + [(0 1) + nil "minor-mode that adds some Grails project management to a grails project" single]) (gplusify . [(1 0) nil "Add Google Plus markup to a piece of code" single]) @@ -2497,11 +2547,8 @@ (goto-chg . [(1 6) nil "goto last change" single]) - (gopher . - [(0 0 2) - nil "easily access and navigate Gopher servers" single]) (google-translate . - [(0 8 2) + [(0 10 4) nil "Emacs interface to Google Translate." tar]) (god-mode . [(2 12 0) @@ -2512,9 +2559,6 @@ (go-mode . [(20131222) nil "Major mode for the Go programming language" single]) - (gnusnotes . - [(0 91) - nil "Adding per-message notes in gnus summary buffer" single]) (gnus-summary-ext . [(0 1) ((macro-utils @@ -2557,6 +2601,11 @@ (git-gutter . [(0 42) nil "Port of Sublime Text plugin GitGutter" single]) + (git-draft . + [(0 0 2) + ((dash + (2 9 0))) + "draft git commit messages" single]) (git-commit-mode . [(0 13) nil "Major mode for editing git commit messages" single]) @@ -2618,6 +2667,9 @@ (gather . [(1 0 4) nil "Gather string in buffer." single]) + (garoon . + [(0 0 1) + nil "A Garoon client." single]) (gandalf-theme . [(0 1) nil "Gandalf color theme" single]) @@ -2853,13 +2905,9 @@ (0 6 0))) "Cask support in Flycheck" single]) (flycheck . - [(0 19) - ((s - (1 9 0)) - (dash + [(0 20) + ((dash (2 4 0)) - (f - (0 11 0)) (pkg-info (0 4)) (cl-lib @@ -2876,8 +2924,8 @@ [(0 1) nil "fuzzy matching with good sorting" single]) (flex-autopair . - [(0 1) - nil "Automatically insert pair braces and quotes, insertion condition & action are highly customizable." single]) + [(0 3) + nil "Automatically insert pair braces and quotes, insertion conditions & actions are highly customizable." single]) (flatland-theme . [(0 1 2) nil "A simple theme for Emacs." single]) @@ -2896,15 +2944,15 @@ (tabulated-list (0))) "Quickly navigate to FIXME notices in code" single]) + (fixme-mode . + [(1 0 2) + nil "fixme minor mode to highlight warning words" single]) (fit-frame . [(0) nil "Resize a frame. In particular, fit a frame to its buffers." single]) (fiplr . [(0 1 3) nil "Fuzzy finder for files in a project." single]) - (findr . - [(0 7) - nil "Breadth-first file-finding facility for (X)Emacs" single]) (find-things-fast . [(20111123) nil "An emacs mode to find things fast and move around in a project quickly" tar]) @@ -2914,9 +2962,6 @@ (find-file-in-project . [(3 3) nil "Find files in a project quickly." single]) - (find-file-in-git-repo . - [(0 1 2) - nil "Utility to find files in a git repo" single]) (finalize . [(1 0 0) ((emacs @@ -2929,6 +2974,11 @@ (fill-column-indicator . [(1 86) nil "Graphically indicate the fill column" single]) + (file-format . + [(0 0 4) + ((s + (1 5 0))) + "templates with files as the source" single]) (fic-ext-mode . [(0 1) nil "Show FIXME/TODO/BUG(...) in special face only in comments and strings" single]) @@ -2941,6 +2991,11 @@ (fancy-mode . [(0 1) nil "Major mode for programming with the Fancy language." single]) + (fancy-battery . + [(0 2) + ((emacs + (24 1))) + "Fancy battery display" single]) (fakir . [(0 1 9) ((noflet @@ -2957,6 +3012,11 @@ (dash (2 2 0))) "Modern API for working with files and directories" single]) + (eyebrowse . + [(0 3 2) + ((dash + (2 7 0))) + "Easy window config switching" single]) (extend-dnd . [(0 5) nil "R drag and Drop" single]) @@ -3035,7 +3095,7 @@ [(0 79) nil "Ess Smart Underscore" single]) (ess-R-object-popup . - [(0 0 4) + [(0 0 6) nil "popup description of R object" single]) (ess . [(5 14) @@ -3056,6 +3116,9 @@ (emacs (24))) "Window-management utilities" single]) + (ertx . + [(0 0 1) + nil "Extra useful testing functions for EmacsLisp." single]) (ert-x . [(0) ((ert @@ -3097,6 +3160,9 @@ (ctable (0 1 1))) "A RPC stack for the Emacs Lisp" single]) + (env-var-import . + [(2 1) + nil "Import shell environment variables in GUI Emacs" single]) (enclose . [(0 0 2) nil "Enclose cursor within punctuation pairs" single]) @@ -3109,7 +3175,7 @@ (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" single]) (emmet-mode . - [(1 0 5) + [(1 0 10) nil "Unofficial Emmet's support for emacs" single]) (emamux . [(0 1) @@ -3117,6 +3183,11 @@ (emacsd-tile . [(0 1) nil "tiling windows for emacs" single]) + (emacs-xkcd . + [(1 0) + ((json + (1 4))) + "View xkcd from Emacs" single]) (emacs-droid . [(0 0 0) nil "Android application development tools for Emacs" single]) @@ -3127,23 +3198,17 @@ [(1 4 6) nil "Screen for Emacsen" single]) (elpy . - [(1 4 1) - ((auto-complete - (1 4)) + [(1 5 1) + ((company + (0 8 2)) (find-file-in-project - (3 2)) - (fuzzy - (0 1)) + (3 3)) (highlight-indentation (0 5 0)) (idomenu (0 1)) - (iedit - (0 97)) - (nose - (0 1 1)) (pyvenv - (1 0)) + (1 3)) (yasnippet (0 8 0))) "Emacs Python Development Environment" tar]) @@ -3161,7 +3226,7 @@ [(0 4) nil "Handy functions for inspecting and comparing package archives" single]) (elnode . - [(0 9 9 8 5) + [(0 9 9 8 7) ((web (0 4 3)) (dash @@ -3183,7 +3248,7 @@ [(1 0 0) nil "Major mode for editing Elixir files" single]) (elixir-mix . - [(0 3 0) + [(1 0 0) nil "Emacs integration for Elixir's mix" single]) (elisp-slime-nav . [(0 7) @@ -3216,6 +3281,9 @@ (electric-case . [(2 2 1) nil "insert camelCase, snake_case words without \"Shift\"ing" single]) + (eldoro . + [(0 1 0) + nil "A pomodoro timer/tracker that works with org-mode." tar]) (el-x . [(0 3 0) ((cl-lib @@ -3373,27 +3441,27 @@ (discord . [(0 5) nil "Discordian dates for calendar" single]) + (dirtrack-buffer-name-track-mode . + [(1 0 0) + nil "minor mode to cause shell buffers to reflect the working directory" single]) (dired-single . [(1 7) nil "reuse the current dired buffer to visit another directory" single]) + (dired-nav-enhance . + [(1 0) + nil "Enhanced navigation for dired buffers" single]) (dired-efap . [(0 8) nil "Edit Filename At Point in a dired buffer" single]) (dired-dups . [(0 3) nil "Find duplicate files and display them in a dired buffer" single]) - (dired-details . - [(1 3 1) - nil "make file details hide-able in dired" single]) (dircmp . [(1) nil "Compare and sync directories." single]) (diminish . [(0 44) nil "Diminished modes are minor modes with no modeline display" single]) - (diatheke . - [(1 0) - nil "A minor mode using the diatheke command-line Bible tool" single]) (desktop-registry . [(1 2 0) nil "Keep a central registry of desktop files" single]) @@ -3406,11 +3474,11 @@ (1 287))) "Yet Another `describe-bindings' with `anything'." single]) (deft . - [(0 3) - nil "quickly browse, filter, and edit plain text notes" single]) + [(0 3) + nil "quickly browse, filter, and edit plain text notes" single]) (deferred . - [(0 3 1) - nil "Simple asynchronous functions for emacs lisp" single]) + [(0 3 1) + nil "Simple asynchronous functions for emacs lisp" single]) (deep-thought-theme . [(0 1 1) nil "Emacs 24 theme with the Answer to The Ultimate Question" single]) @@ -3433,14 +3501,14 @@ (0 0 11))) "A database for EmacsLisp" single]) (dash-functional . - [(1 1 0) + [(1 2 0) ((dash (2 0 0)) (emacs (24))) "Collection of useful combinators for Emacs Lisp" single]) (dash . - [(2 7 0) + [(2 9 0) nil "A modern list library for Emacs" single]) (dart-mode . [(0 9) @@ -3530,7 +3598,7 @@ (concurrent . [(0 3 1) ((deferred - (0 3 1))) + (0 3 1))) "Concurrent utility functions for emacs lisp" single]) (company-inf-ruby . [(0 2) @@ -3566,6 +3634,11 @@ (colour-region . [(0 4) nil "Toggle regions of the buffer with different text snippets" single]) + (color-theme-zenburn . + [(0 3) + ((color-theme + (6 6 1))) + "A low contrast color theme for Emacs." single]) (color-theme-x . [(1 3) nil "convert color themes to X11 resource settings" single]) @@ -3671,11 +3744,6 @@ ((color-theme (6 6 1))) "A dark color theme for GNU Emacs." single]) - (color-theme-active . - [(0 0 1) - ((color-theme - (6 6 1))) - "Active theme inspired by jEdit theme of the same name" single]) (color-theme . [(6 6 1) nil "install color themes" single]) @@ -3690,6 +3758,9 @@ (coffee-mode . [(0 3 0) nil "Major mode to edit CoffeeScript files in Emacs" single]) + (code-headers . + [(0 7) + nil "Navigate code with headers embedded in comments. -*- mode: Emacs-Lisp; lexical-binding: t; -*" single]) (cobra-mode . [(1 0 1) nil "Major mode for .NET-based Cobra language" single]) @@ -3706,8 +3777,10 @@ [(0 1 0) nil "Wrapper for CodeMirror-style Emacs modes" single]) (clues-theme . - [(20130720 559) - nil "Emacs 24 theme which is ok I suppose" single]) + [(20130908 801) + ((emacs + (24 0))) + "an Emacs 24 theme which may well be fully awesome..." single]) (cloud-to-butt-erc . [(1 0 0) nil "Replace 'the cloud' with 'my butt'" single]) @@ -3743,6 +3816,9 @@ (clojure-here . [(0 11) nil "Clojure process in a buffer" single]) + (clojure-env . + [(0 0 3) + nil "manage clojure environments with Emacs" single]) (cljsbuild-mode . [(0 2 0) nil "A minor mode for the ClojureScript 'lein cljsbuild' command" single]) @@ -3780,9 +3856,9 @@ [(0 0 2) nil "Major mode for editing Citrus files" single]) (circe . - [(1 3) + [(1 4) ((lui - (1 3)) + (1 4)) (lcs (1 1))) "Client for IRC in Emacs" tar]) @@ -3801,7 +3877,7 @@ [(0 2 2) nil "View CHM file." single]) (chicken-scheme . - [(1 1 0) + [(1 3 0) nil "Scheme-mode extensions for Chicken Scheme" single]) (charmap . [(0 0 1) @@ -3809,9 +3885,6 @@ (centered-cursor-mode . [(0 5 1) nil "cursor stays vertically centered" single]) - (center-text . - [(0 8) - nil "Center the text in a fixed-width column" single]) (cedit . [(0 0 0) nil "paredit-like commands for c-like languages" single]) @@ -3838,7 +3911,7 @@ (butler . [(0 2 0) ((deferred - (3 1)) + (3 1)) (json (1 2))) "Emacs client for Jenkins" tar]) @@ -3857,6 +3930,9 @@ (buffer-move . [(0 4) nil "swap buffers between windows" single]) + (buffer-file-utils . + [(1 0) + nil "utilities operating on a buffer and the associated file" single]) (bubbleberry-theme . [(0 1 2) ((emacs @@ -4014,6 +4090,9 @@ (anything-git . [(1 1 1) nil "Show git files in anything" single]) + (anything-exuberant-ctags . + [(0 1 2) + nil "Exuberant ctags anything.el interface" single]) (anything-extension . [(0 2) nil "Extension functions for anything.el" single]) @@ -4064,6 +4143,11 @@ (alpha . [(1 0) nil "increase frame transparency" single]) + (align-cljlet . + [(0 3) + ((clojure-mode + (1 11 5))) + "Space align various Clojure forms" single]) (alert . [(0 5 10) ((string-utils diff --git a/elpa/archives/melpa-stable/archive-contents b/elpa/archives/melpa-stable/archive-contents index c3c3913ff..d8e7cff01 100644 --- a/elpa/archives/melpa-stable/archive-contents +++ b/elpa/archives/melpa-stable/archive-contents @@ -1,2 +1,2 @@ -(1 (zygospore . [(0 0 3) nil "reversible C-x 1 (delete-other-windows)" single ((:url . "https://github.com/louiskottmann/zygospore.el"))]) (zenburn-theme . [(2 0) nil "A low contrast color theme for Emacs." single ((:url . "http://github.com/bbatsov/zenburn-emacs"))]) (yasnippet . [(0 8 0) nil "Yet another snippet extension for Emacs." tar ((:url . "http://github.com/capitaomorte/yasnippet") (:keywords "convenience" "emulation"))]) (yascroll . [(0 1) nil "Yet Another Scroll Bar Mode" single ((:keywords "convenience"))]) (yagist . [(0 8 9) ((json (1 2 0))) "Yet Another Emacs integration for gist.github.com" single ((:url . "https://github.com/mhayashi1120/yagist.el/raw/master/yagist.el") (:keywords "gist" "git" "github" "paste" "pastie" "pastebin"))]) (yafolding . [(0 1 4) nil "Yet another folding extension for Emacs" single ((:keywords "folding"))]) (xterm-color . [(1 0) nil "ANSI & XTERM 256 color support" single nil]) (xcscope . [(1 1) nil "cscope interface for (X)Emacs" single ((:url . "https://github.com/dkogan/xcscope.el") (:keywords "languages" "c"))]) (ws-butler . [(0 3) nil "Unobtrusively remove trailing whitespace." single ((:url . "https://github.com/lewang/ws-butler"))]) (writeroom-mode . [(2 5) nil "Minor mode for distraction-free writing" tar ((:keywords "text"))]) (writegood-mode . [(2 0) nil "Polish up poor writing on the fly" single ((:url . "http://github.com/bnbeckwith/writegood-mode") (:keywords "writing" "weasel-words" "grammar"))]) (wrap-region . [(0 7 3) ((dash (1 0 3))) "Wrap text with punctation or tag" single ((:url . "http://github.com/rejeep/wrap-region") (:keywords "speed" "convenience"))]) (wonderland . [(0 1 1) ((dash (2 0 0)) (dash-functional (1 0 0)) (multi (2 0 0)) (emacs (24))) "declarative configuration for Emacsen" single ((:url . "http://github.com/kurisuwhyte/emacs-wonderland") (:keywords "configuration" "profile" "wonderland"))]) (wispjs-mode . [(0 2 0) ((clojure-mode (0))) "Major mode for Wisp code." single ((:url . "https://github.com/krisajenkins/wispjs-mode"))]) (wisp-mode . [(0 6 1) nil "Tools for wisp: the Whitespace-to-Lisp preprocessor" single ((:keywords "languages" "lisp"))]) (window-numbering . [(1 1 2) nil "No description available." single nil]) (window-layout . [(1 2) nil "window layout manager" single ((:keywords "window" "layout"))]) (window-end-visible . [(0 1 0) nil "Find the last visible point in a window" single ((:url . "http://github.com/rolandwalker/window-end-visible") (:keywords "extensions"))]) (wiki-nav . [(1 0 0) ((button-lock (1 0 0)) (nav-flash (1 0 0))) "Simple file navigation using [[WikiStrings]]" single ((:url . "http://github.com/rolandwalker/button-lock") (:keywords "mouse" "button" "hypermedia" "navigation"))]) (whitespace-cleanup-mode . [(0 8) nil "Intelligently call whitespace-cleanup on save" single ((:url . "https://github.com/purcell/whitespace-cleanup-mode") (:keywords "convenience"))]) (weechat . [(0 2) ((s (1 3 1)) (cl-lib (0 2)) (emacs (24)) (tracking (1 2))) "Chat via WeeChat's relay protocol in Emacs" tar nil]) (wcheck-mode . [(2014 6 21) nil "General interface for text checkers" tar nil]) (wacspace . [(0 4 2) ((dash (1 2 0)) (cl-lib (0 2))) "The WACky WorkSPACE manager for emACS" tar nil]) (vlf . [(1 5) nil "View Large Files" tar ((:url . "https://github.com/m00natic/vlfi") (:keywords "large files" "utilities"))]) (vim-region . [(0 3 0) ((expand-region (20140127))) "Select region as vim" single ((:url . "https://github.com/ongaeshi/emacs-vim-region"))]) (vector-utils . [(0 1 2) nil "Vector-manipulation utility functions" single ((:url . "http://github.com/rolandwalker/vector-utils") (:keywords "extensions"))]) (vcomp . [(0 3 1) nil "compare version strings" single ((:url . "https://github.com/tarsius/vcomp") (:keywords "versions"))]) (utop . [(1 14) ((emacs (24))) "Universal toplevel for OCaml" single ((:url . "https://github.com/diml/utop") (:keywords "ocaml" "languages"))]) (use-package . [(20140601) ((bind-key (1 0)) (diminish (0 44))) "A use-package declaration for simplifying your .emacs" single ((:url . "https://github.com/jwiegley/use-package") (:keywords "dotemacs" "startup" "speed" "config" "package"))]) (unicode-whitespace . [(0 2 4) ((ucs-utils (0 7 6)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "teach whitespace-mode about fancy characters" single ((:url . "http://github.com/rolandwalker/unicode-whitespace") (:keywords "faces" "wp" "interface"))]) (unicode-progress-reporter . [(0 5 4) ((emacs (24 1 0)) (ucs-utils (0 7 6)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Progress-reporter with fancy characters" single ((:url . "http://github.com/rolandwalker/unicode-progress-reporter") (:keywords "interface"))]) (unicode-fonts . [(0 4 2) ((font-utils (0 7 2)) (ucs-utils (0 8 0)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Configure Unicode fonts" single ((:url . "http://github.com/rolandwalker/unicode-fonts") (:keywords "i18n" "faces" "frames" "wp" "interface"))]) (unicode-enbox . [(0 1 4) ((string-utils (0 3 2)) (ucs-utils (0 7 6)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Surround a string with box-drawing characters" single ((:url . "http://github.com/rolandwalker/unicode-enbox") (:keywords "extensions" "interface"))]) (unfill . [(0 1) nil "The inverse of fill-paragraph and fill-region" single ((:keywords "utilities"))]) (underwater-theme . [(1 1 0) nil "A gentle, deep blue color theme" single ((:keywords "faces"))]) (ucs-utils . [(0 8 0) ((persistent-soft (0 8 8)) (pcache (0 2 3)) (list-utils (0 4 2))) "Utilities for Unicode characters" tar ((:url . "http://github.com/rolandwalker/ucs-utils") (:keywords "i18n" "extensions"))]) (typo . [(1 1) nil "Minor mode for typographic editing" single ((:url . "https://github.com/jorgenschaefer/typoel") (:keywords "convenience" "wp"))]) (twittering-mode . [(2 0 0) nil "Major mode for Twitter" single ((:url . "http://twmode.sf.net/") (:keywords "twitter" "web"))]) (twilight-anti-bright-theme . [(0 1 1) nil "A soothing Emacs 24 light-on-dark theme" single ((:url . "https://github.com/jimeh/twilight-anti-bright-theme.el") (:keywords "themes"))]) (tup-mode . [(1 3 1) nil "Major mode for editing files for Tup" single ((:url . "https://github.com/ejmr/tup-mode"))]) (tumble . [(1 5) nil "an Tumblr mode for Emacs" single ((:keywords "tumblr"))]) (tuareg . [(2 0 8) ((caml (3 12 0 1))) "OCaml mode for Emacs." tar ((:url . "http://forge.ocamlcore.org/projects/tuareg/") (:keywords "ocaml" "languages"))]) (ttrss . [(1 7 5) ((emacs (23 1))) "Tiny Tiny RSS elisp bindings" single ((:url . "https://github.com/pedros/ttrss.el") (:keywords "news" "local"))]) (truthy . [(0 2 8) ((list-utils (0 4 2))) "Test the content of a value" single ((:url . "http://github.com/rolandwalker/truthy") (:keywords "extensions"))]) (traad . [(0 4) nil "emacs interface to the traad refactoring server." single ((:url . "https://github.com/abingham/traad"))]) (thrift . [(0 9 1) nil "No description available." single nil]) (theme-changer . [(2 1 0) nil "Sunrise/Sunset Theme Changer for Emacs" single ((:url . "https://github.com/hadronzoo/theme-changer") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset"))]) (textmate-to-yas . [(0 21) nil "Import Textmate macros into yasnippet syntax" tar ((:url . "https://github.com/mlf176f2/textmate-to-yas.el/") (:keywords "yasnippet" "textmate"))]) (textmate . [(1) nil "No description available." single nil]) (test-case-mode . [(0 1 9) nil "unit test front-end" single ((:url . "http://nschum.de/src/emacs/test-case-mode/") (:keywords "tools"))]) (terraform-mode . [(0 1) ((cl-lib (0 5))) "Major mode for terraform configuration file" single ((:url . "https://github.com/syohex/emacs-terraform-mode"))]) (tern-auto-complete . [(0 6 2) ((tern (0 0 1)) (auto-complete (1 4)) (cl-lib (0 5)) (emacs (24))) "Tern Completion by auto-complete.el" single nil]) (tern . [(0 6 2) ((json (1 2)) (cl-lib (0 5)) (emacs (24))) "Tern-powered JavaScript integration" single ((:url . "http://ternjs.net/"))]) (tempbuf . [(1 4) nil "kill unused buffers in the background" single ((:keywords "convenience"))]) (tagedit . [(1 4 0) ((s (1 3 1)) (dash (1 0 3))) "Some paredit-like features for html-mode" single ((:keywords "convenience"))]) (tabbar-ruler . [(0 40) ((tabbar (2 0 1))) "Pretty tabbar, autohide, use both tabbar/ruler" tar ((:url . "http://github.com/mlf176f2/tabbar-ruler.el") (:keywords "tabbar" "ruler mode" "menu" "tool bar."))]) (syntactic-sugar . [(0 9 4) nil "Effect-free forms such as if/then/else" single ((:url . "http://github.com/rolandwalker/syntactic-sugar") (:keywords "extensions"))]) (swift-mode . [(0 2 0) ((emacs (24 1))) "Major-mode for Apple's Swift programming language." single nil]) (svg-mode-line-themes . [(0 1 1) ((xmlgen (0 4))) "SVG-based themes for mode-line" tar ((:url . "https://github.com/sabof/svg-mode-line-themes"))]) (suomalainen-kalenteri . [(2014 6 15) nil "Finnish national and Christian holidays for calendar" tar nil]) (sudden-death . [(0 2) nil "Totsuzen-no-Shi" single ((:url . "https://github.com/yewton/sudden-death.el"))]) (subshell-proc . [(0 1) nil "Functions for working with comints" single ((:url . "https://github.com/andrewmains12/subshell-proc"))]) (stumpwm-mode . [(0 9 8) nil "special lisp mode for evaluating code into running stumpwm" single ((:keywords "comm" "lisp" "tools"))]) (stripe-buffer . [(0 2 2) ((cl-lib (1 0))) "Use a different background for even and odd lines" single ((:url . "https://github.com/sabof/stripe-buffer"))]) (string-utils . [(0 3 2) ((list-utils (0 4 2))) "String-manipulation utilities" single ((:url . "http://github.com/rolandwalker/string-utils") (:keywords "extensions"))]) (string-edit . [(0 1 0) ((dash (1 2 0))) "Avoid escape nightmares by editing string in separate buffer" single nil]) (stgit . [(0 17 1) nil "No description available." single nil]) (stekene-theme . [(1 0 8) ((emacs (24))) "The stekene dark and light color themes." tar nil]) (starter-kit-ruby . [(2 0 3) ((inf-ruby (2 2 1)) (starter-kit (2 0 1))) "Saner defaults and goodies for Ruby" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-perl . [(2 0 3) nil "Some helpful Perl code" single nil]) (starter-kit-lisp . [(2 0 3) ((starter-kit (2 0 2)) (elisp-slime-nav (0 1))) "Saner defaults and goodies for lisp languages" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-js . [(2 0 3) ((starter-kit (2 0 1))) "Saner defaults and goodies for Javascript" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-eshell . [(2 0 3) nil "Saner defaults and goodies: eshell tweaks" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-bindings . [(2 0 3) ((starter-kit (2 0 2))) "Saner defaults and goodies: bindings" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit . [(2 0 3) ((paredit (22)) (idle-highlight-mode (1 1 1)) (find-file-in-project (3 0)) (smex (1 1 1)) (ido-ubiquitous (0 3)) (magit (0 8 1))) "Saner defaults and goodies." tar nil]) (stan-snippets . [(2 4 1) ((yasnippet (0 8 0)) (stan-mode (2 4 1))) "Yasnippets for Stan" tar ((:url . "http://github.com/stan-dev/stan-mode") (:keywords "languages"))]) (stan-mode . [(2 4 1) nil "Major mode for editing Stan files" tar ((:url . "http://github.com/stan-dev/stan-mode") (:keywords "languanges"))]) (sprintly-mode . [(0 0 4) ((furl (0 0 2))) "Major mode for dealing with sprint.ly" single ((:url . "https://github.com/sprintly/sprintly-mode"))]) (sparql-mode . [(0 9 2) nil "Edit and interactively evaluate SPARQL queries." tar ((:url . "https://github.com/ljos/sparql-mode"))]) (sourcemap . [(0 1) ((cl-lib (0 5)) (emacs (24))) "Sourcemap parser" single ((:url . "https://github.com/syohex/emacs-sourcemap"))]) (solarized-theme . [(1 1 0) ((dash (2 6 0))) "The Solarized color theme, ported to Emacs." tar nil]) (smex . [(3 0) nil "M-x interface with Ido-style fuzzy matching." single ((:url . "http://github.com/nonsequitur/smex/") (:keywords "convenience" "usability"))]) (smeargle . [(0 1) ((cl-lib (0 5)) (emacs (24))) "Highlighting region by last updated time" single ((:url . "https://github.com/syohex/emacs-smeargle"))]) (smartscan . [(0 2) nil "Jumps between other symbols found at point" single ((:keywords "extensions"))]) (smartrep . [(0 0 3) nil "Support sequential operation which omitted prefix keys." single ((:url . "https://github.com/myuhe/smartrep.el") (:keywords "convenience"))]) (smart-tabs-mode . [(1 0) nil "Intelligently indent with tabs, align with spaces!" single ((:url . "http://www.emacswiki.org/emacs/SmartTabs") (:keywords "languages"))]) (smart-mode-line . [(2 5 3) ((emacs (24 3)) (dash (2 2 0))) "A color coded smart mode-line." tar ((:url . "http://github.com/Bruce-Connor/smart-mode-line") (:keywords "mode-line" "faces" "theme" "themes"))]) (slime-volleyball . [(1 1) nil "An SVG Slime Volleyball Game" tar ((:keywords "games"))]) (slime-ritz . [(0 6 0) nil "slime extensions for ritz" single ((:url . "https://github.com/pallet/ritz") (:keywords "languages" "lisp" "slime"))]) (slime-company . [(0 6) ((slime (2 3 2)) (company (0 7))) "slime completion backend for company mode" single ((:keywords "convenience" "lisp" "abbrev"))]) (slime . [(2 9) ((cl-lib (0 5))) "Superior Lisp Interaction Mode for Emacs" tar ((:url . "https://github.com/slime/slime") (:keywords "languages" "lisp" "slime"))]) (slim-mode . [(1 1) nil "Major mode for editing Slim files" single ((:url . "http://github.com/minad/emacs-slim") (:keywords "markup" "language"))]) (slamhound . [(1 5 4) nil "Rip Clojure namespaces apart and rebuild them." single ((:url . "https://github.com/technomancy/slamhound") (:keywords "tools" "lisp"))]) (skewer-mode . [(1 6 1) ((simple-httpd (1 4 0)) (js2-mode (20090723)) (emacs (24))) "live browser JavaScript, CSS, and HTML interaction" tar nil]) (skewer-less . [(0 2) ((skewer-mode (1 5 3))) "Skewer support for live LESS stylesheet updates" single ((:keywords "languages" "tools"))]) (skeletor . [(1 4) ((s (1 7 0)) (f (0 14 0)) (dash (2 2 0)) (cl-lib (0 3)) (emacs (24 1))) "Provides project skeletons for Emacs" tar nil]) (simplezen . [(0 1 1) nil "A simple subset of zencoding-mode for Emacs." single nil]) (simpleclip . [(1 0 0) nil "Simplified access to the system clipboard" single ((:url . "http://github.com/rolandwalker/simpleclip") (:keywords "convenience"))]) (simple-httpd . [(1 4 5) ((cl-lib (0 3))) "pure elisp HTTP server" single ((:url . "https://github.com/skeeto/emacs-http-server"))]) (shut-up . [(0 3 1) ((cl-lib (0 3)) (emacs (24))) "Shut up would you!" single ((:url . "http://github.com/rejeep/shut-up.el"))]) (shm . [(1 0 1) nil "No description available." tar nil]) (shell-pop . [(0 3) nil "helps you to use shell easily on Emacs. Only one key action to work." single ((:url . "http://github.com/kyagi/shell-pop-el") (:keywords "shell" "terminal" "tools"))]) (shampoo . [(0 0 1) nil "Shampoo, a remote Smalltalk developemnt" tar nil]) (session . [(2 3 1) nil "use variables, registers and buffer places across sessions" single ((:url . "http://emacs-session.sourceforge.net/") (:keywords "session" "session management" "desktop" "data" "tools"))]) (serverspec . [(0 0 4) ((dash (2 6 0)) (s (1 9 0)) (f (0 16 2)) (helm (1 6 1))) "Serverspec minor mode" tar ((:url . "http://101000lab.org"))]) (servant . [(0 3 0) ((s (1 8 0)) (dash (2 2 0)) (f (0 11 0)) (ansi (0 3 0)) (commander (0 5 0)) (epl (0 2)) (shut-up (0 2 1)) (web-server (0 0 1))) "ELPA server written in Emacs Lisp" tar ((:url . "http://github.com/rejeep/servant.el") (:keywords "elpa" "server"))]) (sekka . [(1 5 5) nil "No description available." single nil]) (scss-mode . [(0 5 0) nil "Major mode for editing SCSS files" single ((:url . "https://github.com/antonj/scss-mode") (:keywords "scss" "css" "mode"))]) (scheme-here . [(0 6) nil "cmuscheme extension for multiple inferior processes" single ((:url . "https://github.com/zhaov/scheme-here") (:keywords "scheme"))]) (scala-mode . [(2 11 2) nil "Major mode for editing Scala code." tar ((:keywords "scala" "languages" "oop"))]) (save-sexp . [(0 2 0) nil "save variables in files using setter forms like `setq'" tar ((:url . "https://github.com/tarsius/save-sexp") (:keywords "convenience"))]) (sauron . [(0 10) nil "Track (erc/org/dbus/...) events and react to them." tar nil]) (sackspace . [(0 8 2) nil "A better backspace" single ((:url . "http://github.com/cofi/sackspace.el") (:keywords "delete" "convenience"))]) (s . [(1 9 0) nil "The long lost Emacs string manipulation library." single ((:keywords "strings"))]) (rvm . [(1 3 0) nil "Emacs integration for rvm" single ((:url . "http://www.emacswiki.org/emacs/RvmEl") (:keywords "ruby" "rvm"))]) (rust-mode . [(0 11 0) nil "A major emacs mode for editing Rust source code" single ((:url . "https://github.com/rust-lang/rust") (:keywords "languages"))]) (ruby-tools . [(0 1 2) nil "Collection of handy functions for ruby-mode." tar nil]) (ruby-test-mode . [(1 0) nil "Minor mode for Behaviour and Test Driven" single ((:keywords "ruby" "unit" "test" "rspec"))]) (ruby-hash-syntax . [(0 3) nil "Toggle ruby hash syntax between classic and 1.9 styles" single ((:url . "https://github.com/purcell/ruby-hash-syntax") (:keywords "languages"))]) (ruby-end . [(0 4 0) nil "Automatic insertion of end blocks for Ruby" single ((:url . "http://github.com/rejeep/ruby-end") (:keywords "speed" "convenience" "ruby"))]) (ruby-compilation . [(2 10) ((inf-ruby (2 2 1))) "run a ruby process in a compilation buffer" single ((:url . "https://github.com/eschulte/rinari") (:keywords "test" "convenience"))]) (rtags . [(1 1) nil "No description available." tar nil]) (rsense . [(0 3) nil "RSense client for Emacs" single ((:keywords "convenience"))]) (roguel-ike . [(0 1) ((popup (0 5 0))) "A coffee-break roguelike" tar nil]) (rnc-mode . [(1 0 6) nil "A major mode for editing RELAX NG Compact syntax." single nil]) (rinari . [(2 10) ((ruby-mode (1 0)) (inf-ruby (2 2 1)) (ruby-compilation (0 8)) (jump (2 0))) "Rinari Is Not A Rails IDE" single ((:url . "https://github.com/eschulte/rinari") (:keywords "ruby" "rails" "project" "convenience" "web"))]) (reveal-in-finder . [(0 3 1) nil "Reveal the file associated with the buffer in the OS X Finder" single ((:url . "https://github.com/kaz-yos/elisp") (:keywords "os x" "finder"))]) (request-deferred . [(0 1 0) nil "Wrap request.el by deferred" single nil]) (request . [(0 1 0) nil "Compatible layer for URL request in Emacs" single nil]) (req-package . [(0 5) ((use-package (1 0)) (dash (2 7 0)) (log4e (0 2 0))) "A use-package wrapper for package runtime dependencies management" single ((:url . "https://github.com/edvorg/req-package") (:keywords "dotemacs" "startup" "speed" "config" "package"))]) (relax . [(0 2) ((json (1 2))) "For browsing and interacting with CouchDB" single ((:url . "http://github.com/technomancy/relax.el") (:keywords "database" "http"))]) (relative-line-numbers . [(0 2 6) ((emacs (24))) "Display relative line numbers on the margin" single ((:url . "https://github.com/Fanael/relative-line-numbers"))]) (rbenv . [(0 0 3) nil "Emacs integration for rbenv" single ((:url . "https://github.com/senny/rbenv.el") (:keywords "ruby" "rbenv"))]) (rase . [(1 1) nil "Run At Sun Event daemon" single ((:url . "https://github.com/m00natic/rase/") (:keywords "solar" "sunrise" "sunset" "midday" "midnight"))]) (rainbow-identifiers . [(0 2 1) ((emacs (24))) "Highlight identifiers according to their names" single ((:url . "https://github.com/Fanael/rainbow-identifiers"))]) (rainbow-delimiters . [(1 3 7) nil "Highlight nested parens, brackets, braces a different color at each depth." single ((:url . "http://github.com/jlr/rainbow-delimiters/raw/master/rainbow-delimiters.el") (:keywords "faces" "convenience" "lisp" "matching" "tools" "rainbow" "rainbow parentheses" "rainbow parens"))]) (r-autoyas . [(0 28) nil "Provides automatically created yasnippets for R function argument lists." tar ((:url . "https://github.com/mlf176f2/r-autoyas.el") (:keywords "r" "yasnippet"))]) (quickrun . [(2 0 6) nil "Run commands quickly" single ((:url . "https://github.com/syohex/emacs-quickrun"))]) (qml-mode . [(0 1) nil "Major mode for editing QT Declarative (QML) code." single ((:url . "https://github.com/coldnew/qml-mode") (:keywords "qml" "qt" "qt declarative"))]) (qiita . [(0 0 1) nil "No description available." single nil]) (pyvenv . [(1 3) nil "Python virtual environment interface" single ((:url . "http://github.com/jorgenschaefer/pyvenv") (:keywords "python" "virtualenv" "tools"))]) (python-environment . [(0 0 1) ((deferred (0 3 1))) "virtualenv API for Emacs Lisp" tar ((:keywords "applications" "tools"))]) (pushbullet . [(0 5 2) ((grapnel (0 5 2)) (json (1 2))) "Emacs client for the PushBullet Android app" single ((:url . "http://www.github.com/theanalyst/revolver") (:keywords "convenience"))]) (puppet-mode . [(0 3) ((emacs (24 1)) (cl-lib (0 5)) (pkg-info (0 4))) "Major mode for Puppet manifests" single ((:url . "https://github.com/lunaryorn/puppet-mode") (:keywords "languages"))]) (pungi . [(0 9 5) ((jedi (0 2 0 -3 2))) "Integrates jedi with virtualenv and buildout python environments" single ((:keywords "convenience"))]) (projectile . [(0 11 0) ((s (1 6 0)) (dash (1 5 0)) (pkg-info (0 4))) "Manage and navigate projects in Emacs easily" single ((:url . "https://github.com/bbatsov/projectile") (:keywords "project" "convenience"))]) (project-root . [(0 7) nil "Define a project root and take actions based upon it." single nil]) (project-persist . [(0 3) nil "A minor mode to allow loading and saving of project settings." tar nil]) (project-explorer . [(0 13 4) ((cl-lib (0 3)) (es-lib (0 3)) (es-windows (0 1)) (emacs (24))) "A project explorer sidebar" single ((:url . "https://github.com/sabof/project-explorer"))]) (prodigy . [(0 6 0) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (emacs (24))) "Manage external services from within Emacs" single ((:url . "http://github.com/rejeep/prodigy.el"))]) (processing-mode . [(1 0) ((yasnippet (0 8 0))) "Major mode for Processing 2.0" single ((:keywords "languages" "snippets"))]) (pretty-mode . [(2 0 2) nil "Redisplay parts of the buffer as pretty symbols." single ((:url . "https://github.com/akatov/pretty-mode") (:keywords "pretty" "unicode" "symbols"))]) (powerline . [(2 2) ((cl-lib (0 2))) "Rewrite of Powerline" tar ((:url . "http://github.com/milkypostman/powerline/") (:keywords "mode-line"))]) (pov-mode . [(3 3) nil "Major mode for editing POV-Ray scene files." tar nil]) (popwin . [(0 6 2) nil "Popup Window Manager." single ((:keywords "convenience"))]) (popup . [(0 5 0) ((cl-lib (0 3))) "Visual Popup User Interface" single ((:keywords "lisp"))]) (plenv . [(0 32) nil "A plenv wrapper for Emacs" single ((:keywords "emacs" "perl"))]) (pkgbuild-mode . [(0 11) nil "Interface to the ArchLinux package manager" single nil]) (pkg-info . [(0 5) ((dash (1 6 0)) (epl (0 4))) "Information about packages" single ((:url . "https://github.com/lunaryorn/pkg-info.el") (:keywords "convenience"))]) (phpunit . [(0 2 0) nil "Launch PHP unit tests using phpunit" single ((:url . "https://github.com/nlamirault/phpunit.el") (:keywords "php" "tests" "phpunit"))]) (php-mode . [(1 13 5) nil "Major mode for editing PHP code" single ((:url . "https://github.com/ejmr/php-mode"))]) (php-auto-yasnippets . [(2 3 1) ((php-mode (1 11)) (yasnippet (0 8 0))) "Creates snippets for PHP functions" tar ((:url . "https://github.com/ejmr/php-auto-yasnippets"))]) (phi-search-mc . [(2 1) ((phi-search (2 0 0)) (multiple-cursors (1 2 1))) "multiple-cursors extension for phi-search" single ((:url . "https://github.com/knu/phi-search-mc.el") (:keywords "search" "cursors"))]) (ph . [(0 1 0) ((emacs (24 3))) "A global minor mode for managing multiple projects." tar nil]) (perspective . [(1 9) nil "switch between named \"perspectives\" of the editor" single ((:url . "http://github.com/nex3/perspective-el") (:keywords "workspace" "convenience" "frames"))]) (persp-projectile . [(0 11 0) ((perspective (1 9)) (projectile (0 11 0)) (cl-lib (0 3))) "Perspective integration with Projectile" single ((:keywords "project" "convenience"))]) (persp-mode . [(0 9 98) ((workgroups (0 2 0))) "\"perspectives\" + save/load + shared among frames." single ((:url . "https://github.com/Bad-ptr/persp-mode.el") (:keywords "perspectives"))]) (persistent-soft . [(0 8 8) ((pcache (0 2 3)) (list-utils (0 4 2))) "Persistent storage, returning nil on failure" single ((:url . "http://github.com/rolandwalker/persistent-soft") (:keywords "data" "extensions"))]) (pcache . [(0 2 4) ((eieio (1 3))) "persistent caching for Emacs" single nil]) (pastehub . [(0 5 2) nil "A client for the PasteHub cloud service" single ((:url . "https://github.com/kiyoka/pastehub"))]) (paste-kde . [(0 6) ((web (0 3 6))) "paste text to KDE's pastebin service" single ((:keywords "comm" "convenience" "tools"))]) (password-store . [(1 6 3) ((dash (1 5 0)) (f (0 11 0)) (s (1 9 0))) "Password store (pass) support" single ((:keywords "pass"))]) (passthword . [(1 3) ((cl-lib (0 5))) "Simple password manager" single nil]) (parent-mode . [(2 0) ((emacs (24))) "get major mode's parent modes" single ((:url . "https://github.com/Fanael/parent-mode"))]) (parenface . [(1 1) nil "Provide a face for parens in lisp modes." single]) (paren-face . [(0 1 0) nil "a face for parentheses in lisp modes" single ((:url . "http://github.com/tarsius/paren-face"))]) (paredit-everywhere . [(0 4) ((paredit (22))) "Enable some paredit features in non-lisp buffers" single ((:keywords "languages" "convenience"))]) (paredit . [(23) nil "minor mode for editing parentheses" single ((:keywords "lisp"))]) (paradox . [(1 0 2) ((emacs (24 1)) (tabulated-list (1 0)) (package (1 0)) (dash (2 6 0)) (cl-lib (1 0)) (json (1 3))) "A modern Packages Menu. Colored, with package ratings, and customizable." tar ((:url . "http://github.com/Bruce-Connor/paradox") (:keywords "package" "packages" "mode-line"))]) (pangu-spacing . [(0 4) nil "Minor-mode to add space between Chinese and English characters." single ((:url . "http://github.com/coldnew/pangu-spacing"))]) (pandoc-mode . [(2 5 4) nil "Minor mode for interacting with Pandoc" tar ((:keywords "text" "pandoc"))]) (pallet . [(0 6) ((cask (0 6))) "A package management tool for Emacs, using Cask." tar nil]) (page-break-lines . [(0 9) nil "Display ugly ^L page breaks as tidy horizontal lines" single ((:url . "https://github.com/purcell/page-break-lines") (:keywords "convenience" "faces"))]) (packed . [(0 3 4) ((cl-lib (0 2)) (magit (1 1 1))) "Package manager agnostic Emacs Lisp package utilities" tar nil]) (outshine . [(1 0) nil "No description available." single nil]) (outorg . [(1 0) nil "No description available." single nil]) (osx-plist . [(1 0 0) nil "Apple plist file parser" single ((:keywords "convenience"))]) (osx-location . [(0 1) nil "Watch and respond to changes in geographical location on OS X" tar nil]) (osx-browse . [(0 8 8) ((string-utils (0 3 2)) (browse-url-dwim (0 6 6))) "Web browsing helpers for OS X" single ((:url . "http://github.com/rolandwalker/osx-browse") (:keywords "hypermedia" "external"))]) (orglink . [(0 2 1) ((dash (1 3 2)) (org (8 0))) "use Org Mode links in other modes" single ((:url . "http://github.com/tarsius/orglink") (:keywords "hypertext"))]) (orgbox . [(0 5 0) ((org (8 0)) (cl-lib (0 5))) "Mailbox-like task scheduling Org." single ((:url . "https://github.com/yasuhito/orgbox") (:keywords "org"))]) (org-trello . [(0 4 8) ((db (0 0 6)) (s (1 7 0)) (esxml (0 3 0)) (elnode (0 9 9 7 6)) (request (0 2 0)) (dash (2 5 0))) "Minor mode to synchronize org-mode buffer and trello board" tar nil]) (org-toodledo . [(2 16) nil "Toodledo integration for Emacs Org mode" tar ((:keywords "outlines" "data"))]) (org-readme . [(20130322 926) ((http-post-simple (1 0)) (yaoddmuse (0 1 1)) (header2 (21 0)) (lib-requires (21 0))) "Integrates Readme.org and Commentary/Change-logs." tar ((:url . "https://github.com/mlf176f2/org-readme") (:keywords "header2" "readme.org" "emacswiki" "git"))]) (org-protocol-jekyll . [(0 1) nil "Jekyll's handler for org-protocol" single nil]) (org-pomodoro . [(1 3 1) ((alert (0 5 10))) "Pomodoro implementation for org-mode." tar nil]) (org-page . [(0 41) ((ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8))) "a static site generator based on org mode" tar nil]) (org-outlook . [(0 11) nil "Outlook org" tar ((:url . "https://github.com/mlf176f2/org-outlook.el") (:keywords "org-outlook"))]) (org-magit . [(0 2 0) ((magit (0 8)) (org (6 1))) "basic support for magit links" single ((:keywords "git" "magit" "outlines"))]) (org-mac-iCal . [(7 9 3 5) nil "Imports events from iCal.app to the Emacs diary" single ((:keywords "outlines" "calendar"))]) (org-journal . [(1 5 2) nil "a simple org-mode based journaling mode" single ((:url . "http://github.com/bastibe/emacs-journal"))]) (org-elisp-help . [(0 1 0) ((cl-lib (0 2)) (org (8 0))) "org links to emacs-lisp documentation" single ((:url . "http://tarsius.github.com/org-elisp-help") (:keywords "org" "remember" "lisp"))]) (org-bullets . [(0 2 2) nil "Show bullets in org-mode as UTF-8 characters" single ((:url . "https://github.com/sabof/org-bullets"))]) (org-agenda-property . [(1 3 1) ((emacs (24 2))) "Display org properties in the agenda buffer." single ((:url . "http://github.com/Bruce-Connor/org-agenda-property") (:keywords "calendar"))]) (operate-on-number . [(1 1 0) nil "Operate on number at point with arithmetic functions" single ((:url . "https://github.com/knu/operate-on-number.el") (:keywords "editing"))]) (octomacs . [(0 0 1) nil "Octopress interface for Emacs" single ((:url . "http://technosorcery.net"))]) (object-registry . [(1 2 0) ((cl-lib (0 2))) "track data items by various instance slots" single ((:url . "https://github.com/tarsius/object-registry") (:keywords "data" "oo"))]) (ob-translate . [(0 1 2) ((google-translate (0 4)) (org (8))) "Translation of text blocks in org-mode." single ((:url . "https://github.com/krisajenkins/ob-translate") (:keywords "org" "babel" "translate" "translation"))]) (ob-sml . [(0 2) ((sml-mode (6 4))) "org-babel functions for template evaluation" single ((:url . "http://orgmode.org") (:keywords "literate programming" "reproducible research"))]) (o-blog . [(2 0) nil "" tar ((:keywords "emacs"))]) (nvm . [(0 0 3) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0))) "Manage Node versions within Emacs" single ((:url . "http://github.com/rejeep/nvm.el") (:keywords "node" "nvm"))]) (nsis-mode . [(0 44) nil "NSIS-mode" tar ((:url . "http://github.com/mlf176f2/nsis-mode") (:keywords "nsis"))]) (nrepl-sync . [(0 3 1) ((cider (0 6))) "connect to nrepl port and eval .sync.clj." single ((:url . "https://github.com/phillord/lein-sync"))]) (nrepl-ritz . [(0 6 0) ((nrepl (0 1 5))) "nrepl extensions for ritz" single ((:url . "https://github.com/pallet/ritz") (:keywords "languages" "lisp" "nrepl"))]) (notmuch . [(0 18 1) nil "No description available." tar nil]) (nose . [(0 1 1) nil "Easy Python test running in Emacs" single ((:keywords "nose" "python" "testing"))]) (nodejs-repl . [(0 0 2) nil "Run Node.js REPL" single nil]) (nix-mode . [(1 7) nil "No description available." single nil]) (ninja-mode . [(1 5 1) nil "Major mode for editing .ninja files" single nil]) (neotree . [(0 2) nil "A emacs tree plugin like NerdTree for Vim" single ((:url . "https://github.com/jaypei/emacs-neotree"))]) (nemerle . [(1 2) nil "major mode for editing nemerle programs" single ((:keywords "nemerle" "mode" "languages"))]) (ncl-mode . [(0 98) nil "No description available." tar nil]) (navorski . [(0 2 3) ((dash (1 5 0)) (multi-term (0 8 14))) "Helping you live in the terminal, like Viktor did." single ((:keywords "terminal"))]) (navi-mode . [(1 0) nil "No description available." single nil]) (nav-flash . [(1 1 0) nil "Briefly highlight the current line" single ((:url . "http://github.com/rolandwalker/nav-flash") (:keywords "extensions" "navigation" "interface"))]) (mykie . [(0 2 1) nil "Command multiplexer: Register multiple functions to a keybind" tar ((:url . "https://github.com/yuutayamada/mykie-el") (:keywords "emacs" "configuration" "keybind"))]) (multiple-cursors . [(1 3 0) nil "Multiple cursors for Emacs." tar nil]) (multi-web-mode . [(0 2 1) nil "multiple major mode support for web editing" tar ((:keywords "convenience" "languages" "wp"))]) (multi . [(2 0 1) ((emacs (24))) "Clojure-style multi-methods for emacs lisp" single ((:url . "http://github.com/kurisuwhyte/emacs-multi") (:keywords "multimethod" "generic" "predicate" "dispatch"))]) (moz . [(1 1 0) nil "Lets current buffer interact with inferior mozilla." single ((:url . "http://github.com/bard/mozrepl/raw/master/chrome/content/moz.el"))]) (move-dup . [(0 2 1) nil "Eclipse-like moving and duplicating lines or rectangles." single ((:keywords "convenience" "wp"))]) (morlock . [(0 4 0) nil "more font-lock keywords for elisp" single ((:url . "http://github.com/tarsius/morlock") (:keywords "convenience"))]) (mode-line-debug . [(1 2 1) nil "show status of `debug-on-error' in the mode-line" single ((:url . "https://github.com/tarsius/mode-line-debug") (:keywords "convenience" "lisp"))]) (mode-icons . [(0 1 0) nil "Show icons for modes" tar ((:url . "http://ryuslash.org/projects/mode-icons.html") (:keywords "multimedia"))]) (mocker . [(0 3 0) ((eieio (1 3)) (el-x (0 2 4))) "mocking framework for emacs" single ((:keywords "lisp" "testing"))]) (mmm-mode . [(0 5 1) nil "Allow Multiple Major Modes in a buffer" tar ((:url . "https://github.com/purcell/mmm-mode") (:keywords "convenience" "faces" "languages" "tools"))]) (mmm-mako . [(1 1) ((mmm-mode (0 4 8))) "MMM submode class for Mako Templates" single ((:url . "https://bitbucket.org/pjenvey/mmm-mako"))]) (minimal-session-saver . [(0 6 2) nil "Very lean session saver" single ((:url . "http://github.com/rolandwalker/minimal-session-saver") (:keywords "tools" "frames" "project"))]) (miniedit . [(2 0) nil "Enhanced editing for minibuffer fields." single nil]) (minibuffer-cua . [(1 0 0) nil "Make CUA mode's S-up/S-down work in minibuffer" single ((:url . "https://github.com/knu/minibuffer-cua.el") (:keywords "completion" "editing"))]) (minibuffer-complete-cycle . [(1 25 20130814) nil "Cycle through the *Completions* buffer" single ((:url . "https://github.com/knu/minibuffer-complete-cycle") (:keywords "completion"))]) (milkode . [(0 3) nil "Command line search and direct jump with Milkode" tar ((:keywords "milkode" "search" "grep" "jump" "keyword"))]) (migemo . [(1 9 1) nil "Japanese incremental search through dynamic pattern expansion" single ((:url . "https://github.com/emacs-jp/migemo"))]) (mew . [(6 6) nil "Messaging in the Emacs World" tar nil]) (merlin . [(1 6) nil "Mode for Merlin, an assistant for OCaml." single ((:url . "http://github.com/the-lambda-church/merlin") (:keywords "ocaml" "languages"))]) (mentor . [(0 1) nil "Control rtorrent from GNU Emacs" tar ((:keywords "bittorrent" "rtorrent"))]) (mc-extras . [(1 0 3) ((multiple-cursors (1 2 1))) "Extra functions for multiple-cursors mode." tar ((:url . "https://github.com/knu/mc-extras.el") (:keywords "editing" "cursors"))]) (maxframe . [(0 5) nil "No description available." single nil]) (marmalade . [(0 0 4) ((furl (0 0 2))) "Elisp interface for the Emacs Lisp package server." single ((:url . "http://code.google.com/p/marmalade"))]) (markdown-toc . [(0 0 6) ((s (1 7 0)) (dash (2 5 0)) (markdown-mode (2 0))) "A simple TOC generator for markdown file" tar nil]) (markdown-mode . [(2 0) nil "Emacs Major mode for Markdown-formatted text files" single ((:url . "http://jblevins.org/projects/markdown-mode/") (:keywords "markdown" "github flavored markdown" "itex"))]) (mark-tools . [(0 3) nil "Some simple tools to access the mark-ring in Emacs" single ((:url . "https://github.com/stsquad/emacs-mark-tools"))]) (map-regexp . [(0 3 0) ((cl-lib (0 2))) "map over matches of a regular expression" single ((:url . "https://github.com/tarsius/map-regexp") (:keywords "convenience"))]) (map-progress . [(0 5 0) nil "mapping macros that report progress" single ((:url . "https://github.com/tarsius/map-progress/") (:keywords "convenience"))]) (mallard-mode . [(0 3 0) nil "Major mode for editing Mallard files" tar ((:url . "https://github.com/jhradilek/emacs-mallard-mode") (:keywords "xml" "mallard"))]) (malinka . [(0 2 0) ((s (1 9 0)) (dash (2 4 0)) (f (0 11 0)) (cl-lib (0 3)) (rtags (0 0)) (projectile (0 11 0))) "A C/C++ project configuration package for Emacs" single ((:url . "https://github.com/LefterisJP/malinka") (:keywords "c" "c++" "project-management"))]) (malabar-mode . [(20140303 946) ((fringe-helper (1 0 1))) "A better Java mode for Emacs" tar ((:url . "http://www.github.com/m0smith/malabar-mode") (:keywords "java" "maven" "language" "malabar"))]) (makey . [(0 3) ((cl-lib (0 2))) "interactive commandline mode" single nil]) (make-color . [(0 4) nil "Alternative to picking color - update fg/bg color by pressing r/g/b/... keys" single ((:url . "http://github.com/alezost/make-color.el") (:keywords "color"))]) (magit-tramp . [(0 1 0) ((magit (1 2 0))) "git method for TRAMP" single ((:url . "https://github.com/sigma/magit-tramp"))]) (magit-topgit . [(90140807) ((cl-lib (0 3)) (magit (1 3 0))) "topgit plug-in for Magit" single ((:keywords "vc" "tools"))]) (magit-svn . [(90140807) ((cl-lib (0 3)) (magit (1 3 0))) "git-svn plug-in for Magit" single ((:keywords "vc" "tools"))]) (magit-stgit . [(90140807) ((cl-lib (0 3)) (magit (1 3 0))) "StGit plug-in for Magit" single ((:keywords "vc" "tools"))]) (magit-push-remote . [(0 5 0) ((magit (1 3 0))) "push remote support for Magit" single ((:url . "https://github.com/tarsius/magit-push-remote") (:keywords "convenience"))]) (magit-gitflow . [(1 0 0) ((magit (1 3 0))) "gitflow extension for magit" single ((:url . "https://github.com/jtatarik/magit-gitflow") (:keywords "vc" "tools"))]) (magit-gh-pulls . [(0 3) ((gh (0 4 3)) (magit (1 1 0))) "GitHub pull requests extension for Magit" single ((:keywords "tools"))]) (magit-find-file . [(1 0 8) ((magit (1 2 0))) "completing-read over all files in Git" single ((:url . "https://github.com/bradleywright/magit-find-file.el") (:keywords "git"))]) (magit-annex . [(0 10 0) ((cl-lib (0 3)) (magit (1 2 0))) "Use git annex within magit" single ((:url . "https://github.com/kyleam/magit-annex") (:keywords "magit" "git-annex"))]) (magit . [(90140807) ((cl-lib (0 3)) (git-commit-mode (0 14 0)) (git-rebase-mode (0 14 0))) "control Git from Emacs" tar ((:keywords "vc" "tools"))]) (macrostep . [(0 7) nil "interactive macro stepper for Emacs Lisp" single ((:url . "https://github.com/joddie/macrostep") (:keywords "lisp" "languages" "macro" "debugging"))]) (macro-math . [(1 0) nil "in-buffer mathematical operations" single ((:url . "http://nschum.de/src/emacs/macro-math/") (:keywords "convenience"))]) (m-buffer . [(0 4) ((dash (2 5 0)) (emacs (24 3))) "Buffer Manipulation Functions" single nil]) (lua-mode . [(20140514) nil "a major-mode for editing Lua scripts" single ((:url . "http://immerrr.github.com/lua-mode") (:keywords "languages" "processes" "tools"))]) (love-minor-mode . [(1 1) nil "Minor mode for working on LÖVE projects" single ((:url . "https://github.com/ejmr/love-minor-mode"))]) (logito . [(0 1) ((eieio (1 3))) "logging library for Emacs" single ((:keywords "lisp" "tool"))]) (logalimacs . [(1 0 0) nil "Front-end to logaling-command for Ruby gems" single ((:url . "https://github.com/logaling/logalimacs"))]) (log4j-mode . [(1 3) nil "major mode for viewing log files" single ((:keywords "log" "log4j" "java"))]) (literate-coffee-mode . [(0 2) ((coffee-mode (0 5 0))) "major-mode for Literate CoffeeScript" single ((:url . "https://github.com/syohex/emacs-literate-coffee-mode"))]) (list-utils . [(0 4 2) nil "List-manipulation utility functions" single ((:url . "http://github.com/rolandwalker/list-utils") (:keywords "extensions"))]) (lispyscript-mode . [(0 3 5) nil "Major mode for LispyScript code." single ((:url . "https://github.com/krisajenkins/lispyscript-mode") (:keywords "lisp" "languages"))]) (lispy . [(0 13 0) ((helm (1 5 3)) (ace-jump-mode (2 0)) (s (1 4 0)) (noflet (0 0 10)) (multiple-cursors (1 3 0)) (iedit (0 97))) "vi-like Paredit" tar nil]) (linum-relative . [(0 4) nil "display relative line number in emacs." single ((:url . "http://github.com/coldnew/linum-relative") (:keywords "converience"))]) (linked-buffer . [(0 3) nil "No description available." tar nil]) (link . [(1 10) nil "No description available." single nil]) (lingr . [(0 2) nil "Lingr Client for GNU Emacs" single ((:url . "http://github.com/lugecy/lingr-el") (:keywords "chat" "client" "internet"))]) (lfe-mode . [(0 8) nil "Lisp Flavoured Erlang mode" tar nil]) (less-css-mode . [(0 18) nil "Major mode for editing LESS CSS files (lesscss.org)" single ((:url . "https://github.com/purcell/less-css-mode") (:keywords "less" "css" "mode"))]) (ledger-mode . [(3 0 3) nil "Helper code for use with the \"ledger\" command-line tool" tar nil]) (latex-extra . [(1 7 5) ((auctex (11 86 1))) "Adds several useful functionalities to LaTeX-mode." single ((:url . "http://github.com/Bruce-Connor/latex-extra") (:keywords "tex"))]) (langtool . [(1 2 1) nil "Grammer check utility using LanguageTool" single ((:url . "https://github.com/mhayashi1120/Emacs-langtool/raw/master/langtool.el") (:keywords "docs"))]) (know-your-http-well . [(0 2 0) nil "Look up the meaning of HTTP headers, methods, relations, status codes" tar nil]) (kivy-mode . [(1 8 0) nil "Emacs major mode for editing Kivy files" single nil]) (killer . [(0 2 2) nil "kill and delete text" single ((:url . "http://github.com/tarsius/killer") (:keywords "convenience"))]) (kill-ring-search . [(1 1) nil "incremental search for the kill ring" single ((:url . "http://nschum.de/src/emacs/kill-ring-search/") (:keywords "convenience" "matching"))]) (keymap-utils . [(0 4 4) ((cl-lib (0 2))) "Keymap utilities" tar nil]) (keydef . [(1 15) nil "a simpler way to define keys, with kbd syntax" single ((:keywords "convenience" "lisp" "customization" "keyboard" "keys"))]) (keychain-environment . [(2 0 1) nil "load keychain environment variables" single ((:url . "https://github.com/tarsius/keychain-environment") (:keywords "gnupg" "pgp" "ssh"))]) (key-combo . [(1 2) nil "map key sequence to commands" tar ((:url . "https://github.com/uk-ar/key-combo") (:keywords "keyboard" "input"))]) (jump-to-line . [(0 2 0) nil "Jump to line number at point." single ((:keywords "jump" "line" "back" "file" "ruby" "csharp" "python" "perl"))]) (jump . [(2 3) ((findr (0 7)) (inflections (1 1))) "build functions which contextually jump between files" single ((:url . "http://github.com/eschulte/jump.el/tree/master") (:keywords "project" "convenience" "navigation"))]) (jsx-mode . [(0 1 10) nil "major mode for JSX" single ((:url . "https://github.com/jsx/jsx-mode.el"))]) (json-mode . [(1 1 0) nil "Major mode for editing JSON files" single ((:url . "https://github.com/joshwnj/json-mode"))]) (js3-mode . [(1 1 0) nil "An improved JavaScript editing mode" tar ((:keywords "javascript" "languages"))]) (js2-refactor . [(0 6 1) ((js2-mode (20101228)) (multiple-cursors (1 0 0)) (dash (1 0 0)) (s (1 0 0)) (yasnippet (20130218))) "A JavaScript refactoring library for emacs." tar nil]) (js2-mode . [(20140114) ((emacs (24 1))) "Improved JavaScript editing mode" tar ((:url . "https://github.com/mooz/js2-mode/") (:keywords "languages" "javascript"))]) (jedi . [(0 1 2) ((epc (0 1 0)) (auto-complete (1 4))) "Python auto-completion for Emacs" tar nil]) (jabber . [(0 8 92) nil "A Jabber client for Emacs." tar nil]) (j-mode . [(1 1 1) nil "Major mode for editing J programs" tar ((:url . "http://github.com/zellio/j-mode") (:keywords "j" "langauges"))]) (ix . [(0 7) ((grapnel (0 5 3))) "Emacs client for http://ix.io pastebin" single ((:url . "http://www.github.com/theanalyst/ix.el"))]) (irony . [(0 1 0) ((cl-lib (0 5))) "C/C++ minor mode powered by libclang" tar ((:url . "https://github.com/Sarcasm/irony-mode") (:keywords "c" "convenience" "tools"))]) (ir-black-theme . [(1 0 1) nil "Port of ir-black theme" single ((:keywords "faces"))]) (instapaper . [(0 9 5) nil "No description available." single nil]) (insert-shebang . [(0 9 3) nil "Insert shebang line automatically." single ((:url . "http://github.com/psachin/insert-shebang") (:keywords "shebang" "tool" "convenience"))]) (inline-crypt . [(0 1 4) nil "Simple inline encryption via openssl" tar nil]) (initsplit . [(1 6) nil "No description available." single nil]) (inflections . [(2 3) nil "convert english words between singular and plural" single ((:url . "https://github.com/eschulte/jump.el") (:keywords "ruby" "rails" "languages" "oop"))]) (inf-ruby . [(2 2 4) nil "Run a ruby process in a buffer" single ((:url . "http://github.com/nonsequitur/inf-ruby") (:keywords "languages" "ruby"))]) (import-popwin . [(0 8) ((popwin (0 6)) (cl-lib (0 5))) "popwin buffer near by import statements with popwin" single ((:url . "https://github.com/syohex/emacs-import-popwin"))]) (immutant-server . [(1 2 0) nil "Run your Immutant server in Emacs" single ((:url . "http://www.github.com/leathekd/immutant-server.el"))]) (ignoramus . [(0 7 0) nil "Ignore backups, build files, et al." single ((:url . "http://github.com/rolandwalker/ignoramus") (:keywords "convenience" "tools"))]) (iflipb . [(1 2) nil "interactively flip between recently visited buffers" single ((:url . "http://hg.rosdahl.net/iflipb"))]) (idris-mode . [(0 9 14) ((emacs (24))) "Major mode for editing Idris code" tar ((:url . "https://github.com/idris-hackers/idris-mode") (:keywords "languages"))]) (ido-ubiquitous . [(2 13) ((emacs (24 1))) "Use ido (nearly) everywhere." single ((:url . "https://github.com/DarwinAwardWinner/ido-ubiquitous") (:keywords "convenience"))]) (ido-load-library . [(0 2 0) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Load-library alternative using ido-completing-read" single ((:url . "http://github.com/rolandwalker/ido-load-library") (:keywords "maint" "completion"))]) (ido-complete-space-or-hyphen . [(1 1) nil "No description available." single nil]) (idle-highlight-mode . [(1 1 3) nil "highlight the word the point is on" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/IdleHighlight") (:keywords "convenience"))]) (identica-mode . [(1 3 1) nil "Major mode API client for status.net open microblogging" tar ((:url . "http://blog.gabrielsaldana.org/identica-mode-for-emacs/") (:keywords "identica" "web"))]) (ibuffer-vc . [(0 7) ((cl-lib (0 2))) "Group ibuffer's list by VC project, or show VC status" single ((:url . "http://github.com/purcell/ibuffer-vc") (:keywords "themes"))]) (hyde . [(0 2) nil "No description available." tar nil]) (httprepl . [(1 1) ((s (1 9 0)) (dash (2 5 0)) (emacs (24))) "An HTTP REPL" single ((:url . "https://github.com/gregsexton/httprepl.el") (:keywords "http" "repl"))]) (httpcode . [(0 1) nil "explains the meaning of an HTTP status code" single ((:url . "http://github.com/rspivak/httpcode.el"))]) (hl-todo . [(1 3 1) nil "highlight TODO keywords" single ((:url . "http://github.com/tarsius/hl-todo") (:keywords "convenience"))]) (hl-sexp . [(1 0 0) nil "highlight the current sexp" single ((:keywords "faces" "frames" "emulation"))]) (hl-sentence . [(3) nil "highlight a sentence based on customizable face" single ((:url . "http://github.com/milkypostman/hl-sentence") (:keywords "highlighting"))]) (historyf . [(0 0 8) nil "file history library like browser" single ((:url . "https://github.com/k1LoW/emacs-historyf"))]) (hippie-namespace . [(0 5 8) nil "Special treatment for namespace prefixes in hippie-expand" single ((:url . "http://github.com/rolandwalker/hippie-namespace") (:keywords "convenience" "lisp" "tools" "completion"))]) (hippie-expand-slime . [(0 1) nil "Hook slime's completion into hippie-expand" single ((:url . "https://github.com/purcell/hippie-expand-slime"))]) (highlight-symbol . [(1 2) nil "automatic and manual symbol highlighting" single ((:url . "http://nschum.de/src/emacs/highlight-symbol/") (:keywords "faces" "matching"))]) (highlight-parentheses . [(1 0 2) nil "highlight surrounding parentheses" single ((:url . "http://nschum.de/src/emacs/highlight-parentheses/") (:keywords "faces" "matching"))]) (highlight-numbers . [(0 2) ((emacs (24)) (parent-mode (2 0))) "Highlight numbers in source code" single ((:url . "https://github.com/Fanael/highlight-numbers"))]) (highlight-defined . [(0 1 5) ((emacs (24))) "Syntax highlighting of known Elisp symbols" single ((:url . "https://github.com/Fanael/highlight-defined"))]) (highlight-blocks . [(0 1 4) ((emacs (24))) "Highlight the blocks point is in" single ((:url . "https://github.com/Fanael/highlight-blocks"))]) (helm-themes . [(0 3) ((helm (1 0))) "Color theme selection with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-themes"))]) (helm-spaces . [(0 2) ((helm (1 0)) (spaces (0 1 0))) "helm sources for spaces" single ((:url . "https://github.com/yasuyk/helm-spaces") (:keywords "helm" "frames" "convenience"))]) (helm-robe . [(0 1) ((helm (1 0))) "completing read function for robe" single ((:url . "https://github.com/syohex/emacs-helm-robe"))]) (helm-pydoc . [(0 6) ((helm (1 0)) (cl-lib (0 5))) "pydoc with helm interface" tar ((:url . "https://github.com/syohex/emacs-helm-pydoc"))]) (helm-projectile . [(0 11 0) ((helm (1 4 0)) (projectile (0 11 0)) (cl-lib (0 3))) "Helm integration for Projectile" single ((:url . "https://github.com/bbatsov/projectile") (:keywords "project" "convenience"))]) (helm-proc . [(0 0 4) ((helm (1 6 0))) "Helm interface for managing system processes" tar nil]) (helm-perldoc . [(0 7) ((helm (1 0)) (deferred (0 3 1)) (cl-lib (0 5))) "perldoc with helm interface" tar ((:url . "https://github.com/syohex/emacs-helm-perldoc"))]) (helm-package . [(0 2) ((helm (1 0)) (cl-lib (0 3))) "Listing ELPA packages with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-package"))]) (helm-open-github . [(0 11) ((helm (1 0)) (gh (1 0)) (cl-lib (0 5))) "Utilities of Opening Github Page" single ((:url . "https://github.com/syohex/emacs-helm-open-github"))]) (helm-hayoo . [(0 0 5) ((helm (1 6 0)) (json (1 2)) (haskell-mode (13 7))) "Source and configured helm for searching hayoo" single ((:keywords "helm"))]) (helm-gtags . [(1 2 8) ((helm (1 5 6)) (cl-lib (0 5))) "GNU GLOBAL helm interface" single ((:url . "https://github.com/syohex/emacs-helm-gtags"))]) (helm-github-stars . [(1 1 1) ((helm (1 5 5))) "Helm integration for your starred repositories on github" single ((:keywords "helm" "github" "stars"))]) (helm-ghq . [(1 2 0) ((helm (1 6 2))) "ghq with helm interface" single ((:url . "https://github.com/masutaka/emacs-helm-ghq"))]) (helm-descbinds . [(1 7 1) nil "Yet Another `describe-bindings' with `helm'." single ((:keywords "helm" "help"))]) (helm-dash . [(1 0 0) ((helm (0 0 0))) "Helm extension to search dash docsets" single ((:keywords "docs"))]) (helm-backup . [(0 2 0) ((helm (1 5 5)) (s (1 8 0))) "Backup each file change using git" single ((:url . "http://github.com/antham/helm-backup") (:keywords "backup"))]) (helm-ag . [(0 25) ((helm (1 5 6)) (cl-lib (0 5))) "the silver searcher with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-ag"))]) (helm-ack . [(0 12) ((helm (1 0)) (cl-lib (0 5))) "Ack command with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-ack"))]) (helm . [(1 6 3) nil "Helm is an Emacs incremental and narrowing framework" tar nil]) (header-button . [(0 3 0) nil "clickable buttons in header lines" single ((:url . "https://github.com/emacsattic/header-button") (:keywords "extensions"))]) (haskell-mode . [(13 10) nil "A Haskell editing mode" tar nil]) (hardhat . [(0 4 4) ((ignoramus (0 7 0))) "Protect against clobbering user-writable files" single ((:url . "http://github.com/rolandwalker/hardhat") (:keywords "convenience"))]) (haml-mode . [(3 1 5) ((ruby-mode (1 0))) "Major mode for editing Haml files" single ((:url . "http://github.com/nex3/haml/tree/master") (:keywords "markup" "language" "html"))]) (ham-mode . [(1 1 1) ((html-to-markdown (1 2)) (markdown-mode (2 0))) "Html As Markdown. Transparently edit an html file using markdown." single ((:url . "http://github.com/Bruce-Connor/ham-mode") (:keywords "convenience" "emulation" "wp"))]) (hackernews . [(0 2) ((json (1 2))) "Access the hackernews aggregator from Emacs" tar nil]) (guru-mode . [(0 2) nil "Become an Emacs guru" single ((:url . "https://github.com/bbatsov/guru-mode") (:keywords "convenience"))]) (gruber-darker-theme . [(0 6) nil "Gruber Darker color theme for Emacs 24." single ((:url . "http://github.com/rexim/gruber-darker-theme"))]) (groovy-mode . [(201311291207.0) nil "Groovy mode derived mode" tar nil]) (grizzl . [(0 1 1) nil "Fuzzy Search Library & Completing Read" tar nil]) (grin . [(1 0) nil "run grin and grind (python replacements for grep and find) putting hits in a grep buffer" single ((:url . "http://bitbucket.org/dariusp686/emacs-grin") (:keywords "python" "grin" "grind" "grep" "find"))]) (grass-mode . [(0 1) ((cl-lib (0 2))) "Provides Emacs modes for interacting with the GRASS GIS program" single ((:keywords "grass" "gis"))]) (grapnel . [(0 5 3) nil "HTTP request lib with flexible callback dispatch" single ((:url . "http://www.github.com/leathekd/grapnel"))]) (graphene . [(1 0) ((auto-complete (20130330)) (smartparens (20130329)) (multi-web-mode (20130205)) (smex (20120915)) (sr-speedbar (20130309)) (project-persist (20130309)) (exec-path-from-shell (20121108))) "A set of defaults targeted at GUI text editor diaspora." tar nil]) (gradle-mode . [(0 5 4) ((s (1 8 0))) "Gradle integration with Emacs' compile" single ((:url . "http://github.com/jacobono/emacs-gradle-mode") (:keywords "gradle"))]) (goto-gem . [(1 2) ((s (1 9 0))) "Open dired in gem directory" single ((:keywords "gemfile" "convenience"))]) (google-translate . [(0 9 2) nil "Emacs interface to Google Translate." tar nil]) (google-this . [(1 8) nil "A set of functions and bindings to google under point." single ((:url . "http://github.com/Bruce-Connor/emacs-google-this") (:keywords "convenience" "hypermedia"))]) (golden-ratio . [(0 0 4) nil "Automatic resizing of Emacs windows to the golden ratio" single ((:keywords "window" "resizing"))]) (go-eldoc . [(0 17) ((go-mode (0)) (cl-lib (0 5))) "eldoc for go-mode" single ((:url . "https://github.com/syohex/emacs-go-eldoc"))]) (go-direx . [(0 3) ((direx (0 1 -3)) (cl-lib (0 5))) "Tree style source code viewer for Go language" single ((:url . "https://github.com/syohex/emacs-go-direx"))]) (gnus-desktop-notify . [(1 4) ((gnus (1 0))) "Gnus Desktop Notification global minor mode" single ((:url . "http://www.thregr.org/~wavexx/hacks/gnus-desktop-notify/"))]) (gnuplot . [(0 6 1) nil "No description available." tar nil]) (gmail-message-mode . [(1 3 1) ((ham-mode (1 0))) "A major-mode for editing gmail messages using markdown syntax." single ((:url . "http://github.com/Bruce-Connor/gmail-message-mode") (:keywords "mail" "convenience" "emulation"))]) (gitignore-mode . [(0 15 0) nil "Major mode for editing .gitignore files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (gitconfig-mode . [(0 15 0) nil "Major mode for editing .gitconfig files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (gitconfig . [(1 0 0) nil "Emacs lisp interface to work with git-config variables" single ((:keywords "git" "gitconfig" "git-config"))]) (gitattributes-mode . [(0 15 0) nil "Major mode for editing .gitattributes files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (git-timemachine . [(1 5) ((cl-lib (0 5))) "Walk through git revisions of a file" single ((:url . "https://github.com/pidu/git-timemachine") (:keywords "git"))]) (git-rebase-mode . [(0 15 0) nil "Major mode for editing git rebase files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (git-messenger . [(0 13) ((popup (0 5 0))) "Pop up last commit information of current line" single ((:url . "https://github.com/syohex/emacs-git-messenger"))]) (git-link . [(0 0 2) nil "Get the GitHub/Bitbucket/Gitorious URL for a buffer location" single ((:url . "http://github.com/sshaw/git-link"))]) (git-gutter-fringe . [(0 20) ((git-gutter (0 71)) (fringe-helper (0 1 1)) (cl-lib (0 5)) (emacs (24))) "Fringe version of git-gutter.el" single ((:url . "https://github.com/syohex/emacs-git-gutter-fringe"))]) (git-gutter-fringe+ . [(0 1) ((git-gutter+ (0 1)) (fringe-helper (20130519 1641))) "Fringe version of git-gutter+.el" single ((:url . "https://github.com/nonsequitur/git-gutter-fringe-plus"))]) (git-gutter . [(0 72) ((cl-lib (0 5)) (emacs (24))) "Port of Sublime Text plugin GitGutter" single ((:url . "https://github.com/syohex/emacs-git-gutter"))]) (git-gutter+ . [(0 2) nil "Manage Git hunks straight from the buffer" single ((:url . "https://github.com/nonsequitur/git-gutter-plus"))]) (git-commit-mode . [(0 15 0) nil "Major mode for editing git commit messages" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (git-auto-commit-mode . [(4 2 2) nil "Emacs Minor mode to automatically commit and push" single ((:url . "http://ryuslash.org/projects/git-auto-commit-mode/") (:keywords "vc"))]) (git . [(0 1 1) ((s (1 7 0)) (dash (2 2 0)) (f (0 10 0))) "An Elisp API for programmatically using Git" single ((:url . "http://github.com/rejeep/git.el") (:keywords "git"))]) (gist . [(1 1 0) ((eieio (1 3)) (gh (0 7 0)) (tabulated-list (0))) "Emacs integration for gist.github.com" single ((:keywords "gist" "git" "github" "paste" "pastie" "pastebin"))]) (ghc . [(4 1 6) nil "Sub mode for Haskell mode" tar nil]) (gh . [(0 8 0) ((eieio (1 3)) (pcache (0 2 4)) (logito (0 1))) "A GitHub library for Emacs" tar nil]) (ggtags . [(0 8 5) ((emacs (24)) (cl-lib (0 5))) "emacs frontend to GNU Global source code tagging system" single ((:url . "https://github.com/leoliu/ggtags") (:keywords "tools" "convenience"))]) (ggo-mode . [(20130521) nil "Gengetopt major mode" single ((:keywords "extensions" "convenience" "local"))]) (geiser . [(0 5) nil "GNU Emacs and Scheme talk to each other" tar nil]) (gather . [(1 0 5) nil "Gather string in buffer." single ((:url . "https://github.com/mhayashi1120/Emacs-gather/raw/master/gather.el") (:keywords "matching" "convenience" "tools"))]) (fwb-cmds . [(0 4 0) nil "misc frame, window and buffer commands" single ((:url . "http://github.com/tarsius/fwb-cmds") (:keywords "convenience"))]) (fvwm-mode . [(1 6 4) nil "major mode for editing Fvwm configuration files" single ((:keywords "files"))]) (fuzzy . [(0 1) nil "Fuzzy Matching" single ((:keywords "convenience"))]) (full-ack . [(1 0) nil "a front-end for ack" single ((:url . "http://nschum.de/src/emacs/full-ack/") (:keywords "tools" "matching"))]) (fuel . [(0 96) nil "No description available." tar nil]) (fringe-helper . [(1 0 1) nil "helper functions for fringe bitmaps" single ((:url . "http://nschum.de/src/emacs/fringe-helper/") (:keywords "lisp"))]) (frame-restore . [(0 5) ((emacs (24 1))) "Restore Emacs frame" single ((:url . "https://github.com/lunaryorn/frame-restore.el") (:keywords "frames" "convenience"))]) (fountain-mode . [(1 3 2) ((s (1 9 0))) "Major mode for screenwriting in Fountain markup" single ((:url . "https://github.com/rnkn/fountain-mode/") (:keywords "wp"))]) (font-utils . [(0 7 2) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Utility functions for working with fonts" single ((:url . "http://github.com/rolandwalker/font-utils") (:keywords "extensions"))]) (fold-this . [(0 2 0) nil "Just fold this region please" single ((:keywords "convenience"))]) (fold-dwim-org . [(0 6) ((fold-dwim (1 2))) "Fold DWIM bound to org key-strokes." single ((:url . "https://github.com/mlf176f2/fold-dwim-org") (:keywords "folding" "emacs" "org-mode"))]) (fold-dwim . [(1 2) nil "No description available." single nil]) (fm . [(1 0) nil "follow mode for compilation/output buffers" single ((:keywords "outlines"))]) (flyspell-lazy . [(0 6 6) nil "Improve flyspell responsiveness using idle timers" single ((:url . "http://github.com/rolandwalker/flyspell-lazy") (:keywords "spelling"))]) (flymake-shell . [(0 8) ((flymake-easy (0 1))) "A flymake syntax-checker for shell scripts" single ((:url . "https://github.com/purcell/flymake-shell"))]) (flymake-sass . [(0 6) ((flymake-easy (0 1))) "Flymake handler for sass files" single ((:url . "https://github.com/purcell/flymake-sass"))]) (flymake-ruby . [(0 8) ((flymake-easy (0 1))) "A flymake handler for ruby-mode files" single ((:url . "https://github.com/purcell/flymake-ruby"))]) (flymake-python-pyflakes . [(0 9) ((flymake-easy (0 8))) "A flymake handler for python-mode files using pyflakes (or flake8)" single ((:url . "https://github.com/purcell/flymake-python-pyflakes"))]) (flymake-php . [(0 5) ((flymake-easy (0 1))) "A flymake handler for php-mode files" single ((:url . "https://github.com/purcell/flymake-php"))]) (flymake-perlcritic . [(1 0 3) ((flymake (0 3))) "Flymake handler for Perl to invoke Perl::Critic" tar ((:url . "https://github.com/illusori/emacs-flymake-perlcritic"))]) (flymake-json . [(0 1) ((flymake-easy (0 1))) "A flymake handler for json using jsonlint" single ((:url . "https://github.com/purcell/flymake-json"))]) (flymake-jslint . [(0 23) nil "Flymake support for javascript using jslint" single ((:url . "https://github.com/purcell/flymake-jslint"))]) (flymake-hlint . [(0 2) ((flymake-easy (0 1))) "A flymake handler for haskell-mode files using hlint" single ((:url . "https://github.com/purcell/flymake-hlint"))]) (flymake-haskell-multi . [(0 3) ((flymake-easy (0 1))) "Syntax-check haskell-mode using both ghc and hlint" tar nil]) (flymake-haml . [(0 8) ((flymake-easy (0 1))) "A flymake handler for haml files" single ((:url . "https://github.com/purcell/flymake-haml"))]) (flymake-gjshint . [(0 0 6) nil "A flymake handler for javascript using both jshint and gjslint" single ((:keywords "flymake" "javascript" "jshint" "gjslint"))]) (flymake-easy . [(0 9) nil "Helpers for easily building flymake checkers" single ((:url . "https://github.com/purcell/flymake-easy") (:keywords "convenience" "internal"))]) (flymake-css . [(0 3) ((flymake-easy (0 1))) "Flymake support for css using csslint" single ((:url . "https://github.com/purcell/flymake-css"))]) (flymake-coffee . [(0 12) ((flymake-easy (0 1))) "A flymake handler for coffee script" single ((:url . "https://github.com/purcell/flymake-coffee"))]) (flycheck-ledger . [(0 4) ((flycheck (0 15))) "Flycheck integration for ledger files" single ((:keywords "convenience" "languages" "tools"))]) (flycheck-hdevtools . [(0 3) ((flycheck (0 15))) "A flycheck checker for Haskell using hdevtools" single ((:url . "https://github.com/flycheck/flycheck-hdevtools") (:keywords "convenience" "languages" "tools"))]) (flycheck-haskell . [(0 4) ((flycheck (0 16)) (haskell-mode (13 7)) (dash (2 4 0)) (f (0 11 0))) "Flycheck: Cabal projects and sandboxes" single ((:url . "https://github.com/flycheck/flycheck-haskell") (:keywords "tools" "convenience"))]) (flycheck-dmd-dub . [(0 4) nil "Sets flycheck-dmd-include-paths from dub package information" single ((:url . "http://github.com/atilaneves/flycheck-dmd-dub") (:keywords "languages"))]) (flycheck-color-mode-line . [(0 2) ((flycheck (0 13)) (dash (1 2)) (emacs (24 1))) "Change mode line color with Flycheck status" single ((:keywords "convenience" "language" "tools"))]) (flycheck-cask . [(0 1) ((flycheck (0 14)) (dash (2 0 0)) (f (0 6 0))) "Cask support in Flycheck" single ((:url . "https://github.com/flycheck/flycheck-cask") (:keywords "tools" "convenience"))]) (flycheck . [(0 19) ((s (1 9 0)) (dash (2 4 0)) (f (0 11 0)) (pkg-info (0 4)) (cl-lib (0 3)) (emacs (24 1))) "Modern on-the-fly syntax checking for GNU Emacs" tar ((:url . "https://flycheck.readthedocs.org") (:keywords "convenience" "languages" "tools"))]) (flx-ido . [(0 5) ((flx (0 1)) (cl-lib (0 3))) "flx integration for ido" single ((:url . "https://github.com/lewang/flx"))]) (flx . [(0 5) ((cl-lib (0 3))) "fuzzy matching with good sorting" single ((:url . "https://github.com/lewang/flx"))]) (floobits . [(1 5 8) ((json (1 2)) (highlight (0))) "Floobits plugin for real-time collaborative editing" tar ((:url . "http://github.com/Floobits/floobits-emacs") (:keywords "comm" "tools"))]) (fixmee . [(0 8 4) ((button-lock (1 0 0)) (nav-flash (1 0 0)) (back-button (0 6 0)) (smartrep (0 0 3)) (string-utils (0 3 2)) (tabulated-list (0))) "Quickly navigate to FIXME notices in code" single ((:url . "http://github.com/rolandwalker/fixmee") (:keywords "navigation" "convenience"))]) (fiplr . [(0 2 4) ((grizzl (0 1 0))) "Fuzzy Search for Files in Projects" tar nil]) (find-file-in-repository . [(1 2) nil "Quickly find files in a git, mercurial or other repository" single ((:url . "https://github.com/hoffstaetter/find-file-in-repository") (:keywords "files" "convenience" "repository" "project" "source control"))]) (find-file-in-project . [(3 3) nil "Find files in a project quickly." single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/FindFileInProject") (:keywords "project" "convenience"))]) (finalize . [(1 0 0) ((emacs (24 1)) (cl-lib (0 3)) (eieio (1 4))) "finalizers for Emacs Lisp" tar nil]) (fill-column-indicator . [(1 81) nil "Graphically indicate the fill column" tar ((:keywords "convenience"))]) (fastnav . [(1 0 7) nil "Fast navigation and editing routines." single ((:keywords "nav" "fast" "fastnav" "navigation"))]) (fasm-mode . [(0 1 9) nil "Fasm major mode" single ((:url . "https://github.com/Fanael/fasm-mode"))]) (fancy-narrow . [(0 9 4) nil "narrow-to-region with more eye candy." single ((:url . "http://github.com/Bruce-Connor/fancy-narrow-region") (:keywords "faces" "convenience"))]) (fancy-battery . [(0 2) ((emacs (24 1))) "Fancy battery display" single ((:url . "https://github.com/lunaryorn/fancy-battery.el") (:keywords "convenience" "tools" "hardware"))]) (factlog . [(0 0 1) nil "File activity logger" single nil]) (fabric . [(0 1 0) nil "Launch Fabric using Emacs" tar ((:url . "https://github.com/nlamirault/fabric.el") (:keywords "python" "fabric"))]) (f . [(0 16 2) ((s (1 7 0)) (dash (2 2 0))) "Modern API for working with files and directories" single ((:url . "http://github.com/rejeep/f.el") (:keywords "files" "directories"))]) (eyebrowse . [(0 2 1) ((dash (2 4 0)) (s (1 4 0)) (emacs (24))) "Easy window config switching" single ((:url . "https://github.com/wasamasa/eyebrowse") (:keywords "convenience"))]) (extend-dnd . [(0 5) nil "R drag and Drop" tar ((:url . "https://github.com/mlf176f2/extend-dnd") (:keywords "extend" "drag and drop"))]) (express . [(0 6 0) ((string-utils (0 3 2))) "Alternatives to `message'" single ((:url . "http://github.com/rolandwalker/express") (:keywords "extensions" "message" "interface"))]) (expand-region . [(0 10 0) nil "Increase selected region by semantic units." tar nil]) (exec-path-from-shell . [(1 8) nil "Get environment variables such as $PATH from the shell" single ((:url . "https://github.com/purcell/exec-path-from-shell") (:keywords "environment"))]) (eww-lnum . [(1 0) nil "Operations using link numbers" single ((:url . "https://github.com/m00natic/eww-lnum") (:keywords "eww" "browse" "conkeror"))]) (evm . [(0 4 1) ((dash (2 3 0)) (f (0 13 0))) "Emacs Version Manager" single ((:url . "http://github.com/rejeep/evm"))]) (evil-visualstar . [(0 0 1) ((evil (0))) "Starts a * or # search from the visual selection" single ((:url . "https://github.com/bling/evil-visualstar") (:keywords "evil" "vim" "visualstar"))]) (evil-space . [(0 0 2) ((evil (1 0 0))) "Repeat motion in Evil. Correct the behaviour of what SPC should do." single ((:url . "http://github.com/linktohack/evil-space") (:keywords "space" "repeat" "motion"))]) (evil-numbers . [(0 4) nil "increment/decrement numbers like in vim" single ((:url . "http://github.com/cofi/evil-numbers") (:keywords "numbers" "increment" "decrement" "octal" "hex" "binary"))]) (evil-nerd-commenter . [(1 5 2) nil "Comment/uncomment lines efficiently. Like Nerd Commenter in Vim" tar nil]) (evil-matchit . [(1 3 2) nil "Vim matchit ported into Emacs (requires EVIL)" tar nil]) (evil-leader . [(0 4 2) ((evil (0))) "let there be " single ((:url . "http://github.com/cofi/evil-leader") (:keywords "evil" "vim-emulation" "leader"))]) (evil-jumper . [(0 0 1) ((evil (0))) "Jump like vimmers do!" single ((:url . "https://github.com/bling/evil-jumper") (:keywords "evil" "vim" "jumplist" "jump" "list"))]) (evil-args . [(1 0) ((evil (1 0 8))) "Motions and text objects for delimited arguments in Evil." single ((:url . "http://github.com/wcsmith/evil-args") (:keywords "evil" "vim-emulation"))]) (evil . [(1 0 9) ((undo-tree (0 6 3)) (goto-last-change (1 2))) "Extensible Vi layer for Emacs." tar nil]) (eval-sexp-fu . [(0 4 0) nil "Tiny functionality enhancements for evaluating sexps." single ((:keywords "lisp" "highlight" "convenience"))]) (esup . [(0 4) nil "the Emacs StartUp Profiler (ESUP)" single ((:url . "http://github.com/jschaf/esup") (:keywords "emacs-lisp" "elisp" "profile" "startup"))]) (ess-smart-underscore . [(0 79) nil "Ess Smart Underscore" tar ((:url . "http://github.com/mlf176f2/ess-smart-underscore.el") (:keywords "ess" "underscore"))]) (ess . [(13 9) nil "No description available." tar nil]) (espuds . [(0 2 6) ((s (1 7 0)) (dash (2 2 0)) (noflet (0 0 10)) (f (0 12 1))) "Ecukes step definitions" single ((:url . "http://github.com/ecukes/espuds") (:keywords "test"))]) (es-windows . [(0 3) ((cl-lib (0 3)) (emacs (24))) "Window-management utilities" single ((:url . "https://github.com/sabof/es-windows"))]) (es-mode . [(3 0 0) nil "A major mode for editing Elasticsearch queries" tar ((:url . "http://www.github.com/dakrone/es-mode") (:keywords "elasticsearch"))]) (ert-runner . [(0 6 3) ((s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Opinionated Ert testing workflow" tar ((:url . "http://github.com/rejeep/ert-runner.el") (:keywords "test"))]) (ert-async . [(0 1 0) nil "Async support for ERT" single ((:url . "http://github.com/rejeep/ert-async.el") (:keywords "test"))]) (ergoemacs-mode . [(5 14 7 3) ((emacs (24 1)) (undo-tree (0 6 5))) "Emacs mode based on common modern interface and ergonomics." tar ((:url . "https://github.com/ergoemacs/ergoemacs-mode") (:keywords "convenience"))]) (ercn . [(1 0 2) nil "Flexible ERC notifications" single ((:url . "http://www.github.com/leathekd/ercn"))]) (erc-hl-nicks . [(1 3 0) nil "ERC nick highlighter that ignores uniquifying chars when colorizing" single ((:url . "http://www.github.com/leathekd/erc-hl-nicks"))]) (erc-crypt . [(1 0) nil "Symmetric Encryption for ERC" single ((:keywords "application"))]) (epl . [(0 7) ((cl-lib (0 3))) "Emacs Package Library" single ((:url . "http://github.com/cask/epl") (:keywords "convenience"))]) (epc . [(0 1 0) ((concurrent (0 3 1)) (ctable (0 1 0))) "A RPC stack for the Emacs Lisp" tar ((:url . "https://github.com/kiwanami/emacs-epc") (:keywords "lisp" "rpc"))]) (enotify . [(0 1 3) nil "No description available." tar nil]) (emmet-mode . [(1 0 8) nil "Unofficial Emmet's support for emacs" single ((:url . "https://github.com/smihica/emmet-mode") (:keywords "convenience"))]) (emamux . [(0 12) ((cl-lib (0 5))) "Interact with tmux" single ((:url . "https://github.com/syohex/emacs-emamux"))]) (emacsql . [(1 0 2) ((emacs (24 3)) (cl-lib (0 3)) (finalize (1 0 0))) "high-level SQL database front-end" tar ((:url . "https://github.com/skeeto/emacsql"))]) (emacsc . [(1 2 20131027) nil "helper for emacsc(1)" tar ((:url . "https://github.com/knu/emacsc") (:keywords "tools"))]) (emacs-setup . [(1 0) nil "Package for maintaining your emacs configuration. Clean up your .emacs!" tar nil]) (emacs-eclim . [(0 2) nil "No description available." tar nil]) (elx . [(0 9 6) ((emacs (24 3 50))) "extract information from Emacs Lisp libraries" single ((:url . "https://github.com/tarsius/elx") (:keywords "docs" "libraries" "packages"))]) (elpy . [(1 5 0) ((company (0 8 2)) (find-file-in-project (3 3)) (highlight-indentation (0 5 0)) (idomenu (0 1)) (pyvenv (1 3)) (yasnippet (0 8 0))) "Emacs Python Development Environment" tar nil]) (elpa-audit . [(0 4) nil "Handy functions for inspecting and comparing package archives" single ((:url . "https://github.com/purcell/elpa-audit") (:keywords "maint"))]) (elmine . [(0 3) nil "No description available." single nil]) (elixir-mode . [(1 4 1) nil "Major mode for editing Elixir files" tar ((:url . "https://github.com/elixir-lang/emacs-elixir") (:keywords "languages" "elixir"))]) (elixir-mix . [(0 3 0) nil "Emacs integration for Elixir's mix" single ((:url . "http://github.com/tonini/elixir-mix.el") (:keywords "elixir" "mix" "elixir-mix"))]) (elisp-slime-nav . [(0 7) ((cl-lib (0 2))) "Make M-. and M-, work in elisp like they do in slime" single ((:url . "https://github.com/purcell/elisp-slime-nav") (:keywords "navigation" "slime" "elisp" "emacs-lisp"))]) (elfeed-web . [(1 1 1) ((simple-httpd (1 4 3)) (elfeed (1 0 1)) (emacs (24 1))) "web interface to Elfeed" tar nil]) (elfeed . [(1 1 1) ((emacs (24 1))) "an Emacs Atom/RSS feed reader" tar nil]) (el-x . [(0 3 0) nil "main entry point for el-x package" tar ((:keywords "lisp"))]) (el-spice . [(0 2 2) ((thingatpt+ (0))) "Extra spice for emacs lisp programming" tar ((:url . "https://github.com/vedang/el-spice") (:keywords "configuration"))]) (el-mock . [(1 25 0) nil "Tiny Mock and Stub framework in Emacs Lisp" single ((:url . "http://github.com/rejeep/el-mock.el") (:keywords "lisp" "testing" "unittest"))]) (el-get . [(5 1) nil "Manage the external elisp bits and pieces you depend upon" tar ((:url . "http://www.emacswiki.org/emacs/el-get") (:keywords "emacs" "package" "elisp" "install" "elpa" "git" "git-svn" "bzr" "cvs" "svn" "darcs" "hg" "apt-get" "fink" "pacman" "http" "http-tar" "emacswiki"))]) (el-autoyas . [(0 5) nil "Automatically create Emacs-Lisp Yasnippets" tar ((:url . "https://github.com/mlf176f2/el-autoyas.el") (:keywords "emacs" "lisp" "mode" "yasnippet"))]) (ein . [(0 2 0) ((websocket (0 9)) (auto-complete (1 4))) "Emacs IPython Notebook" tar nil]) (eide . [(2 0 0) nil "Emacs-IDE" tar ((:url . "http://emacs-ide.tuxfamily.org/"))]) (egison-mode . [(3 3 10) nil "Egison editing mode" single ((:url . "https://github.com/egisatoshi/egison3/blob/master/elisp/egison-mode.el"))]) (edts . [(0 1 0) nil "No description available." tar nil]) (editorconfig . [(0 3) nil "EditorConfig Emacs extension" single ((:url . "http://github.com/editorconfig/editorconfig-emacs#readme"))]) (edit-server . [(1 13) nil "server that responds to edit requests from Chrome" single ((:url . "https://github.com/stsquad/emacs_chrome"))]) (edit-list . [(0 3) nil "edit a single list" single ((:url . "http://mwolson.org/static/dist/elisp/edit-list.el"))]) (edbi . [(0 1 2) ((concurrent (0 3 1)) (ctable (0 1 1)) (epc (0 1 1))) "Emacs Database Interface" tar nil]) (ecukes . [(0 6 15) ((commander (0 6 1)) (espuds (0 2 2)) (ansi (0 3 0)) (dash (2 2 0)) (s (1 8 0)) (f (0 11 0))) "Cucumber for Emacs." tar nil]) (ecb . [(2 -3 24) nil "a code browser for Emacs" tar ((:keywords "browser" "code" "programming" "tools"))]) (ebib . [(1 15 6) nil "a BibTeX database manager" tar ((:keywords "text" "bibtex"))]) (easy-kill-extras . [(0 9 1) ((easy-kill (0 9 4))) "Extra functions for easy-kill." single ((:url . "https://github.com/knu/easy-kill-extras.el") (:keywords "killing" "convenience"))]) (easy-kill . [(0 9 3) ((emacs (24)) (cl-lib (0 5))) "kill & mark things easily" tar ((:url . "https://github.com/leoliu/easy-kill") (:keywords "killing" "convenience"))]) (e2wm-R . [(0 4) ((e2wm (1 2))) "some e2wm plugin and perspective for GNU R" single ((:keywords "window manager" "convenience" "e2wm"))]) (e2wm . [(1 3) nil "simple window manager for emacs" tar ((:keywords "tools" "window manager"))]) (dynamic-fonts . [(0 6 4) ((font-utils (0 7 0)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Set faces based on available fonts" single ((:url . "http://github.com/rolandwalker/dynamic-fonts") (:keywords "faces" "frames"))]) (dvorak-mode . [(1 0 0) nil "Switch to dvorak layout easily" single ((:url . "https://github.com/proofit404/dvorak-mode"))]) (ducpel . [(0 1) ((cl-lib (0 5))) "Logic game with sokoban elements" tar ((:url . "https://github.com/alezost/ducpel") (:keywords "games"))]) (drupal-spell . [(0 2 2) nil "Aspell extra dictionary for Drupal" tar ((:url . "https://github.com/arnested/drupal-spell") (:keywords "wp"))]) (drupal-mode . [(0 5 0) ((php-mode (1 5 0))) "Advanced minor mode for Drupal development" tar ((:url . "https://github.com/arnested/drupal-mode") (:keywords "programming" "php" "drupal"))]) (drag-stuff . [(0 1 0) nil "Drag stuff (lines, words, region, etc...) around" tar nil]) (dispass . [(1 1 2) nil "Emacs wrapper for DisPass" single ((:url . "http://projects.ryuslash.org/dispass.el/") (:keywords "processes"))]) (discover . [(0 3) ((makey (0 3))) "discover more of Emacs" single nil]) (dired-k . [(0 10) ((cl-lib (0 5)) (emacs (24))) "highlight dired buffer by file size, modified time, git status" tar ((:url . "https://github.com/syohex/emacs-dired-k"))]) (dired-efap . [(0 8) nil "Edit Filename At Point in a dired buffer" single ((:keywords "dired" "environment" "files" "renaming"))]) (diminish . [(0 44) nil "Diminished modes are minor modes with no modeline display" single ((:url . "http://www.eskimo.com/~seldon") (:keywords "extensions" "diminish" "minor" "codeprose"))]) (dim-autoload . [(1 1 2) nil "dim complete autoload cookie lines" single ((:url . "http://github.com/tarsius/dim-autoload") (:keywords "convenience"))]) (digistar-mode . [(0 2) nil "major mode for Digistar scripts" single ((:keywords "languages"))]) (dictionary . [(1 10) nil "No description available." single nil]) (desktop-registry . [(1 2 0) nil "Keep a central registry of desktop files" single ((:url . "http://projects.ryuslash.org/desktop-registry/") (:keywords "convenience"))]) (demangle-mode . [(1 0) ((emacs (24)) (cl-lib (0 1))) "Automatically demangle C++ symbols" single ((:keywords "c" "tools"))]) (deft . [(0 5 1) nil "quickly browse, filter, and edit plain text notes" single ((:url . "http://jblevins.org/projects/deft/") (:keywords "plain text" "notes" "simplenote" "notational velocity"))]) (deferred . [(0 3 2) nil "Simple asynchronous functions for emacs lisp" single ((:url . "https://github.com/kiwanami/emacs-deferred") (:keywords "deferred" "async"))]) (dedicated . [(1 0 0) nil "A very simple minor mode for dedicated buffers" single ((:keywords "dedicated" "buffer"))]) (dash-functional . [(2 8 0) ((dash (2 0 0)) (emacs (24))) "Collection of useful combinators for Emacs Lisp" single ((:keywords "lisp" "functions" "combinators"))]) (dash . [(2 8 0) nil "A modern list library for Emacs" single ((:keywords "lists"))]) (dart-mode . [(0 9) nil "Major mode for editing Dart files" single ((:url . "http://code.google.com/p/dart-mode") (:keywords "language"))]) (d-mode . [(2 0 6) nil "D Programming Language mode for (X)Emacs" single ((:keywords "d" "programming" "language" "emacs" "cc-mode"))]) (cython-mode . [(0 21 1 1) nil "Major mode for editing Cython files" single nil]) (cyberpunk-theme . [(1 10) nil "Cyberpunk Color Theme" single ((:keywords "color" "theme" "cyberpunk"))]) (cuda-mode . [(1 0 0) nil "NVIDIA CUDA Major Mode" single ((:keywords "c" "languages"))]) (ctags-update . [(0 2 0) nil "(auto) update TAGS in parent directory using exuberant-ctags" single ((:url . "https://github.com/jixiuf/helm-etags-plus") (:keywords "exuberant-ctags" "etags"))]) (ctags . [(1 1 1) nil "No description available." single nil]) (ctable . [(0 1 2) nil "Table component for Emacs Lisp" single ((:url . "https://github.com/kiwanami/emacs-ctable") (:keywords "table"))]) (cryptol-mode . [(0 1 0) nil "Cryptol major mode for Emacs" single ((:url . "http://github.com/thoughtpolice/cryptol-mode") (:keywords "cryptol" "cryptography"))]) (creds . [(0 0 6 1) ((s (1 9 0)) (dash (2 5 0))) "A parser credentials file library (not limited to credentials entries)" tar nil]) (cpputils-cmake . [(0 4 14) nil "Easy real time C++ syntax check and intellisense if you use CMake" tar nil]) (cperl-mode . [(6 2) nil "Perl code editing commands for Emacs" single ((:keywords "languages" "perl"))]) (connection . [(1 10) nil "No description available." single nil]) (conkeror-minor-mode . [(1 6 1) nil "Mode for editing conkeror javascript files." single ((:url . "http://github.com/BruceConnor/conkeror-minor-mode") (:keywords "programming" "tools"))]) (concurrent . [(0 3 2) ((deferred (0 3 1))) "Concurrent utility functions for emacs lisp" single ((:url . "https://github.com/kiwanami/emacs-deferred/blob/master/README-concurrent.markdown") (:keywords "deferred" "async" "concurrent"))]) (company-tern . [(0 2 0) ((company (0 8 0)) (tern (0 0 1)) (dash (2 8 0)) (dash-functional (2 8 0)) (s (1 9 0)) (cl-lib (0 5 0))) "Tern backend for company-mode" single ((:url . "https://github.com/proofit404/company-tern"))]) (company-ghc . [(0 0 8) ((cl-lib (0 5)) (company (0 8 0)) (ghc (4 1 1)) (emacs (24))) "company-mode ghc-mod backend" single ((:url . "https://github.com/iquiw/company-ghc") (:keywords "haskell" "completion"))]) (company . [(0 8 2) ((emacs (24 1)) (cl-lib (0 5))) "Modular text completion framework" tar ((:url . "http://company-mode.github.io/") (:keywords "abbrev" "convenience" "matching"))]) (commander . [(0 7 0) ((s (1 6 0)) (dash (2 0 0)) (cl-lib (0 3)) (f (0 6 1))) "Emacs command line parser" single ((:url . "http://github.com/rejeep/commander.el") (:keywords "cli" "argv"))]) (colorsarenice-theme . [(1 0 12) ((emacs (24))) "A color theme." tar nil]) (color-theme-sanityinc-tomorrow . [(1 13) nil "A version of Chris Kempson's various Tomorrow themes" tar nil]) (color-theme-sanityinc-solarized . [(2 27) nil "A version of Ethan Schoonover's Solarized themes" tar nil]) (coffee-mode . [(0 5 5) ((emacs (24 1)) (cl-lib (0 5))) "Major mode to edit CoffeeScript files in Emacs" single ((:url . "http://github.com/defunkt/coffee-mode") (:keywords "coffeescript" "major" "mode"))]) (cmake-mode . [(3 0 1) nil "major-mode for editing CMake sources" single nil]) (cm-mode . [(1 1) nil "Minor mode for CriticMarkup" single ((:keywords "text" "markdown"))]) (clojure-test-mode . [(2 2 0) ((clojure-mode (1 7)) (cider (0 4 0))) "Minor mode for Clojure tests" single ((:url . "http://emacswiki.org/cgi-bin/wiki/ClojureTestMode") (:keywords "languages" "lisp" "test"))]) (clojure-mode . [(2 2 0) nil "Major mode for Clojure code" single ((:url . "http://github.com/clojure-emacs/clojure-mode") (:keywords "languages" "lisp"))]) (clojure-cheatsheet . [(0 2 2) ((helm (1 5 3)) (cider (0 1 8))) "The Clojure Cheatsheet for Emacs" single ((:url . "https://github.com/krisajenkins/clojure-cheatsheet") (:keywords "clojure" "nrepl" "cheatsheet" "helm"))]) (clj-refactor . [(0 12 0) ((s (1 8 0)) (dash (2 4 0)) (yasnippet (0 6 1)) (paredit (22)) (multiple-cursors (1 2 2))) "A collection of clojure refactoring functions" single ((:keywords "convenience"))]) (clips-mode . [(0 7) nil "Major mode for editing CLIPS code and REPL" tar nil]) (cl-lib-highlight . [(1 0 0) ((cl-lib (0 3))) "full cl-lib font-lock highlighting" single ((:url . "https://github.com/skeeto/cl-lib-highlight"))]) (cider . [(0 7 0) ((clojure-mode (2 0 0)) (cl-lib (0 3)) (dash (2 4 1)) (pkg-info (0 4)) (emacs (24))) "Clojure Integrated Development Environment and REPL" tar ((:url . "http://www.github.com/clojure-emacs/cider") (:keywords "languages" "clojure" "cider"))]) (charmap . [(0 0 1) nil "Unicode table for Emacs" single ((:url . "https://github.com/lateau/charmap") (:keywords "unicode" "character" "ucs"))]) (cfengine-code-style . [(3 6 1) nil "C code style for CFEngine project." single ((:url . "https://github.com/cfengine/core"))]) (cerbere . [(0 1 0) ((s (1 9 0)) (f (0 16 0)) (go-mode (20140409)) (pkg-info (0 5))) "Unit testing in Emacs for several programming languages" tar ((:url . "https://github.com/nlamirault/cerbere") (:keywords "python" "go" "php" "tests" "tdd"))]) (cdlatex . [(4 7) nil "Fast input methods for LaTeX environments and math" single ((:keywords "tex"))]) (cask . [(0 7 0) ((s (1 8 0)) (dash (2 2 0)) (f (0 16 0)) (epl (0 5)) (shut-up (0 1 0)) (cl-lib (0 3)) (package-build (0 1))) "Cask: Project management for Emacs package development" tar ((:url . "http://github.com/cask/cask") (:keywords "speed" "convenience"))]) (calfw . [(1 3) nil "Calendar view framework on Emacs" tar ((:keywords "calendar"))]) (cake2 . [(2 1 0) ((dash (2 6 0)) (s (1 9 0)) (f (0 16 2)) (ht (2 0)) (json (1 2)) (cake-inflector (1 1 0)) (historyf (0 0 8)) (anything (1 3 9))) "CakePHP2 Minor Mode" tar ((:url . "http://code.101000lab.org"))]) (cake-inflector . [(1 1 1) ((s (1 9 0))) "Lazy porting CakePHP infrector.php to el" single ((:url . "https://github.com/k1LoW/emacs-cake-inflector"))]) (cake . [(1 4 3) ((cake-inflector (1 1 0)) (historyf (0 0 8)) (anything (1 3 9))) "CakePHP Minor Mode" tar ((:url . "https://github.com/k1LoW/emacs-cake"))]) (cacoo . [(2 1 2) ((concurrent (0 3 1))) "Minor mode for Cacoo : http://cacoo.com" tar nil]) (button-lock . [(1 0 0) nil "Clickable text defined by regular expression" single ((:url . "http://github.com/rolandwalker/button-lock") (:keywords "mouse" "button" "hypermedia" "extensions"))]) (bundler . [(1 1 0) ((inf-ruby (2 1))) "Interact with Bundler from Emacs" single ((:url . "http://github.com/tobiassvn/") (:keywords "bundler" "ruby"))]) (bug-reference-github . [(0 2 0) nil "Automatically set `bug-reference-url-format' in Github repositories." single ((:url . "https://github.com/arnested/bug-reference-github") (:keywords "programming" "tools"))]) (bufshow . [(0 1 0) nil "No description available." single nil]) (buffer-utils . [(0 1 0) nil "Buffer-manipulation utility functions" single ((:url . "http://github.com/rolandwalker/buffer-utils") (:keywords "extensions"))]) (browse-url-dwim . [(0 6 8) ((string-utils (0 3 2))) "Context-sensitive external browse URL or Internet search" single ((:url . "http://github.com/rolandwalker/browse-url-dwim") (:keywords "hypermedia"))]) (browse-kill-ring . [(1 6 0) nil "interactively insert items from kill-ring" single ((:url . "https://github.com/browse-kill-ring/browse-kill-ring") (:keywords "convenience"))]) (bog . [(0 6 0) ((org (8 0 0)) (dash (2 5 0))) "Extensions for research notes in Org mode" single ((:url . "https://github.com/kyleam/bog") (:keywords "bibtex" "org-mode"))]) (birds-of-paradise-plus-theme . [(0 1 1) nil "A brown/orange light-on-dark theme for Emacs 24 (deftheme)." single ((:url . "https://github.com/jimeh/birds-of-paradise-plus-theme.el") (:keywords "themes"))]) (bind-key . [(20140601) nil "A simple way to manage personal keybindings" single ((:url . "https://github.com/jwiegley/use-package") (:keywords "keys" "keybinding" "config" "dotemacs"))]) (beeminder . [(1 0 0) nil "Emacs interface for Beeminder" single ((:keywords "beeminder"))]) (bbdb2erc . [(0 1 3) ((bbdb (3 0))) "make bbdb show if pal is online with ERC, click i to chat" single ((:keywords "irc" "contacts" "chat" "client" "internet"))]) (bbdb-vcard . [(0 3) nil "vCard import/export for BBDB" tar ((:url . "http://github.com/trebb/bbdb-vcard") (:keywords "data" "calendar" "mail" "news"))]) (bbcode-mode . [(2 0 0) nil "Major mode for writing BBCode markup" single ((:url . "https://github.com/ejmr/bbcode-mode"))]) (back-button . [(0 6 6) ((nav-flash (1 0 0)) (smartrep (0 0 3)) (ucs-utils (0 7 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Visual navigation through mark rings" single ((:url . "http://github.com/rolandwalker/back-button") (:keywords "convenience" "navigation" "interface"))]) (babel . [(1 4) nil "interface to web translation services such as Babelfish" single ((:keywords "translation" "web"))]) (autopair . [(0 6 1) ((cl-lib (0 3))) "Automagically pair braces and quotes like TextMate" single ((:url . "http://autopair.googlecode.com") (:keywords "convenience" "emulations"))]) (auto-shell-command . [(1 0 0) ((deferred (20130312)) (popwin (20130329))) "Run the shell command asynchronously that you specified when you save the file." single ((:keywords "shell" "save" "async" "deferred" "auto"))]) (auto-indent-mode . [(0 126) nil "Auto indent Minor mode" tar ((:url . "https://github.com/mlf176f2/auto-indent-mode.el/") (:keywords "auto" "indentation"))]) (auto-dictionary . [(1 1) nil "automatic dictionary switcher for flyspell" single ((:url . "http://nschum.de/src/emacs/auto-dictionary/") (:keywords "wp"))]) (auto-complete-exuberant-ctags . [(0 0 7) ((auto-complete (1 4 0))) "Exuberant ctags auto-complete.el source" single ((:url . "http://code.101000lab.org") (:keywords "anto-complete" "exuberant ctags"))]) (auto-complete-clang-async . [(0 5) nil "Auto Completion source for clang for GNU Emacs" single ((:keywords "completion" "convenience"))]) (auto-complete . [(1 4 0) ((popup (0 5 0))) "Auto Completion for GNU Emacs" tar nil]) (auto-compile . [(1 2 1) ((cl-lib (0 2)) (packed (0 3 4))) "automatically compile Emacs Lisp libraries" single ((:url . "http://tarsius.github.com/auto-compile") (:keywords "compile" "convenience" "lisp"))]) (aurel . [(0 6) nil "Search, get info, vote and download AUR packages" single ((:url . "https://github.com/alezost/aurel") (:keywords "tools"))]) (apples-mode . [(0 0 2) nil "Major mode for editing and executing AppleScript code" tar ((:keywords "applescript" "languages"))]) (anzu . [(0 36) ((cl-lib (0 5)) (emacs (24))) "Show number of matches in mode-line while searching" single ((:url . "https://github.com/syohex/emacs-anzu"))]) (anything-replace-string . [(0 9 2) ((anything (1 3 9))) "`replace-string' and `query-replace' `anything.el' interface" single ((:url . "http://code.101000lab.org"))]) (anything-exuberant-ctags . [(0 1 2) ((anything (1 3 9))) "Exuberant ctags anything.el interface" single ((:url . "http://code.101000lab.org") (:keywords "anything" "exuberant ctags"))]) (anything . [(1 3 9) nil "open anything / QuickSilver-like candidate-selection framework" tar ((:url . "http://repo.or.cz/w/anything-config.git") (:keywords "files" "frames" "help" "matching" "outlines" "processes" "tools" "convenience" "anything"))]) (anyins . [(0 1 1) nil "Insert content at multiple places from shell command or kill-ring" single ((:url . "http://github.com/antham/anyins") (:keywords "insert" "rectangular"))]) (anti-zenburn-theme . [(2 1) nil "Low-contrast Zenburn-inverted theme" single ((:url . "https://github.com/m00natic/anti-zenburn-theme"))]) (ansible . [(0 0 2) ((s (1 9 0)) (f (0 16 2))) "Ansible minor mode" tar ((:url . "http://101000lab.org"))]) (ansi . [(0 2 1) ((s (1 6 1)) (dash (1 5 0))) "Turn string into ansi strings" single ((:url . "http://github.com/rejeep/ansi") (:keywords "color" "ansi"))]) (angular-snippets . [(0 2 3) ((s (1 4 0)) (dash (1 2 0))) "Yasnippets for AngularJS" tar nil]) (anaphora . [(1 0 0) nil "anaphoric macros providing implicit temp variables" single ((:url . "http://github.com/rolandwalker/anaphora") (:keywords "extensions"))]) (anaconda-mode . [(0 1 0) nil "No description available." tar nil]) (alect-themes . [(0 6) nil "Configurable color themes (light, dark and black) for Emacs 24" tar nil]) (ag . [(0 44) nil "A front-end for ag ('the silver searcher'), the C ack replacement." single nil]) (aes . [(0 6) nil "Implementation of AES" single ((:url . "https://github.com/gaddhi/aes") (:keywords "data" "tools"))]) (adoc-mode . [(0 6 2) ((markup-faces (1 0 0))) "a major-mode for editing AsciiDoc files in Emacs" single ((:url . "https://github.com/sensorflo/adoc-mode/wiki") (:keywords "wp" "asciidoc"))]) (actionscript-mode . [(7 2 2) nil "A simple mode for editing Actionscript 3 files" single ((:keywords "language" "modes"))]) (ack-menu . [(0 2 3) nil "No description available." tar]) (ack-and-a-half . [(1 2 0) nil "Yet another front-end for ack" single ((:url . "http://technosorcery.net"))]) (ace-window . [(0 4 0) ((ace-jump-mode (2 0))) "Quickly switch windows using `ace-jump-mode'." single ((:url . "https://github.com/abo-abo/ace-window") (:keywords "cursor" "window" "location"))]) (ace-jump-mode . [(2 0) nil "a quick cursor location minor mode for emacs" single ((:url . "https://github.com/winterTTr/ace-jump-mode/") (:keywords "motion" "location" "cursor"))]) (ac-slime . [(0 5) nil "An auto-complete source using slime completions" single ((:url . "https://github.com/purcell/ac-slime"))]) (ac-octave . [(0 4) ((auto-complete (1 4 0))) "An auto-complete source for Octave" single ((:url . "https://github.com/coldnew/ac-octave") (:keywords "octave" "auto-complete" "completion"))]) (ac-nrepl . [(0 21) ((cider (0 1)) (auto-complete (1 4))) "auto-complete sources for Clojure using nrepl completions" single ((:url . "https://github.com/purcell/ac-nrepl") (:keywords "languages" "clojure" "nrepl"))]) (ac-ispell . [(0 6) ((auto-complete (1 4))) "ispell completion source for auto-complete" single ((:url . "https://github.com/syohex/emacs-ac-ispell"))]) (ac-inf-ruby . [(0 4) ((inf-ruby (2 3 2)) (auto-complete (1 4))) "Enable auto-complete in inf-ruby sessions" single ((:keywords "languages" "tools"))]) (ac-helm . [(2 1) ((helm (20130328)) (auto-complete (1 4 0)) (popup (0 5 0))) "Auto Complete with Helm" single ((:keywords "completion" "convenience" "helm"))]) (ac-geiser . [(0 1) ((geiser (0 5)) (auto-complete (1 4))) "Auto-complete backend for geiser" tar nil]) (ac-etags . [(0 6) ((auto-complete (1 4))) "etags/ctags completion source for auto-complete" single ((:url . "https://github.com/syohex/emacs-ac-etags"))]) (ac-cider . [(0 2 0) ((cider (0 6 0)) (auto-complete (1 4))) "Clojure auto-complete sources using CIDER" single ((:url . "https://github.com/clojure-emacs/ac-cider") (:keywords "languages" "clojure" "nrepl" "cider" "compliment"))]) (ac-cake2 . [(1 0 1) ((cake2 (1 1 2)) (auto-complete (1 4 0))) "CakePHP 2 Minor Mode auto-complete.el source" single ((:url . "http://code.101000lab.org"))]) (ac-cake . [(1 0 0) ((cake (1 4 2)) (auto-complete (1 4))) "CakePHP Minor Mode auto-complete.el source" single ((:url . "http://code.101000lab.org"))]) (abc-mode . [(20140225 944) nil "Major mode for editing abc music files" single ((:keywords "local" "docs"))])) +(1 (zygospore . [(0 0 3) nil "reversible C-x 1 (delete-other-windows)" single ((:url . "https://github.com/louiskottmann/zygospore.el"))]) (zenburn-theme . [(2 0) nil "A low contrast color theme for Emacs." single ((:url . "http://github.com/bbatsov/zenburn-emacs"))]) (yasnippet . [(0 9 0 1) nil "Yet another snippet extension for Emacs." tar ((:url . "http://github.com/capitaomorte/yasnippet") (:keywords "convenience" "emulation"))]) (yascroll . [(0 1) nil "Yet Another Scroll Bar Mode" single ((:keywords "convenience"))]) (yagist . [(0 8 10) ((json (1 2 0))) "Yet Another Emacs integration for gist.github.com" single ((:url . "https://github.com/mhayashi1120/yagist.el/raw/master/yagist.el") (:keywords "gist" "git" "github" "paste" "pastie" "pastebin"))]) (yafolding . [(0 1 4) nil "Yet another folding extension for Emacs" single ((:keywords "folding"))]) (xterm-color . [(1 0) nil "ANSI & XTERM 256 color support" single nil]) (xcscope . [(1 1) nil "cscope interface for (X)Emacs" single ((:url . "https://github.com/dkogan/xcscope.el") (:keywords "languages" "c"))]) (ws-butler . [(0 3) nil "Unobtrusively remove trailing whitespace." single ((:url . "https://github.com/lewang/ws-butler"))]) (writeroom-mode . [(2 5) nil "Minor mode for distraction-free writing" tar ((:keywords "text"))]) (writegood-mode . [(2 0) nil "Polish up poor writing on the fly" single ((:url . "http://github.com/bnbeckwith/writegood-mode") (:keywords "writing" "weasel-words" "grammar"))]) (wrap-region . [(0 7 3) ((dash (1 0 3))) "Wrap text with punctation or tag" single ((:url . "http://github.com/rejeep/wrap-region") (:keywords "speed" "convenience"))]) (wonderland . [(0 1 1) ((dash (2 0 0)) (dash-functional (1 0 0)) (multi (2 0 0)) (emacs (24))) "declarative configuration for Emacsen" single ((:url . "http://github.com/kurisuwhyte/emacs-wonderland") (:keywords "configuration" "profile" "wonderland"))]) (wispjs-mode . [(0 2 0) ((clojure-mode (0))) "Major mode for Wisp code." single ((:url . "https://github.com/krisajenkins/wispjs-mode"))]) (wisp-mode . [(0 6 4) nil "Tools for wisp: the Whitespace-to-Lisp preprocessor" single ((:keywords "languages" "lisp"))]) (windsize . [(0 1) nil "Simple, intuitive window resizing" single ((:url . "http://github.com/grammati/windsize") (:keywords "window" "resizing" "convenience"))]) (window-numbering . [(1 1 2) nil "No description available." single nil]) (window-layout . [(1 2) nil "window layout manager" single ((:keywords "window" "layout"))]) (window-end-visible . [(0 1 0) nil "Find the last visible point in a window" single ((:url . "http://github.com/rolandwalker/window-end-visible") (:keywords "extensions"))]) (wiki-nav . [(1 0 0) ((button-lock (1 0 0)) (nav-flash (1 0 0))) "Simple file navigation using [[WikiStrings]]" single ((:url . "http://github.com/rolandwalker/button-lock") (:keywords "mouse" "button" "hypermedia" "navigation"))]) (whitespace-cleanup-mode . [(0 9) nil "Intelligently call whitespace-cleanup on save" single ((:url . "https://github.com/purcell/whitespace-cleanup-mode") (:keywords "convenience"))]) (weechat . [(0 2) ((s (1 3 1)) (cl-lib (0 2)) (emacs (24)) (tracking (1 2))) "Chat via WeeChat's relay protocol in Emacs" tar nil]) (web-mode . [(10) nil "major mode for editing html templates" single ((:url . "http://web-mode.org") (:keywords "html" "template" "javascript" "css" "web" "php" "django" "erb" "jsp"))]) (wcheck-mode . [(2014 6 21) nil "General interface for text checkers" tar nil]) (wc-goal-mode . [(2 1) nil "Running word count with goals (minor mode)" single ((:url . "https://github.com/bnbeckwith/wc-goal-mode"))]) (wacspace . [(0 4 2) ((dash (1 2 0)) (cl-lib (0 2))) "The WACky WorkSPACE manager for emACS" tar nil]) (vlf . [(1 6) nil "View Large Files" tar ((:url . "https://github.com/m00natic/vlfi") (:keywords "large files" "utilities"))]) (vimgolf . [(0 10 0) nil "VimGolf interface for the One True Editor" single ((:keywords "games" "vimgolf" "vim"))]) (vim-region . [(0 3 0) ((expand-region (20140127))) "Select region as vim" single ((:url . "https://github.com/ongaeshi/emacs-vim-region"))]) (vector-utils . [(0 1 2) nil "Vector-manipulation utility functions" single ((:url . "http://github.com/rolandwalker/vector-utils") (:keywords "extensions"))]) (vcomp . [(0 3 1) nil "compare version strings" single ((:url . "https://github.com/tarsius/vcomp") (:keywords "versions"))]) (uzumaki . [(0 1) ((cl-lib (0 5))) "A simple buffer cycler" single ((:url . "http://github.com/geyslan/uzumaki") (:keywords "buffer" "convenience"))]) (utop . [(1 15) ((emacs (24))) "Universal toplevel for OCaml" single ((:url . "https://github.com/diml/utop") (:keywords "ocaml" "languages"))]) (use-package . [(20140601) ((bind-key (1 0)) (diminish (0 44))) "A use-package declaration for simplifying your .emacs" single ((:url . "https://github.com/jwiegley/use-package") (:keywords "dotemacs" "startup" "speed" "config" "package"))]) (unicode-whitespace . [(0 2 4) ((ucs-utils (0 7 6)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "teach whitespace-mode about fancy characters" single ((:url . "http://github.com/rolandwalker/unicode-whitespace") (:keywords "faces" "wp" "interface"))]) (unicode-progress-reporter . [(0 5 4) ((emacs (24 1 0)) (ucs-utils (0 7 6)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Progress-reporter with fancy characters" single ((:url . "http://github.com/rolandwalker/unicode-progress-reporter") (:keywords "interface"))]) (unicode-fonts . [(0 4 2) ((font-utils (0 7 2)) (ucs-utils (0 8 0)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Configure Unicode fonts" single ((:url . "http://github.com/rolandwalker/unicode-fonts") (:keywords "i18n" "faces" "frames" "wp" "interface"))]) (unicode-enbox . [(0 1 4) ((string-utils (0 3 2)) (ucs-utils (0 7 6)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Surround a string with box-drawing characters" single ((:url . "http://github.com/rolandwalker/unicode-enbox") (:keywords "extensions" "interface"))]) (unfill . [(0 1) nil "The inverse of fill-paragraph and fill-region" single ((:keywords "utilities"))]) (underwater-theme . [(1 1 0) nil "A gentle, deep blue color theme" single ((:keywords "faces"))]) (undercover . [(0 2 0) ((emacs (24)) (dash (2 0 0)) (shut-up (0 3 2))) "Test coverage library for Emacs" single ((:url . "https://github.com/sviridov/undercover.el") (:keywords "lisp" "tests" "coverage" "tools"))]) (ucs-utils . [(0 8 0) ((persistent-soft (0 8 8)) (pcache (0 2 3)) (list-utils (0 4 2))) "Utilities for Unicode characters" tar ((:url . "http://github.com/rolandwalker/ucs-utils") (:keywords "i18n" "extensions"))]) (typo . [(1 1) nil "Minor mode for typographic editing" single ((:url . "https://github.com/jorgenschaefer/typoel") (:keywords "convenience" "wp"))]) (twittering-mode . [(2 0 0) nil "Major mode for Twitter" single ((:url . "http://twmode.sf.net/") (:keywords "twitter" "web"))]) (twilight-anti-bright-theme . [(0 3 0) nil "A soothing Emacs 24 light-on-dark theme" single ((:url . "https://github.com/jimeh/twilight-anti-bright-theme.el") (:keywords "themes"))]) (tup-mode . [(1 3 1) nil "Major mode for editing files for Tup" single ((:url . "https://github.com/ejmr/tup-mode"))]) (tumble . [(1 5) nil "an Tumblr mode for Emacs" single ((:keywords "tumblr"))]) (tuareg . [(2 0 8) ((caml (3 12 0 1))) "OCaml mode for Emacs." tar ((:url . "http://forge.ocamlcore.org/projects/tuareg/") (:keywords "ocaml" "languages"))]) (ttrss . [(1 7 5) ((emacs (23 1))) "Tiny Tiny RSS elisp bindings" single ((:url . "https://github.com/pedros/ttrss.el") (:keywords "news" "local"))]) (truthy . [(0 2 8) ((list-utils (0 4 2))) "Test the content of a value" single ((:url . "http://github.com/rolandwalker/truthy") (:keywords "extensions"))]) (traad . [(0 4) nil "emacs interface to the traad refactoring server." single ((:url . "https://github.com/abingham/traad"))]) (thrift . [(0 9 1) nil "No description available." single nil]) (theme-changer . [(2 1 0) nil "Sunrise/Sunset Theme Changer for Emacs" single ((:url . "https://github.com/hadronzoo/theme-changer") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset"))]) (textmate-to-yas . [(0 21) nil "Import Textmate macros into yasnippet syntax" tar ((:url . "https://github.com/mlf176f2/textmate-to-yas.el/") (:keywords "yasnippet" "textmate"))]) (textmate . [(1) nil "No description available." single nil]) (test-case-mode . [(0 1 9) nil "unit test front-end" single ((:url . "http://nschum.de/src/emacs/test-case-mode/") (:keywords "tools"))]) (terraform-mode . [(0 1) ((cl-lib (0 5))) "Major mode for terraform configuration file" single ((:url . "https://github.com/syohex/emacs-terraform-mode"))]) (tern-auto-complete . [(0 6 2) ((tern (0 0 1)) (auto-complete (1 4)) (cl-lib (0 5)) (emacs (24))) "Tern Completion by auto-complete.el" single nil]) (tern . [(0 6 2) ((json (1 2)) (cl-lib (0 5)) (emacs (24))) "Tern-powered JavaScript integration" single ((:url . "http://ternjs.net/"))]) (tempbuf . [(1 4) nil "kill unused buffers in the background" single ((:keywords "convenience"))]) (tagedit . [(1 4 0) ((s (1 3 1)) (dash (1 0 3))) "Some paredit-like features for html-mode" single ((:keywords "convenience"))]) (tabbar-ruler . [(0 40) ((tabbar (2 0 1))) "Pretty tabbar, autohide, use both tabbar/ruler" tar ((:url . "http://github.com/mlf176f2/tabbar-ruler.el") (:keywords "tabbar" "ruler mode" "menu" "tool bar."))]) (system-specific-settings . [(0 2) nil "Apply settings only on certain systems" single ((:url . "https://github.com/DarwinAwardWinner/emacs-system-specific-settings") (:keywords "configuration"))]) (syntactic-sugar . [(0 9 4) nil "Effect-free forms such as if/then/else" single ((:url . "http://github.com/rolandwalker/syntactic-sugar") (:keywords "extensions"))]) (swift-mode . [(0 2 0) ((emacs (24 1))) "Major-mode for Apple's Swift programming language." single nil]) (svg-mode-line-themes . [(0 1 1) ((xmlgen (0 4))) "SVG-based themes for mode-line" tar ((:url . "https://github.com/sabof/svg-mode-line-themes"))]) (suomalainen-kalenteri . [(2014 6 15) nil "Finnish national and Christian holidays for calendar" tar nil]) (sudden-death . [(0 2) nil "Totsuzen-no-Shi" single ((:url . "https://github.com/yewton/sudden-death.el"))]) (subshell-proc . [(0 1) nil "Functions for working with comints" single ((:url . "https://github.com/andrewmains12/subshell-proc"))]) (stumpwm-mode . [(0 9 8) nil "special lisp mode for evaluating code into running stumpwm" single ((:keywords "comm" "lisp" "tools"))]) (stripe-buffer . [(0 2 3) ((cl-lib (1 0))) "Use a different background for even and odd lines" single ((:url . "https://github.com/sabof/stripe-buffer"))]) (string-utils . [(0 3 2) ((list-utils (0 4 2))) "String-manipulation utilities" single ((:url . "http://github.com/rolandwalker/string-utils") (:keywords "extensions"))]) (string-edit . [(0 1 0) ((dash (1 2 0))) "Avoid escape nightmares by editing string in separate buffer" single nil]) (stgit . [(0 17 1) nil "No description available." single nil]) (stekene-theme . [(1 0 12) ((emacs (24))) "The stekene dark and light color themes." tar nil]) (starter-kit-ruby . [(2 0 3) ((inf-ruby (2 2 1)) (starter-kit (2 0 1))) "Saner defaults and goodies for Ruby" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-perl . [(2 0 3) nil "Some helpful Perl code" single nil]) (starter-kit-lisp . [(2 0 3) ((starter-kit (2 0 2)) (elisp-slime-nav (0 1))) "Saner defaults and goodies for lisp languages" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-js . [(2 0 3) ((starter-kit (2 0 1))) "Saner defaults and goodies for Javascript" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-eshell . [(2 0 3) nil "Saner defaults and goodies: eshell tweaks" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit-bindings . [(2 0 3) ((starter-kit (2 0 2))) "Saner defaults and goodies: bindings" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/StarterKit") (:keywords "convenience"))]) (starter-kit . [(2 0 3) ((paredit (22)) (idle-highlight-mode (1 1 1)) (find-file-in-project (3 0)) (smex (1 1 1)) (ido-ubiquitous (0 3)) (magit (0 8 1))) "Saner defaults and goodies." tar nil]) (stan-snippets . [(2 4 1) ((yasnippet (0 8 0)) (stan-mode (2 4 1))) "Yasnippets for Stan" tar ((:url . "http://github.com/stan-dev/stan-mode") (:keywords "languages"))]) (stan-mode . [(2 4 1) nil "Major mode for editing Stan files" tar ((:url . "http://github.com/stan-dev/stan-mode") (:keywords "languanges"))]) (sprintly-mode . [(0 0 4) ((furl (0 0 2))) "Major mode for dealing with sprint.ly" single ((:url . "https://github.com/sprintly/sprintly-mode"))]) (sparql-mode . [(0 9 2) nil "Edit and interactively evaluate SPARQL queries." tar ((:url . "https://github.com/ljos/sparql-mode"))]) (sourcetalk . [(1 2 0) ((request (0 2 0))) "SourceTalk (http://sourcetalk.net) plugin for Emacs" single ((:url . "https://github.com/malroc/sourcetalk_emacs") (:keywords "sourcetalk" "code" "discussion"))]) (sourcemap . [(0 2) ((cl-lib (0 5)) (emacs (24))) "Sourcemap parser" single ((:url . "https://github.com/syohex/emacs-sourcemap"))]) (solarized-theme . [(1 2 0) ((dash (2 6 0))) "The Solarized color theme, ported to Emacs." tar nil]) (smex . [(3 0) nil "M-x interface with Ido-style fuzzy matching." single ((:url . "http://github.com/nonsequitur/smex/") (:keywords "convenience" "usability"))]) (smeargle . [(0 1) ((cl-lib (0 5)) (emacs (24))) "Highlighting region by last updated time" single ((:url . "https://github.com/syohex/emacs-smeargle"))]) (smartscan . [(0 2) nil "Jumps between other symbols found at point" single ((:keywords "extensions"))]) (smartrep . [(0 0 3) nil "Support sequential operation which omitted prefix keys." single ((:url . "https://github.com/myuhe/smartrep.el") (:keywords "convenience"))]) (smart-tabs-mode . [(1 0) nil "Intelligently indent with tabs, align with spaces!" single ((:url . "http://www.emacswiki.org/emacs/SmartTabs") (:keywords "languages"))]) (smart-mode-line-powerline-theme . [(2 6) ((emacs (24 3)) (powerline (2 3)) (smart-mode-line (2 5))) "smart-mode-line theme that mimics the powerline appearance." single ((:url . "http://github.com/Bruce-Connor/smart-mode-line"))]) (smart-mode-line . [(2 6) ((emacs (24 3)) (dash (2 2 0)) (rich-minority (0 1))) "A color coded smart mode-line." tar ((:url . "http://github.com/Bruce-Connor/smart-mode-line") (:keywords "mode-line" "faces" "theme" "themes"))]) (sly . [(2 9) nil "No description available." tar nil]) (slime-volleyball . [(1 1) nil "An SVG Slime Volleyball Game" tar ((:keywords "games"))]) (slime-ritz . [(0 6 0) nil "slime extensions for ritz" single ((:url . "https://github.com/pallet/ritz") (:keywords "languages" "lisp" "slime"))]) (slime-company . [(0 8) ((slime (2 3 2)) (company (0 7))) "slime completion backend for company mode" single ((:keywords "convenience" "lisp" "abbrev"))]) (slime . [(2 10 1) ((cl-lib (0 5))) "Superior Lisp Interaction Mode for Emacs" tar ((:url . "https://github.com/slime/slime") (:keywords "languages" "lisp" "slime"))]) (slim-mode . [(1 1) nil "Major mode for editing Slim files" single ((:url . "http://github.com/minad/emacs-slim") (:keywords "markup" "language"))]) (slideview . [(0 6 1) nil "File slideshow" single ((:url . "https://github.com/mhayashi1120/Emacs-slideview/raw/master/slideview.el") (:keywords "files"))]) (slamhound . [(1 5 4) nil "Rip Clojure namespaces apart and rebuild them." single ((:url . "https://github.com/technomancy/slamhound") (:keywords "tools" "lisp"))]) (skewer-mode . [(1 6 1) ((simple-httpd (1 4 0)) (js2-mode (20090723)) (emacs (24))) "live browser JavaScript, CSS, and HTML interaction" tar nil]) (skewer-less . [(0 2) ((skewer-mode (1 5 3))) "Skewer support for live LESS stylesheet updates" single ((:keywords "languages" "tools"))]) (skeletor . [(1 4) ((s (1 7 0)) (f (0 14 0)) (dash (2 2 0)) (cl-lib (0 3)) (emacs (24 1))) "Provides project skeletons for Emacs" tar nil]) (simplezen . [(0 1 1) nil "A simple subset of zencoding-mode for Emacs." single nil]) (simpleclip . [(1 0 0) nil "Simplified access to the system clipboard" single ((:url . "http://github.com/rolandwalker/simpleclip") (:keywords "convenience"))]) (simple-httpd . [(1 4 5) ((cl-lib (0 3))) "pure elisp HTTP server" single ((:url . "https://github.com/skeeto/emacs-http-server"))]) (shut-up . [(0 3 2) ((cl-lib (0 3)) (emacs (24))) "Shut up would you!" single ((:url . "http://github.com/rejeep/shut-up.el"))]) (shm . [(1 0 1) nil "No description available." tar nil]) (shell-pop . [(0 3) nil "helps you to use shell easily on Emacs. Only one key action to work." single ((:url . "http://github.com/kyagi/shell-pop-el") (:keywords "shell" "terminal" "tools"))]) (shampoo . [(0 0 1) nil "Shampoo, a remote Smalltalk developemnt" tar nil]) (session . [(2 3 1) nil "use variables, registers and buffer places across sessions" single ((:url . "http://emacs-session.sourceforge.net/") (:keywords "session" "session management" "desktop" "data" "tools"))]) (serverspec . [(0 0 4) ((dash (2 6 0)) (s (1 9 0)) (f (0 16 2)) (helm (1 6 1))) "Serverspec minor mode" tar ((:url . "http://101000lab.org"))]) (servant . [(0 3 0) ((s (1 8 0)) (dash (2 2 0)) (f (0 11 0)) (ansi (0 3 0)) (commander (0 5 0)) (epl (0 2)) (shut-up (0 2 1)) (web-server (0 0 1))) "ELPA server written in Emacs Lisp" tar ((:url . "http://github.com/rejeep/servant.el") (:keywords "elpa" "server"))]) (sekka . [(1 5 7) ((cl-lib (0 3)) (concurrent (0 3 1)) (popup (0 5 0))) "A client for Sekka IME server" single ((:url . "https://github.com/kiyoka/sekka") (:keywords "ime" "skk" "japanese"))]) (scss-mode . [(0 5 0) nil "Major mode for editing SCSS files" single ((:url . "https://github.com/antonj/scss-mode") (:keywords "scss" "css" "mode"))]) (scala-mode . [(2 11 3) nil "Major mode for editing Scala code." tar ((:keywords "scala" "languages" "oop"))]) (save-sexp . [(0 2 0) nil "save variables in files using setter forms like `setq'" tar ((:url . "https://github.com/tarsius/save-sexp") (:keywords "convenience"))]) (sauron . [(0 10) nil "Track (erc/org/dbus/...) events and react to them." tar nil]) (sass-mode . [(3 0 18) ((haml-mode (3 0 15))) "Major mode for editing Sass files" single ((:url . "http://github.com/nex3/haml/tree/master") (:keywords "markup" "language" "css"))]) (sackspace . [(0 8 2) nil "A better backspace" single ((:url . "http://github.com/cofi/sackspace.el") (:keywords "delete" "convenience"))]) (s . [(1 9 0) nil "The long lost Emacs string manipulation library." single ((:keywords "strings"))]) (rvm . [(1 3 0) nil "Emacs integration for rvm" single ((:url . "http://www.emacswiki.org/emacs/RvmEl") (:keywords "ruby" "rvm"))]) (rust-mode . [(0 12 0) nil "A major emacs mode for editing Rust source code" single ((:url . "https://github.com/rust-lang/rust") (:keywords "languages"))]) (ruby-tools . [(0 1 2) nil "Collection of handy functions for ruby-mode." tar nil]) (ruby-test-mode . [(1 0) nil "Minor mode for Behaviour and Test Driven" single ((:keywords "ruby" "unit" "test" "rspec"))]) (ruby-hash-syntax . [(0 4) nil "Toggle ruby hash syntax between classic and 1.9 styles" single ((:url . "https://github.com/purcell/ruby-hash-syntax") (:keywords "languages"))]) (ruby-end . [(0 4 0) nil "Automatic insertion of end blocks for Ruby" single ((:url . "http://github.com/rejeep/ruby-end") (:keywords "speed" "convenience" "ruby"))]) (ruby-compilation . [(2 11) ((inf-ruby (2 2 1))) "run a ruby process in a compilation buffer" single ((:url . "https://github.com/eschulte/rinari") (:keywords "test" "convenience"))]) (rtags . [(1 1) nil "No description available." tar nil]) (rspec-mode . [(1 11) ((ruby-mode (1 0)) (cl-lib (0 4))) "Enhance ruby-mode for RSpec" tar ((:url . "http://github.com/pezra/rspec-mode") (:keywords "rspec" "ruby"))]) (rsense . [(0 3) nil "RSense client for Emacs" single ((:keywords "convenience"))]) (roguel-ike . [(0 1 0) ((popup (0 5 0))) "A coffee-break roguelike" tar nil]) (rnc-mode . [(1 0 6) nil "A major mode for editing RELAX NG Compact syntax." single nil]) (rinari . [(2 11) ((ruby-mode (1 0)) (inf-ruby (2 2 5)) (ruby-compilation (0 16)) (jump (2 0))) "Rinari Is Not A Rails IDE" single ((:url . "https://github.com/eschulte/rinari") (:keywords "ruby" "rails" "project" "convenience" "web"))]) (rich-minority . [(0 1 1) ((cl-lib (0 5))) "Clean-up and Beautify the list of minor-modes." single ((:url . "http://github.com/Bruce-Connor/rich-minority") (:keywords "mode-line" "faces"))]) (reveal-in-finder . [(0 3 1) nil "Reveal the file associated with the buffer in the OS X Finder" single ((:url . "https://github.com/kaz-yos/elisp") (:keywords "os x" "finder"))]) (request-deferred . [(0 1 0) nil "Wrap request.el by deferred" single nil]) (request . [(0 1 0) nil "Compatible layer for URL request in Emacs" single nil]) (req-package . [(0 5) ((use-package (1 0)) (dash (2 7 0)) (log4e (0 2 0))) "A use-package wrapper for package runtime dependencies management" single ((:url . "https://github.com/edvorg/req-package") (:keywords "dotemacs" "startup" "speed" "config" "package"))]) (relax . [(0 2) ((json (1 2))) "For browsing and interacting with CouchDB" single ((:url . "http://github.com/technomancy/relax.el") (:keywords "database" "http"))]) (relative-line-numbers . [(0 3) ((emacs (24))) "Display relative line numbers on the margin" single ((:url . "https://github.com/Fanael/relative-line-numbers"))]) (rbenv . [(0 0 3) nil "Emacs integration for rbenv" single ((:url . "https://github.com/senny/rbenv.el") (:keywords "ruby" "rbenv"))]) (rase . [(1 1) nil "Run At Sun Event daemon" single ((:url . "https://github.com/m00natic/rase/") (:keywords "solar" "sunrise" "sunset" "midday" "midnight"))]) (rainbow-identifiers . [(0 2 1) ((emacs (24))) "Highlight identifiers according to their names" single ((:url . "https://github.com/Fanael/rainbow-identifiers"))]) (rainbow-delimiters . [(1 3 12) nil "Highlight nested parens, brackets, braces a different color at each depth." single ((:url . "http://github.com/jlr/rainbow-delimiters/raw/master/rainbow-delimiters.el") (:keywords "faces" "convenience" "lisp" "matching" "tools" "rainbow" "rainbow parentheses" "rainbow parens"))]) (r-autoyas . [(0 28) nil "Provides automatically created yasnippets for R function argument lists." tar ((:url . "https://github.com/mlf176f2/r-autoyas.el") (:keywords "r" "yasnippet"))]) (quickrun . [(2 1 0) nil "Run commands quickly" single ((:url . "https://github.com/syohex/emacs-quickrun"))]) (qml-mode . [(0 1) nil "Major mode for editing QT Declarative (QML) code." single ((:url . "https://github.com/coldnew/qml-mode") (:keywords "qml" "qt" "qt declarative"))]) (qiita . [(0 0 1) nil "No description available." single nil]) (pyvenv . [(1 3) nil "Python virtual environment interface" single ((:url . "http://github.com/jorgenschaefer/pyvenv") (:keywords "python" "virtualenv" "tools"))]) (python-environment . [(0 0 1) ((deferred (0 3 1))) "virtualenv API for Emacs Lisp" tar ((:keywords "applications" "tools"))]) (pushbullet . [(0 5 2) ((grapnel (0 5 2)) (json (1 2))) "Emacs client for the PushBullet Android app" single ((:url . "http://www.github.com/theanalyst/revolver") (:keywords "convenience"))]) (puppet-mode . [(0 3) ((emacs (24 1)) (cl-lib (0 5)) (pkg-info (0 4))) "Major mode for Puppet manifests" single ((:url . "https://github.com/lunaryorn/puppet-mode") (:keywords "languages"))]) (pungi . [(0 9 5) ((jedi (0 2 0 -3 2))) "Integrates jedi with virtualenv and buildout python environments" single ((:keywords "convenience"))]) (projectile . [(0 11 0) ((s (1 6 0)) (dash (1 5 0)) (pkg-info (0 4))) "Manage and navigate projects in Emacs easily" single ((:url . "https://github.com/bbatsov/projectile") (:keywords "project" "convenience"))]) (project-root . [(0 7) nil "Define a project root and take actions based upon it." single nil]) (project-explorer . [(0 13 4) ((cl-lib (0 3)) (es-lib (0 3)) (es-windows (0 1)) (emacs (24))) "A project explorer sidebar" single ((:url . "https://github.com/sabof/project-explorer"))]) (prodigy . [(0 6 0) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (emacs (24))) "Manage external services from within Emacs" single ((:url . "http://github.com/rejeep/prodigy.el"))]) (processing-mode . [(1 0) ((yasnippet (0 8 0))) "Major mode for Processing 2.0" single ((:keywords "languages" "snippets"))]) (pretty-mode . [(2 0 2) nil "Redisplay parts of the buffer as pretty symbols." single ((:url . "https://github.com/akatov/pretty-mode") (:keywords "pretty" "unicode" "symbols"))]) (powerline . [(2 2) ((cl-lib (0 2))) "Rewrite of Powerline" tar ((:url . "http://github.com/milkypostman/powerline/") (:keywords "mode-line"))]) (pov-mode . [(3 3) nil "Major mode for editing POV-Ray scene files." tar nil]) (popwin . [(0 6 2) nil "Popup Window Manager." single ((:keywords "convenience"))]) (popup . [(0 5 0) ((cl-lib (0 3))) "Visual Popup User Interface" single ((:keywords "lisp"))]) (plenv . [(0 32) nil "A plenv wrapper for Emacs" single ((:keywords "emacs" "perl"))]) (pkgbuild-mode . [(0 11) nil "Interface to the ArchLinux package manager" single nil]) (pkg-info . [(0 5) ((dash (1 6 0)) (epl (0 4))) "Information about packages" single ((:url . "https://github.com/lunaryorn/pkg-info.el") (:keywords "convenience"))]) (pip-requirements . [(0 4) ((dash (2 8 0))) "A major mode for editing pip requirements files." single nil]) (phpunit . [(0 2 0) nil "Launch PHP unit tests using phpunit" single ((:url . "https://github.com/nlamirault/phpunit.el") (:keywords "php" "tests" "phpunit"))]) (php-mode . [(1 13 5) nil "Major mode for editing PHP code" single ((:url . "https://github.com/ejmr/php-mode"))]) (php-auto-yasnippets . [(2 3 1) ((php-mode (1 11)) (yasnippet (0 8 0))) "Creates snippets for PHP functions" tar ((:url . "https://github.com/ejmr/php-auto-yasnippets"))]) (phi-search-mc . [(2 1) ((phi-search (2 0 0)) (multiple-cursors (1 2 1))) "multiple-cursors extension for phi-search" single ((:url . "https://github.com/knu/phi-search-mc.el") (:keywords "search" "cursors"))]) (ph . [(0 1 0) ((emacs (24 3))) "A global minor mode for managing multiple projects." tar nil]) (perspective . [(1 10) nil "switch between named \"perspectives\" of the editor" single ((:url . "http://github.com/nex3/perspective-el") (:keywords "workspace" "convenience" "frames"))]) (persp-projectile . [(0 11 0) ((perspective (1 9)) (projectile (0 11 0)) (cl-lib (0 3))) "Perspective integration with Projectile" single ((:keywords "project" "convenience"))]) (persistent-soft . [(0 8 8) ((pcache (0 2 3)) (list-utils (0 4 2))) "Persistent storage, returning nil on failure" single ((:url . "http://github.com/rolandwalker/persistent-soft") (:keywords "data" "extensions"))]) (pcache . [(0 2 4) ((eieio (1 3))) "persistent caching for Emacs" single nil]) (pastehub . [(0 5 2) nil "A client for the PasteHub cloud service" single ((:url . "https://github.com/kiyoka/pastehub"))]) (password-store . [(1 6 3) ((dash (1 5 0)) (f (0 11 0)) (s (1 9 0))) "Password store (pass) support" single ((:keywords "pass"))]) (passthword . [(1 3) ((cl-lib (0 5))) "Simple password manager" single nil]) (parent-mode . [(2 1) nil "get major mode's parent modes" single ((:url . "https://github.com/Fanael/parent-mode"))]) (paren-face . [(0 1 0) nil "a face for parentheses in lisp modes" single ((:url . "http://github.com/tarsius/paren-face"))]) (paredit-everywhere . [(0 4) ((paredit (22))) "Enable some paredit features in non-lisp buffers" single ((:keywords "languages" "convenience"))]) (paredit . [(23) nil "minor mode for editing parentheses" single ((:keywords "lisp"))]) (paradox . [(1 2 2) nil "No description available." tar nil]) (pangu-spacing . [(0 4) nil "Minor-mode to add space between Chinese and English characters." single ((:url . "http://github.com/coldnew/pangu-spacing"))]) (pandoc-mode . [(2 6) nil "Minor mode for interacting with Pandoc" tar ((:keywords "text" "pandoc"))]) (pallet . [(0 6) ((cask (0 6))) "A package management tool for Emacs, using Cask." tar nil]) (page-break-lines . [(0 9) nil "Display ugly ^L page breaks as tidy horizontal lines" single ((:url . "https://github.com/purcell/page-break-lines") (:keywords "convenience" "faces"))]) (packed-git . [(0 3 5) ((cl-lib (0 5)) (magit (2 1 0))) "Utilities for Emacs packages living in Git repositories" single ((:url . "http://tarsius.github.com/packed") (:keywords "compile" "convenience" "lisp" "package" "library"))]) (packed . [(0 3 5) ((cl-lib (0 5))) "package manager agnostic Emacs Lisp package utilities" single ((:url . "http://tarsius.github.com/packed") (:keywords "compile" "convenience" "lisp" "package" "library"))]) (package-utils . [(0 2 0) ((epl (0 7 -3))) "Extensions for package.el" single ((:url . "https://github.com/Silex/package-utils") (:keywords "package" "convenience"))]) (pabbrev . [(4 0) nil "Predictive abbreviation expansion" single nil]) (outshine . [(2 0) nil "outline with outshine outshines outline" single ((:url . "https://github.com/tj64/outshine"))]) (outorg . [(2 0) nil "Org-style comment editing" single ((:url . "https://github.com/tj64/outorg"))]) (osx-plist . [(1 0 0) nil "Apple plist file parser" single ((:keywords "convenience"))]) (osx-location . [(0 1) nil "Watch and respond to changes in geographical location on OS X" tar nil]) (osx-browse . [(0 8 8) ((string-utils (0 3 2)) (browse-url-dwim (0 6 6))) "Web browsing helpers for OS X" single ((:url . "http://github.com/rolandwalker/osx-browse") (:keywords "hypermedia" "external"))]) (orglink . [(0 2 1) ((dash (1 3 2)) (org (8 0))) "use Org Mode links in other modes" single ((:url . "http://github.com/tarsius/orglink") (:keywords "hypertext"))]) (orgbox . [(0 5 0) ((org (8 0)) (cl-lib (0 5))) "Mailbox-like task scheduling Org." single ((:url . "https://github.com/yasuhito/orgbox") (:keywords "org"))]) (org-trello . [(0 6 2) ((request-deferred (0 1 0)) (deferred (0 3 2)) (s (1 9 0)) (dash (2 8 0)) (emacs (24))) "Minor mode to synchronize org-mode buffer and trello board" tar nil]) (org-toodledo . [(2 16) nil "Toodledo integration for Emacs Org mode" tar ((:keywords "outlines" "data"))]) (org-readme . [(20130322 926) ((http-post-simple (1 0)) (yaoddmuse (0 1 1)) (header2 (21 0)) (lib-requires (21 0))) "Integrates Readme.org and Commentary/Change-logs." tar ((:url . "https://github.com/mlf176f2/org-readme") (:keywords "header2" "readme.org" "emacswiki" "git"))]) (org-protocol-jekyll . [(0 1) nil "Jekyll's handler for org-protocol" single nil]) (org-pomodoro . [(1 3 3) ((alert (0 5 10))) "Pomodoro implementation for org-mode." tar nil]) (org-page . [(0 41) ((ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8))) "a static site generator based on org mode" tar nil]) (org-outlook . [(0 11) nil "Outlook org" tar ((:url . "https://github.com/mlf176f2/org-outlook.el") (:keywords "org-outlook"))]) (org-magit . [(0 2 2) ((magit (1 2 0)) (org (6 1))) "basic support for magit links" single ((:keywords "git" "magit" "outlines"))]) (org-mac-iCal . [(7 9 3 5) nil "Imports events from iCal.app to the Emacs diary" single ((:keywords "outlines" "calendar"))]) (org-journal . [(1 5 3) nil "a simple org-mode based journaling mode" single ((:url . "http://github.com/bastibe/emacs-journal"))]) (org-elisp-help . [(0 1 0) ((cl-lib (0 2)) (org (8 0))) "org links to emacs-lisp documentation" single ((:url . "http://tarsius.github.com/org-elisp-help") (:keywords "org" "remember" "lisp"))]) (org-bullets . [(0 2 4) nil "Show bullets in org-mode as UTF-8 characters" single ((:url . "https://github.com/sabof/org-bullets"))]) (org-agenda-property . [(1 3 1) ((emacs (24 2))) "Display org properties in the agenda buffer." single ((:url . "http://github.com/Bruce-Connor/org-agenda-property") (:keywords "calendar"))]) (operate-on-number . [(1 1 0) nil "Operate on number at point with arithmetic functions" single ((:url . "https://github.com/knu/operate-on-number.el") (:keywords "editing"))]) (olivetti . [(1 0 0) nil "Minor mode for a nice writing environment" single ((:keywords "wp"))]) (octomacs . [(0 0 1) nil "Octopress interface for Emacs" single ((:url . "http://technosorcery.net"))]) (ocp-indent . [(1 4 2 2) nil "automatic indentation with ocp-indent" single ((:url . "http://www.typerex.org/ocp-indent.html") (:keywords "ocaml" "languages"))]) (object-registry . [(1 2 0) ((cl-lib (0 2))) "track data items by various instance slots" single ((:url . "https://github.com/tarsius/object-registry") (:keywords "data" "oo"))]) (ob-translate . [(0 1 2) ((google-translate (0 4)) (org (8))) "Translation of text blocks in org-mode." single ((:url . "https://github.com/krisajenkins/ob-translate") (:keywords "org" "babel" "translate" "translation"))]) (ob-sml . [(0 2) ((sml-mode (6 4))) "org-babel functions for template evaluation" single ((:url . "http://orgmode.org") (:keywords "literate programming" "reproducible research"))]) (o-blog . [(2 0) nil "" tar ((:keywords "emacs"))]) (nvm . [(0 0 3) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0))) "Manage Node versions within Emacs" single ((:url . "http://github.com/rejeep/nvm.el") (:keywords "node" "nvm"))]) (nsis-mode . [(0 44) nil "NSIS-mode" tar ((:url . "http://github.com/mlf176f2/nsis-mode") (:keywords "nsis"))]) (nrepl-sync . [(0 3 1) ((cider (0 6))) "connect to nrepl port and eval .sync.clj." single ((:url . "https://github.com/phillord/lein-sync"))]) (nrepl-ritz . [(0 6 0) ((nrepl (0 1 5))) "nrepl extensions for ritz" single ((:url . "https://github.com/pallet/ritz") (:keywords "languages" "lisp" "nrepl"))]) (notmuch . [(0 18 1) nil "No description available." tar nil]) (nose . [(0 1 1) nil "Easy Python test running in Emacs" single ((:keywords "nose" "python" "testing"))]) (nodejs-repl . [(0 0 2) nil "Run Node.js REPL" single nil]) (nix-mode . [(1 7) nil "No description available." single nil]) (ninja-mode . [(1 5 1) nil "Major mode for editing .ninja files" single nil]) (neotree . [(0 2 1) nil "A tree plugin like NerdTree for Vim" single ((:url . "https://github.com/jaypei/emacs-neotree"))]) (nemerle . [(1 2) nil "major mode for editing nemerle programs" single ((:keywords "nemerle" "mode" "languages"))]) (ncl-mode . [(0 98) nil "No description available." tar nil]) (navorski . [(0 2 7) ((s (1 9 0)) (dash (1 5 0)) (multi-term (0 8 14))) "Helping you live in the terminal, like Viktor did." single ((:keywords "terminal"))]) (navi-mode . [(2 0) nil "major-mode for easy buffer-navigation" single ((:url . "https://github.com/tj64/navi"))]) (nav-flash . [(1 1 0) nil "Briefly highlight the current line" single ((:url . "http://github.com/rolandwalker/nav-flash") (:keywords "extensions" "navigation" "interface"))]) (mykie . [(0 2 1) nil "Command multiplexer: Register multiple functions to a keybind" tar ((:url . "https://github.com/yuutayamada/mykie-el") (:keywords "emacs" "configuration" "keybind"))]) (multiple-cursors . [(1 3 0) nil "Multiple cursors for Emacs." tar nil]) (multi-web-mode . [(0 2 1) nil "multiple major mode support for web editing" tar ((:keywords "convenience" "languages" "wp"))]) (multi . [(2 0 1) ((emacs (24))) "Clojure-style multi-methods for emacs lisp" single ((:url . "http://github.com/kurisuwhyte/emacs-multi") (:keywords "multimethod" "generic" "predicate" "dispatch"))]) (moz . [(1 1 0) nil "Lets current buffer interact with inferior mozilla." single ((:url . "http://github.com/bard/mozrepl/raw/master/chrome/content/moz.el"))]) (move-dup . [(0 2 1) nil "Eclipse-like moving and duplicating lines or rectangles." single ((:keywords "convenience" "wp"))]) (morlock . [(0 4 0) nil "more font-lock keywords for elisp" single ((:url . "http://github.com/tarsius/morlock") (:keywords "convenience"))]) (mode-line-debug . [(1 2 1) nil "show status of `debug-on-error' in the mode-line" single ((:url . "https://github.com/tarsius/mode-line-debug") (:keywords "convenience" "lisp"))]) (mode-icons . [(0 1 0) nil "Show icons for modes" tar ((:url . "http://ryuslash.org/projects/mode-icons.html") (:keywords "multimedia"))]) (mocker . [(0 3 0) ((eieio (1 3)) (el-x (0 2 4))) "mocking framework for emacs" single ((:keywords "lisp" "testing"))]) (mmm-mode . [(0 5 1) nil "Allow Multiple Major Modes in a buffer" tar ((:url . "https://github.com/purcell/mmm-mode") (:keywords "convenience" "faces" "languages" "tools"))]) (mmm-mako . [(1 1) ((mmm-mode (0 4 8))) "MMM submode class for Mako Templates" single ((:url . "https://bitbucket.org/pjenvey/mmm-mako"))]) (minitest . [(0 7 1) ((dash (1 0 0))) "An Emacs mode for ruby minitest files" single ((:url . "https://github.com/arthurnn/minitest-emacs"))]) (minimal-session-saver . [(0 6 2) nil "Very lean session saver" single ((:url . "http://github.com/rolandwalker/minimal-session-saver") (:keywords "tools" "frames" "project"))]) (miniedit . [(2 0) nil "Enhanced editing for minibuffer fields." single nil]) (minibuffer-cua . [(1 0 0) nil "Make CUA mode's S-up/S-down work in minibuffer" single ((:url . "https://github.com/knu/minibuffer-cua.el") (:keywords "completion" "editing"))]) (minibuffer-complete-cycle . [(1 25 20130814) nil "Cycle through the *Completions* buffer" single ((:url . "https://github.com/knu/minibuffer-complete-cycle") (:keywords "completion"))]) (milkode . [(0 4) nil "Command line search and direct jump with Milkode" single ((:keywords "milkode" "search" "grep" "jump" "keyword"))]) (migemo . [(1 9 1) nil "Japanese incremental search through dynamic pattern expansion" single ((:url . "https://github.com/emacs-jp/migemo"))]) (mew . [(6 6) nil "Messaging in the Emacs World" tar nil]) (merlin . [(1 7 1) nil "Mode for Merlin, an assistant for OCaml." single ((:url . "http://github.com/the-lambda-church/merlin") (:keywords "ocaml" "languages"))]) (mentor . [(0 1) nil "Control rtorrent from GNU Emacs" tar ((:keywords "bittorrent" "rtorrent"))]) (mc-extras . [(1 0 3) ((multiple-cursors (1 2 1))) "Extra functions for multiple-cursors mode." tar ((:url . "https://github.com/knu/mc-extras.el") (:keywords "editing" "cursors"))]) (maxframe . [(0 5) nil "No description available." single nil]) (marmalade . [(0 0 4) ((furl (0 0 2))) "Elisp interface for the Emacs Lisp package server." single ((:url . "http://code.google.com/p/marmalade"))]) (markdown-toc . [(0 0 6) ((s (1 7 0)) (dash (2 5 0)) (markdown-mode (2 0))) "A simple TOC generator for markdown file" tar nil]) (markdown-mode . [(2 0) nil "Emacs Major mode for Markdown-formatted text files" single ((:url . "http://jblevins.org/projects/markdown-mode/") (:keywords "markdown" "github flavored markdown" "itex"))]) (mark-tools . [(0 3) nil "Some simple tools to access the mark-ring in Emacs" single ((:url . "https://github.com/stsquad/emacs-mark-tools"))]) (map-regexp . [(0 3 0) ((cl-lib (0 2))) "map over matches of a regular expression" single ((:url . "https://github.com/tarsius/map-regexp") (:keywords "convenience"))]) (map-progress . [(0 5 0) nil "mapping macros that report progress" single ((:url . "https://github.com/tarsius/map-progress/") (:keywords "convenience"))]) (mallard-mode . [(0 3 0) nil "Major mode for editing Mallard files" tar ((:url . "https://github.com/jhradilek/emacs-mallard-mode") (:keywords "xml" "mallard"))]) (malinka . [(0 2 0) ((s (1 9 0)) (dash (2 4 0)) (f (0 11 0)) (cl-lib (0 3)) (rtags (0 0)) (projectile (0 11 0))) "A C/C++ project configuration package for Emacs" single ((:url . "https://github.com/LefterisJP/malinka") (:keywords "c" "c++" "project-management"))]) (malabar-mode . [(20140303 946) ((fringe-helper (1 0 1))) "A better Java mode for Emacs" tar ((:url . "http://www.github.com/m0smith/malabar-mode") (:keywords "java" "maven" "language" "malabar"))]) (makey . [(0 3) ((cl-lib (0 2))) "interactive commandline mode" single nil]) (make-color . [(0 4) nil "Alternative to picking color - update fg/bg color by pressing r/g/b/... keys" single ((:url . "http://github.com/alezost/make-color.el") (:keywords "color"))]) (magit-tramp . [(0 1 0) ((magit (1 2 0))) "git method for TRAMP" single ((:url . "https://github.com/sigma/magit-tramp"))]) (magit-topgit . [(90141013) ((cl-lib (0 3)) (magit (1 3 0))) "topgit plug-in for Magit" single ((:keywords "vc" "tools"))]) (magit-svn . [(90141013) ((cl-lib (0 3)) (magit (1 3 0))) "git-svn plug-in for Magit" single ((:keywords "vc" "tools"))]) (magit-stgit . [(90141013) ((cl-lib (0 3)) (magit (1 3 0))) "StGit plug-in for Magit" single ((:keywords "vc" "tools"))]) (magit-push-remote . [(0 5 0) ((magit (1 3 0))) "push remote support for Magit" single ((:url . "https://github.com/tarsius/magit-push-remote") (:keywords "convenience"))]) (magit-gitflow . [(1 0 0) ((magit (1 3 0))) "gitflow extension for magit" single ((:url . "https://github.com/jtatarik/magit-gitflow") (:keywords "vc" "tools"))]) (magit-gh-pulls . [(0 3) ((gh (0 4 3)) (magit (1 1 0))) "GitHub pull requests extension for Magit" single ((:keywords "tools"))]) (magit-find-file . [(2 0 0) ((magit (1 2 0)) (dash (2 8 0))) "completing-read over all files in Git" single ((:url . "https://github.com/bradleywright/magit-find-file.el") (:keywords "git"))]) (magit-annex . [(0 10 0) ((cl-lib (0 3)) (magit (1 2 0))) "Use git annex within magit" single ((:url . "https://github.com/kyleam/magit-annex") (:keywords "magit" "git-annex"))]) (magit . [(90141013) ((cl-lib (0 3)) (git-commit-mode (0 14 0)) (git-rebase-mode (0 14 0))) "control Git from Emacs" tar ((:keywords "vc" "tools"))]) (macrostep . [(0 8) nil "interactive macro stepper for Emacs Lisp" single ((:url . "https://github.com/joddie/macrostep") (:keywords "lisp" "languages" "macro" "debugging"))]) (macro-math . [(1 0) nil "in-buffer mathematical operations" single ((:url . "http://nschum.de/src/emacs/macro-math/") (:keywords "convenience"))]) (m-buffer . [(0 5) ((dash (2 5 0)) (emacs (24 3))) "Buffer Manipulation Functions" single nil]) (lua-mode . [(20140514) nil "a major-mode for editing Lua scripts" single ((:url . "http://immerrr.github.com/lua-mode") (:keywords "languages" "processes" "tools"))]) (love-minor-mode . [(1 1) nil "Minor mode for working on LÖVE projects" single ((:url . "https://github.com/ejmr/love-minor-mode"))]) (logito . [(0 1) ((eieio (1 3))) "logging library for Emacs" single ((:keywords "lisp" "tool"))]) (logalimacs . [(1 0 0) nil "Front-end to logaling-command for Ruby gems" single ((:url . "https://github.com/logaling/logalimacs"))]) (log4j-mode . [(1 3) nil "major mode for viewing log files" single ((:keywords "log" "log4j" "java"))]) (literate-coffee-mode . [(0 2) ((coffee-mode (0 5 0))) "major-mode for Literate CoffeeScript" single ((:url . "https://github.com/syohex/emacs-literate-coffee-mode"))]) (list-utils . [(0 4 2) nil "List-manipulation utility functions" single ((:url . "http://github.com/rolandwalker/list-utils") (:keywords "extensions"))]) (lispyscript-mode . [(0 3 5) nil "Major mode for LispyScript code." single ((:url . "https://github.com/krisajenkins/lispyscript-mode") (:keywords "lisp" "languages"))]) (lispy . [(0 13 0) ((helm (1 5 3)) (ace-jump-mode (2 0)) (s (1 4 0)) (noflet (0 0 10)) (multiple-cursors (1 3 0)) (iedit (0 97))) "vi-like Paredit" tar nil]) (linum-relative . [(0 4) nil "display relative line number in emacs." single ((:url . "http://github.com/coldnew/linum-relative") (:keywords "converience"))]) (linked-buffer . [(0 5) ((emacs (24)) (m-buffer (0 5)) (dash (2 5 0))) "One buffer as a view of another" tar nil]) (link . [(1 10) nil "No description available." single nil]) (lingr . [(0 2) nil "Lingr Client for GNU Emacs" single ((:url . "http://github.com/lugecy/lingr-el") (:keywords "chat" "client" "internet"))]) (lfe-mode . [(0 9 0) nil "Lisp Flavoured Erlang mode" tar nil]) (less-css-mode . [(0 19) nil "Major mode for editing LESS CSS files (lesscss.org)" single ((:url . "https://github.com/purcell/less-css-mode") (:keywords "less" "css" "mode"))]) (ledger-mode . [(3 1) nil "Helper code for use with the \"ledger\" command-line tool" tar nil]) (latex-extra . [(1 8) ((auctex (11 86 1)) (cl-lib (0 5))) "Adds several useful functionalities to LaTeX-mode." single ((:url . "http://github.com/Bruce-Connor/latex-extra") (:keywords "tex"))]) (langtool . [(1 2 1) nil "Grammer check utility using LanguageTool" single ((:url . "https://github.com/mhayashi1120/Emacs-langtool/raw/master/langtool.el") (:keywords "docs"))]) (know-your-http-well . [(0 2 0) nil "Look up the meaning of HTTP headers, methods, relations, status codes" tar nil]) (kivy-mode . [(1 8 0) nil "Emacs major mode for editing Kivy files" single nil]) (killer . [(0 2 2) nil "kill and delete text" single ((:url . "http://github.com/tarsius/killer") (:keywords "convenience"))]) (kill-ring-search . [(1 1) nil "incremental search for the kill ring" single ((:url . "http://nschum.de/src/emacs/kill-ring-search/") (:keywords "convenience" "matching"))]) (keymap-utils . [(0 4 4) ((cl-lib (0 2))) "Keymap utilities" tar nil]) (keydef . [(1 15) nil "a simpler way to define keys, with kbd syntax" single ((:keywords "convenience" "lisp" "customization" "keyboard" "keys"))]) (keychain-environment . [(2 0 1) nil "load keychain environment variables" single ((:url . "https://github.com/tarsius/keychain-environment") (:keywords "gnupg" "pgp" "ssh"))]) (key-combo . [(1 2) nil "map key sequence to commands" tar ((:url . "https://github.com/uk-ar/key-combo") (:keywords "keyboard" "input"))]) (jump-to-line . [(0 2 0) nil "Jump to line number at point." single ((:keywords "jump" "line" "back" "file" "ruby" "csharp" "python" "perl"))]) (jump . [(2 3) ((findr (0 7)) (inflections (1 1))) "build functions which contextually jump between files" single ((:url . "http://github.com/eschulte/jump.el/tree/master") (:keywords "project" "convenience" "navigation"))]) (julia-mode . [(0 3 1) nil "No description available." single nil]) (jsx-mode . [(0 1 10) nil "major mode for JSX" single ((:url . "https://github.com/jsx/jsx-mode.el"))]) (json-mode . [(1 1 0) nil "Major mode for editing JSON files" single ((:url . "https://github.com/joshwnj/json-mode"))]) (js3-mode . [(1 1 0) nil "An improved JavaScript editing mode" tar ((:keywords "javascript" "languages"))]) (js2-refactor . [(0 6 1) ((js2-mode (20101228)) (multiple-cursors (1 0 0)) (dash (1 0 0)) (s (1 0 0)) (yasnippet (20130218))) "A JavaScript refactoring library for emacs." tar nil]) (js2-mode . [(20140114) ((emacs (24 1))) "Improved JavaScript editing mode" tar ((:url . "https://github.com/mooz/js2-mode/") (:keywords "languages" "javascript"))]) (js2-closure . [(1 0) ((js2-mode (20140114))) "Google Closure dependency manager" single ((:url . "http://github.com/jart/js2-closure"))]) (jedi . [(0 1 2) ((epc (0 1 0)) (auto-complete (1 4))) "Python auto-completion for Emacs" tar nil]) (jabber . [(0 8 92) nil "A Jabber client for Emacs." tar nil]) (j-mode . [(1 1 1) nil "Major mode for editing J programs" tar ((:url . "http://github.com/zellio/j-mode") (:keywords "j" "langauges"))]) (ix . [(0 7) ((grapnel (0 5 3))) "Emacs client for http://ix.io pastebin" single ((:url . "http://www.github.com/theanalyst/ix.el"))]) (irony . [(0 1 1) ((cl-lib (0 5))) "C/C++ minor mode powered by libclang" tar ((:url . "https://github.com/Sarcasm/irony-mode") (:keywords "c" "convenience" "tools"))]) (ir-black-theme . [(1 0 1) nil "Port of ir-black theme" single ((:keywords "faces"))]) (instapaper . [(0 9 5) nil "No description available." single nil]) (insert-shebang . [(0 9 3) nil "Insert shebang line automatically." single ((:url . "http://github.com/psachin/insert-shebang") (:keywords "shebang" "tool" "convenience"))]) (inline-crypt . [(0 1 4) nil "Simple inline encryption via openssl" tar nil]) (initsplit . [(1 6) nil "No description available." single nil]) (init-loader . [(0 1) nil "Loader for configuration files" single ((:url . "https://github.com/emacs-jp/init-loader/"))]) (inflections . [(2 3) nil "convert english words between singular and plural" single ((:url . "https://github.com/eschulte/jump.el") (:keywords "ruby" "rails" "languages" "oop"))]) (inf-ruby . [(2 4 0) nil "Run a Ruby process in a buffer" single ((:url . "http://github.com/nonsequitur/inf-ruby") (:keywords "languages" "ruby"))]) (import-popwin . [(0 8) ((popwin (0 6)) (cl-lib (0 5))) "popwin buffer near by import statements with popwin" single ((:url . "https://github.com/syohex/emacs-import-popwin"))]) (immutant-server . [(1 2 0) nil "Run your Immutant server in Emacs" single ((:url . "http://www.github.com/leathekd/immutant-server.el"))]) (ignoramus . [(0 7 0) nil "Ignore backups, build files, et al." single ((:url . "http://github.com/rolandwalker/ignoramus") (:keywords "convenience" "tools"))]) (iflipb . [(1 2) nil "interactively flip between recently visited buffers" single ((:url . "http://hg.rosdahl.net/iflipb"))]) (idris-mode . [(0 9 14) ((emacs (24))) "Major mode for editing Idris code" tar ((:url . "https://github.com/idris-hackers/idris-mode") (:keywords "languages"))]) (ido-vertical-mode . [(0 1 5) nil "Makes ido-mode display vertically." single ((:url . "https://github.com/gempesaw/ido-vertical-mode.el") (:keywords "convenience"))]) (ido-ubiquitous . [(2 14) ((emacs (24 1))) "Use ido (nearly) everywhere." single ((:url . "https://github.com/DarwinAwardWinner/ido-ubiquitous") (:keywords "convenience"))]) (ido-load-library . [(0 2 0) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Load-library alternative using ido-completing-read" single ((:url . "http://github.com/rolandwalker/ido-load-library") (:keywords "maint" "completion"))]) (ido-complete-space-or-hyphen . [(1 1) nil "No description available." single nil]) (idle-highlight-mode . [(1 1 3) nil "highlight the word the point is on" single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/IdleHighlight") (:keywords "convenience"))]) (identica-mode . [(1 3 1) nil "Major mode API client for status.net open microblogging" tar ((:url . "http://blog.gabrielsaldana.org/identica-mode-for-emacs/") (:keywords "identica" "web"))]) (ibuffer-vc . [(0 8) ((cl-lib (0 2))) "Group ibuffer's list by VC project, or show VC status" single ((:url . "http://github.com/purcell/ibuffer-vc") (:keywords "themes"))]) (hyde . [(0 2) nil "No description available." tar nil]) (httprepl . [(1 1) ((s (1 9 0)) (dash (2 5 0)) (emacs (24))) "An HTTP REPL" single ((:url . "https://github.com/gregsexton/httprepl.el") (:keywords "http" "repl"))]) (httpcode . [(0 1) nil "explains the meaning of an HTTP status code" single ((:url . "http://github.com/rspivak/httpcode.el"))]) (html-to-markdown . [(1 5) nil "HTML to Markdown converter written in Emacs-lisp." single ((:url . "http://github.com/Bruce-Connor/html-to-markdown") (:keywords "tools" "wp" "languages"))]) (hookify . [(0 2 0) ((s (1 9 0)) (dash (1 5 0))) "Interactive commands to create temporary hooks" single ((:url . "https://github.com/Silex/hookify") (:keywords "hook" "convenience"))]) (hl-todo . [(1 3 1) nil "highlight TODO keywords" single ((:url . "http://github.com/tarsius/hl-todo") (:keywords "convenience"))]) (hl-sexp . [(1 0 0) nil "highlight the current sexp" single ((:keywords "faces" "frames" "emulation"))]) (hl-sentence . [(3) nil "highlight a sentence based on customizable face" single ((:url . "http://github.com/milkypostman/hl-sentence") (:keywords "highlighting"))]) (historyf . [(0 0 8) nil "file history library like browser" single ((:url . "https://github.com/k1LoW/emacs-historyf"))]) (hippie-namespace . [(0 5 8) nil "Special treatment for namespace prefixes in hippie-expand" single ((:url . "http://github.com/rolandwalker/hippie-namespace") (:keywords "convenience" "lisp" "tools" "completion"))]) (hippie-expand-slime . [(0 1) nil "Hook slime's completion into hippie-expand" single ((:url . "https://github.com/purcell/hippie-expand-slime"))]) (highlight-symbol . [(1 2) nil "automatic and manual symbol highlighting" single ((:url . "http://nschum.de/src/emacs/highlight-symbol/") (:keywords "faces" "matching"))]) (highlight-quoted . [(0 1) ((emacs (24))) "Highlight Lisp quotes and quoted symbols" single ((:url . "https://github.com/Fanael/highlight-quoted"))]) (highlight-parentheses . [(1 0 2) nil "highlight surrounding parentheses" single ((:url . "http://nschum.de/src/emacs/highlight-parentheses/") (:keywords "faces" "matching"))]) (highlight-numbers . [(0 2) ((emacs (24)) (parent-mode (2 0))) "Highlight numbers in source code" single ((:url . "https://github.com/Fanael/highlight-numbers"))]) (highlight-defined . [(0 1 5) ((emacs (24))) "Syntax highlighting of known Elisp symbols" single ((:url . "https://github.com/Fanael/highlight-defined"))]) (highlight-blocks . [(0 1 5) ((emacs (24))) "Highlight the blocks point is in" single ((:url . "https://github.com/Fanael/highlight-blocks"))]) (helm-themes . [(0 4) ((helm (1 0))) "Color theme selection with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-themes"))]) (helm-spaces . [(0 2) ((helm (1 0)) (spaces (0 1 0))) "helm sources for spaces" single ((:url . "https://github.com/yasuyk/helm-spaces") (:keywords "helm" "frames" "convenience"))]) (helm-rubygems-org . [(0 0 1) ((emacs (24)) (helm (1 6 3)) (cl-lib (0 5))) "Use helm to search rubygems.org" single ((:url . "https://github.com/neomantic/helm-rubygems-org") (:keywords "ruby" "rubygems" "gemfile" "helm"))]) (helm-robe . [(0 1) ((helm (1 0))) "completing read function for robe" single ((:url . "https://github.com/syohex/emacs-helm-robe"))]) (helm-pydoc . [(0 6) ((helm (1 0)) (cl-lib (0 5))) "pydoc with helm interface" tar ((:url . "https://github.com/syohex/emacs-helm-pydoc"))]) (helm-projectile . [(0 11 0) ((helm (1 4 0)) (projectile (0 11 0)) (cl-lib (0 3))) "Helm integration for Projectile" single ((:url . "https://github.com/bbatsov/projectile") (:keywords "project" "convenience"))]) (helm-proc . [(0 0 4) ((helm (1 6 0))) "Helm interface for managing system processes" tar nil]) (helm-perldoc . [(0 7) ((helm (1 0)) (deferred (0 3 1)) (cl-lib (0 5))) "perldoc with helm interface" tar ((:url . "https://github.com/syohex/emacs-helm-perldoc"))]) (helm-package . [(0 2) ((helm (1 0)) (cl-lib (0 3))) "Listing ELPA packages with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-package"))]) (helm-open-github . [(0 11) ((helm (1 0)) (gh (1 0)) (cl-lib (0 5))) "Utilities of Opening Github Page" single ((:url . "https://github.com/syohex/emacs-helm-open-github"))]) (helm-hayoo . [(0 0 5) ((helm (1 6 0)) (json (1 2)) (haskell-mode (13 7))) "Source and configured helm for searching hayoo" single ((:keywords "helm"))]) (helm-gtags . [(1 3 9) ((helm (1 5 6)) (cl-lib (0 5))) "GNU GLOBAL helm interface" single ((:url . "https://github.com/syohex/emacs-helm-gtags"))]) (helm-github-stars . [(1 1 1) ((helm (1 5 5))) "Helm integration for your starred repositories on github" single ((:keywords "helm" "github" "stars"))]) (helm-ghq . [(1 4 0) ((helm (1 6 2))) "ghq with helm interface" single ((:url . "https://github.com/masutaka/emacs-helm-ghq"))]) (helm-descbinds . [(1 7 1) nil "Yet Another `describe-bindings' with `helm'." single ((:keywords "helm" "help"))]) (helm-dash . [(1 0 0) ((helm (0 0 0))) "Helm extension to search dash docsets" single ((:keywords "docs"))]) (helm-backup . [(0 2 0) ((helm (1 5 5)) (s (1 8 0))) "Backup each file change using git" single ((:url . "http://github.com/antham/helm-backup") (:keywords "backup"))]) (helm-ag . [(0 28) ((helm (1 5 6)) (cl-lib (0 5))) "the silver searcher with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-ag"))]) (helm-ack . [(0 12) ((helm (1 0)) (cl-lib (0 5))) "Ack command with helm interface" single ((:url . "https://github.com/syohex/emacs-helm-ack"))]) (helm . [(1 6 4) ((emacs (24)) (cl-lib (0 5)) (async (1 2))) "Helm is an Emacs incremental and narrowing framework" tar nil]) (header-button . [(0 3 0) nil "clickable buttons in header lines" single ((:url . "https://github.com/emacsattic/header-button") (:keywords "extensions"))]) (haskell-mode . [(13 10) nil "A Haskell editing mode" tar nil]) (hardhat . [(0 4 4) ((ignoramus (0 7 0))) "Protect against clobbering user-writable files" single ((:url . "http://github.com/rolandwalker/hardhat") (:keywords "convenience"))]) (haml-mode . [(3 1 5) ((ruby-mode (1 0))) "Major mode for editing Haml files" single ((:url . "http://github.com/nex3/haml/tree/master") (:keywords "markup" "language" "html"))]) (ham-mode . [(1 1 1) ((html-to-markdown (1 2)) (markdown-mode (2 0))) "Html As Markdown. Transparently edit an html file using markdown." single ((:url . "http://github.com/Bruce-Connor/ham-mode") (:keywords "convenience" "emulation" "wp"))]) (hackernews . [(0 2) ((json (1 2))) "Access the hackernews aggregator from Emacs" tar nil]) (guru-mode . [(0 2) nil "Become an Emacs guru" single ((:url . "https://github.com/bbatsov/guru-mode") (:keywords "convenience"))]) (gruber-darker-theme . [(0 6) nil "Gruber Darker color theme for Emacs 24." single ((:url . "http://github.com/rexim/gruber-darker-theme"))]) (groovy-mode . [(201311291207) nil "Groovy mode derived mode" tar nil]) (grizzl . [(0 1 1) nil "Fuzzy Search Library & Completing Read" tar nil]) (grin . [(1 0) nil "run grin and grind (python replacements for grep and find) putting hits in a grep buffer" single ((:url . "http://bitbucket.org/dariusp686/emacs-grin") (:keywords "python" "grin" "grind" "grep" "find"))]) (grass-mode . [(0 1) ((cl-lib (0 2))) "Provides Emacs modes for interacting with the GRASS GIS program" single ((:keywords "grass" "gis"))]) (grapnel . [(0 5 3) nil "HTTP request lib with flexible callback dispatch" single ((:url . "http://www.github.com/leathekd/grapnel"))]) (gradle-mode . [(0 5 4) ((s (1 8 0))) "Gradle integration with Emacs' compile" single ((:url . "http://github.com/jacobono/emacs-gradle-mode") (:keywords "gradle"))]) (goto-gem . [(1 2) ((s (1 9 0))) "Open dired in gem directory" single ((:keywords "gemfile" "convenience"))]) (google-translate . [(0 10 4) nil "Emacs interface to Google Translate." tar nil]) (google-this . [(1 9) ((emacs (24 1))) "A set of functions and bindings to google under point." single ((:url . "http://github.com/Bruce-Connor/emacs-google-this") (:keywords "convenience" "hypermedia"))]) (golden-ratio . [(0 0 4) nil "Automatic resizing of Emacs windows to the golden ratio" single ((:keywords "window" "resizing"))]) (go-eldoc . [(0 19) ((go-mode (0)) (cl-lib (0 5))) "eldoc for go-mode" single ((:url . "https://github.com/syohex/emacs-go-eldoc"))]) (go-direx . [(0 3) ((direx (0 1 -3)) (cl-lib (0 5))) "Tree style source code viewer for Go language" single ((:url . "https://github.com/syohex/emacs-go-direx"))]) (gnus-desktop-notify . [(1 4) ((gnus (1 0))) "Gnus Desktop Notification global minor mode" single ((:url . "http://www.thregr.org/~wavexx/hacks/gnus-desktop-notify/"))]) (gnuplot . [(0 7 0) nil "drive gnuplot from within emacs" tar ((:keywords "gnuplot" "plotting"))]) (gmail-message-mode . [(1 3 2) ((ham-mode (1 0))) "A major-mode for editing gmail messages using markdown syntax." single ((:url . "http://github.com/Bruce-Connor/gmail-message-mode") (:keywords "mail" "convenience" "emulation"))]) (gitignore-mode . [(0 15 0) nil "Major mode for editing .gitignore files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (github-clone . [(0 2) ((gh (0 7 2)) (magit (1 2 0)) (emacs (24))) "Fork and clone github repos" single ((:url . "https://github.com/dgtized/github-clone.el") (:keywords "vc" "tools"))]) (gitconfig-mode . [(0 15 0) nil "Major mode for editing .gitconfig files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (gitconfig . [(1 0 0) nil "Emacs lisp interface to work with git-config variables" single ((:keywords "git" "gitconfig" "git-config"))]) (gitattributes-mode . [(0 15 0) nil "Major mode for editing .gitattributes files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (git-timemachine . [(1 8) ((cl-lib (0 5))) "Walk through git revisions of a file" single ((:url . "https://github.com/pidu/git-timemachine") (:keywords "git"))]) (git-rebase-mode . [(0 15 0) nil "Major mode for editing git rebase files" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (git-messenger . [(0 15) ((popup (0 5 0))) "Pop up last commit information of current line" single ((:url . "https://github.com/syohex/emacs-git-messenger"))]) (git-link . [(0 0 2) nil "Get the GitHub/Bitbucket/Gitorious URL for a buffer location" single ((:url . "http://github.com/sshaw/git-link"))]) (git-gutter-fringe . [(0 21) ((git-gutter (0 73)) (fringe-helper (0 1 1)) (cl-lib (0 5)) (emacs (24))) "Fringe version of git-gutter.el" single ((:url . "https://github.com/syohex/emacs-git-gutter-fringe"))]) (git-gutter-fringe+ . [(0 1) ((git-gutter+ (0 1)) (fringe-helper (20130519 1641))) "Fringe version of git-gutter+.el" single ((:url . "https://github.com/nonsequitur/git-gutter-fringe-plus"))]) (git-gutter . [(0 77) ((cl-lib (0 5)) (emacs (24))) "Port of Sublime Text plugin GitGutter" single ((:url . "https://github.com/syohex/emacs-git-gutter"))]) (git-gutter+ . [(0 2) nil "Manage Git hunks straight from the buffer" single ((:url . "https://github.com/nonsequitur/git-gutter-plus"))]) (git-commit-mode . [(0 15 0) nil "Major mode for editing git commit messages" single ((:url . "https://github.com/magit/git-modes") (:keywords "convenience" "vc" "git"))]) (git-auto-commit-mode . [(4 2 2) nil "Emacs Minor mode to automatically commit and push" single ((:url . "http://ryuslash.org/projects/git-auto-commit-mode/") (:keywords "vc"))]) (git . [(0 1 1) ((s (1 7 0)) (dash (2 2 0)) (f (0 10 0))) "An Elisp API for programmatically using Git" single ((:url . "http://github.com/rejeep/git.el") (:keywords "git"))]) (gist . [(1 1 0) ((eieio (1 3)) (gh (0 7 0)) (tabulated-list (0))) "Emacs integration for gist.github.com" single ((:keywords "gist" "git" "github" "paste" "pastie" "pastebin"))]) (ghc . [(5 1 1 0) nil "Sub mode for Haskell mode" tar nil]) (gh . [(0 8 0) ((eieio (1 3)) (pcache (0 2 4)) (logito (0 1))) "A GitHub library for Emacs" tar nil]) (ggtags . [(0 8 6) ((emacs (24)) (cl-lib (0 5))) "emacs frontend to GNU Global source code tagging system" single ((:url . "https://github.com/leoliu/ggtags") (:keywords "tools" "convenience"))]) (ggo-mode . [(20130521) nil "Gengetopt major mode" single ((:keywords "extensions" "convenience" "local"))]) (geiser . [(0 6) nil "GNU Emacs and Scheme talk to each other" tar nil]) (gather . [(1 0 5) nil "Gather string in buffer." single ((:url . "https://github.com/mhayashi1120/Emacs-gather/raw/master/gather.el") (:keywords "matching" "convenience" "tools"))]) (fwb-cmds . [(0 4 0) nil "misc frame, window and buffer commands" single ((:url . "http://github.com/tarsius/fwb-cmds") (:keywords "convenience"))]) (fvwm-mode . [(1 6 4) nil "major mode for editing Fvwm configuration files" single ((:keywords "files"))]) (fuzzy . [(0 1) nil "Fuzzy Matching" single ((:keywords "convenience"))]) (full-ack . [(1 0) nil "a front-end for ack" single ((:url . "http://nschum.de/src/emacs/full-ack/") (:keywords "tools" "matching"))]) (fuel . [(0 96) nil "No description available." tar nil]) (fsharp-mode . [(1 3 0) ((auto-complete (1 4)) (popup (0 5)) (pos-tip (0 4 5)) (s (1 3 1)) (dash (1 1 0))) "F# mode for Emacs" tar nil]) (fringe-helper . [(1 0 1) nil "helper functions for fringe bitmaps" single ((:url . "http://nschum.de/src/emacs/fringe-helper/") (:keywords "lisp"))]) (frame-restore . [(0 5) ((emacs (24 1))) "Restore Emacs frame" single ((:url . "https://github.com/lunaryorn/frame-restore.el") (:keywords "frames" "convenience"))]) (fountain-mode . [(1 3 3) ((s (1 9 0))) "Major mode for screenwriting in Fountain markup" single ((:url . "https://github.com/rnkn/fountain-mode") (:keywords "wp"))]) (font-utils . [(0 7 2) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Utility functions for working with fonts" single ((:url . "http://github.com/rolandwalker/font-utils") (:keywords "extensions"))]) (fold-this . [(0 2 0) nil "Just fold this region please" single ((:keywords "convenience"))]) (fold-dwim-org . [(0 6) ((fold-dwim (1 2))) "Fold DWIM bound to org key-strokes." single ((:url . "https://github.com/mlf176f2/fold-dwim-org") (:keywords "folding" "emacs" "org-mode"))]) (fold-dwim . [(1 2) nil "No description available." single nil]) (fm . [(1 0) nil "follow mode for compilation/output buffers" single ((:keywords "outlines"))]) (flyspell-lazy . [(0 6 6) nil "Improve flyspell responsiveness using idle timers" single ((:url . "http://github.com/rolandwalker/flyspell-lazy") (:keywords "spelling"))]) (flymake-shell . [(0 8) ((flymake-easy (0 1))) "A flymake syntax-checker for shell scripts" single ((:url . "https://github.com/purcell/flymake-shell"))]) (flymake-sass . [(0 6) ((flymake-easy (0 1))) "Flymake handler for sass files" single ((:url . "https://github.com/purcell/flymake-sass"))]) (flymake-ruby . [(0 8) ((flymake-easy (0 1))) "A flymake handler for ruby-mode files" single ((:url . "https://github.com/purcell/flymake-ruby"))]) (flymake-python-pyflakes . [(0 9) ((flymake-easy (0 8))) "A flymake handler for python-mode files using pyflakes (or flake8)" single ((:url . "https://github.com/purcell/flymake-python-pyflakes"))]) (flymake-php . [(0 5) ((flymake-easy (0 1))) "A flymake handler for php-mode files" single ((:url . "https://github.com/purcell/flymake-php"))]) (flymake-perlcritic . [(1 0 3) ((flymake (0 3))) "Flymake handler for Perl to invoke Perl::Critic" tar ((:url . "https://github.com/illusori/emacs-flymake-perlcritic"))]) (flymake-json . [(0 1) ((flymake-easy (0 1))) "A flymake handler for json using jsonlint" single ((:url . "https://github.com/purcell/flymake-json"))]) (flymake-jslint . [(0 23) nil "Flymake support for javascript using jslint" single ((:url . "https://github.com/purcell/flymake-jslint"))]) (flymake-hlint . [(0 2) ((flymake-easy (0 1))) "A flymake handler for haskell-mode files using hlint" single ((:url . "https://github.com/purcell/flymake-hlint"))]) (flymake-haskell-multi . [(0 3) ((flymake-easy (0 1))) "Syntax-check haskell-mode using both ghc and hlint" tar nil]) (flymake-haml . [(0 8) ((flymake-easy (0 1))) "A flymake handler for haml files" single ((:url . "https://github.com/purcell/flymake-haml"))]) (flymake-gjshint . [(0 0 6) nil "A flymake handler for javascript using both jshint and gjslint" single ((:keywords "flymake" "javascript" "jshint" "gjslint"))]) (flymake-easy . [(0 9) nil "Helpers for easily building flymake checkers" single ((:url . "https://github.com/purcell/flymake-easy") (:keywords "convenience" "internal"))]) (flymake-css . [(0 3) ((flymake-easy (0 1))) "Flymake support for css using csslint" single ((:url . "https://github.com/purcell/flymake-css"))]) (flymake-coffee . [(0 12) ((flymake-easy (0 1))) "A flymake handler for coffee script" single ((:url . "https://github.com/purcell/flymake-coffee"))]) (flycheck-ledger . [(0 4) ((flycheck (0 15))) "Flycheck integration for ledger files" single ((:keywords "convenience" "languages" "tools"))]) (flycheck-hdevtools . [(0 3) ((flycheck (0 15))) "A flycheck checker for Haskell using hdevtools" single ((:url . "https://github.com/flycheck/flycheck-hdevtools") (:keywords "convenience" "languages" "tools"))]) (flycheck-haskell . [(0 5) ((flycheck (0 19 -3)) (haskell-mode (13 7)) (dash (2 4 0))) "Flycheck: Cabal projects and sandboxes" tar ((:url . "https://github.com/flycheck/flycheck-haskell") (:keywords "tools" "convenience"))]) (flycheck-dmd-dub . [(0 7) ((flycheck (0 17))) "Sets flycheck-dmd-include-paths from dub package information" single ((:url . "http://github.com/atilaneves/flycheck-dmd-dub") (:keywords "languages"))]) (flycheck-color-mode-line . [(0 3) ((flycheck (0 15)) (dash (1 2)) (emacs (24 1))) "Change mode line color with Flycheck status" single ((:keywords "convenience" "language" "tools"))]) (flycheck-cask . [(0 1) ((flycheck (0 14)) (dash (2 0 0)) (f (0 6 0))) "Cask support in Flycheck" single ((:url . "https://github.com/flycheck/flycheck-cask") (:keywords "tools" "convenience"))]) (flycheck . [(0 20) ((dash (2 4 0)) (pkg-info (0 4)) (cl-lib (0 3)) (emacs (24 1))) "Modern on-the-fly syntax checking for GNU Emacs" tar ((:url . "https://flycheck.readthedocs.org") (:keywords "convenience" "languages" "tools"))]) (flx-ido . [(0 5) ((flx (0 1)) (cl-lib (0 3))) "flx integration for ido" single ((:url . "https://github.com/lewang/flx"))]) (flx . [(0 5) ((cl-lib (0 3))) "fuzzy matching with good sorting" single ((:url . "https://github.com/lewang/flx"))]) (floobits . [(1 5 11) ((json (1 2)) (highlight (0))) "Floobits plugin for real-time collaborative editing" tar ((:url . "http://github.com/Floobits/floobits-emacs") (:keywords "comm" "tools"))]) (fixmee . [(0 8 4) ((button-lock (1 0 0)) (nav-flash (1 0 0)) (back-button (0 6 0)) (smartrep (0 0 3)) (string-utils (0 3 2)) (tabulated-list (0))) "Quickly navigate to FIXME notices in code" single ((:url . "http://github.com/rolandwalker/fixmee") (:keywords "navigation" "convenience"))]) (fiplr . [(0 2 4) ((grizzl (0 1 0))) "Fuzzy Search for Files in Projects" tar nil]) (find-file-in-repository . [(1 2) nil "Quickly find files in a git, mercurial or other repository" single ((:url . "https://github.com/hoffstaetter/find-file-in-repository") (:keywords "files" "convenience" "repository" "project" "source control"))]) (find-file-in-project . [(3 3) nil "Find files in a project quickly." single ((:url . "http://www.emacswiki.org/cgi-bin/wiki/FindFileInProject") (:keywords "project" "convenience"))]) (finalize . [(1 0 0) ((emacs (24 1)) (cl-lib (0 3)) (eieio (1 4))) "finalizers for Emacs Lisp" tar nil]) (fill-column-indicator . [(1 81) nil "Graphically indicate the fill column" tar ((:keywords "convenience"))]) (fastnav . [(1 0 7) nil "Fast navigation and editing routines." single ((:keywords "nav" "fast" "fastnav" "navigation"))]) (fasm-mode . [(0 1 10) nil "Fasm major mode" single ((:url . "https://github.com/Fanael/fasm-mode"))]) (fancy-narrow . [(0 9 4) nil "narrow-to-region with more eye candy." single ((:url . "http://github.com/Bruce-Connor/fancy-narrow-region") (:keywords "faces" "convenience"))]) (fancy-battery . [(0 2) ((emacs (24 1))) "Fancy battery display" single ((:url . "https://github.com/lunaryorn/fancy-battery.el") (:keywords "convenience" "tools" "hardware"))]) (factlog . [(0 0 1) nil "File activity logger" single nil]) (fabric . [(0 1 0) nil "Launch Fabric using Emacs" tar ((:url . "https://github.com/nlamirault/fabric.el") (:keywords "python" "fabric"))]) (f . [(0 17 1) ((s (1 7 0)) (dash (2 2 0))) "Modern API for working with files and directories" single ((:url . "http://github.com/rejeep/f.el") (:keywords "files" "directories"))]) (eyebrowse . [(0 3 2) ((dash (2 7 0))) "Easy window config switching" single ((:url . "https://github.com/wasamasa/eyebrowse") (:keywords "convenience"))]) (extend-dnd . [(0 5) nil "R drag and Drop" tar ((:url . "https://github.com/mlf176f2/extend-dnd") (:keywords "extend" "drag and drop"))]) (express . [(0 6 0) ((string-utils (0 3 2))) "Alternatives to `message'" single ((:url . "http://github.com/rolandwalker/express") (:keywords "extensions" "message" "interface"))]) (expand-region . [(0 10 0) nil "Increase selected region by semantic units." tar nil]) (exec-path-from-shell . [(1 8) nil "Get environment variables such as $PATH from the shell" single ((:url . "https://github.com/purcell/exec-path-from-shell") (:keywords "environment"))]) (eww-lnum . [(1 0) nil "Operations using link numbers" single ((:url . "https://github.com/m00natic/eww-lnum") (:keywords "eww" "browse" "conkeror"))]) (evm . [(0 4 2) ((dash (2 3 0)) (f (0 13 0))) "Emacs Version Manager" single ((:url . "http://github.com/rejeep/evm"))]) (evil-visualstar . [(0 0 1) ((evil (0))) "Starts a * or # search from the visual selection" single ((:url . "https://github.com/bling/evil-visualstar") (:keywords "evil" "vim" "visualstar"))]) (evil-space . [(0 0 2) ((evil (1 0 0))) "Repeat motion in Evil. Correct the behaviour of what SPC should do." single ((:url . "http://github.com/linktohack/evil-space") (:keywords "space" "repeat" "motion"))]) (evil-search-highlight-persist . [(1 1) nil "Persistent highlights after search" single nil]) (evil-org . [(0 1 1) ((evil (0)) (org (0))) "evil keybindings for org-mode" single ((:url . "https://github.com/edwtjo/evil-org-mode.git") (:keywords "evil" "vim-emulation" "org-mode" "key-bindings" "presets"))]) (evil-numbers . [(0 4) nil "increment/decrement numbers like in vim" single ((:url . "http://github.com/cofi/evil-numbers") (:keywords "numbers" "increment" "decrement" "octal" "hex" "binary"))]) (evil-nerd-commenter . [(1 5 5) nil "Comment/uncomment lines efficiently. Like Nerd Commenter in Vim" tar nil]) (evil-matchit . [(1 4 0) nil "Vim matchit ported into Emacs (requires EVIL)" tar nil]) (evil-leader . [(0 4 3) ((evil (0))) "let there be " single ((:url . "http://github.com/cofi/evil-leader") (:keywords "evil" "vim-emulation" "leader"))]) (evil-jumper . [(0 0 1) ((evil (0))) "Jump like vimmers do!" single ((:url . "https://github.com/bling/evil-jumper") (:keywords "evil" "vim" "jumplist" "jump" "list"))]) (evil-args . [(1 0) ((evil (1 0 8))) "Motions and text objects for delimited arguments in Evil." single ((:url . "http://github.com/wcsmith/evil-args") (:keywords "evil" "vim-emulation"))]) (evil . [(1 0 9) ((undo-tree (0 6 3)) (goto-last-change (1 2))) "Extensible Vi layer for Emacs." tar nil]) (eval-sexp-fu . [(0 4 0) nil "Tiny functionality enhancements for evaluating sexps." single ((:keywords "lisp" "highlight" "convenience"))]) (esup . [(0 4) nil "the Emacs StartUp Profiler (ESUP)" single ((:url . "http://github.com/jschaf/esup") (:keywords "emacs-lisp" "elisp" "profile" "startup"))]) (ess-smart-underscore . [(0 79) nil "Ess Smart Underscore" tar ((:url . "http://github.com/mlf176f2/ess-smart-underscore.el") (:keywords "ess" "underscore"))]) (ess . [(14 9) nil "No description available." tar nil]) (espuds . [(0 2 6) ((s (1 7 0)) (dash (2 2 0)) (noflet (0 0 10)) (f (0 12 1))) "Ecukes step definitions" single ((:url . "http://github.com/ecukes/espuds") (:keywords "test"))]) (es-windows . [(0 3) ((cl-lib (0 3)) (emacs (24))) "Window-management utilities" single ((:url . "https://github.com/sabof/es-windows"))]) (es-mode . [(3 1 0) nil "A major mode for editing Elasticsearch queries" tar ((:url . "http://www.github.com/dakrone/es-mode") (:keywords "elasticsearch"))]) (ert-runner . [(0 6 3) ((s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Opinionated Ert testing workflow" tar ((:url . "http://github.com/rejeep/ert-runner.el") (:keywords "test"))]) (ert-junit . [(0 1 1) ((ert (0))) "JUnit XML reports from ert results" single ((:url . "http://bitbucket.org/olanilsson/ert-junit") (:keywords "tools" "test" "unittest" "ert"))]) (ert-async . [(0 1 1) nil "Async support for ERT" single ((:url . "http://github.com/rejeep/ert-async.el") (:keywords "test"))]) (ergoemacs-mode . [(5 14 7 3) ((emacs (24 1)) (undo-tree (0 6 5))) "Emacs mode based on common modern interface and ergonomics." tar ((:url . "https://github.com/ergoemacs/ergoemacs-mode") (:keywords "convenience"))]) (ercn . [(1 0 2) nil "Flexible ERC notifications" single ((:url . "http://www.github.com/leathekd/ercn"))]) (erc-hl-nicks . [(1 3 0) nil "ERC nick highlighter that ignores uniquifying chars when colorizing" single ((:url . "http://www.github.com/leathekd/erc-hl-nicks"))]) (erc-crypt . [(1 0) nil "Symmetric Encryption for ERC" single ((:keywords "application"))]) (epl . [(0 7) ((cl-lib (0 3))) "Emacs Package Library" single ((:url . "http://github.com/cask/epl") (:keywords "convenience"))]) (epc . [(0 1 0) ((concurrent (0 3 1)) (ctable (0 1 0))) "A RPC stack for the Emacs Lisp" tar ((:url . "https://github.com/kiwanami/emacs-epc") (:keywords "lisp" "rpc"))]) (enotify . [(0 1 3) nil "No description available." tar nil]) (emmet-mode . [(1 0 8) nil "Unofficial Emmet's support for emacs" single ((:url . "https://github.com/smihica/emmet-mode") (:keywords "convenience"))]) (emamux . [(0 12) ((cl-lib (0 5))) "Interact with tmux" single ((:url . "https://github.com/syohex/emacs-emamux"))]) (emacsql . [(1 0 2) ((emacs (24 3)) (cl-lib (0 3)) (finalize (1 0 0))) "high-level SQL database front-end" tar ((:url . "https://github.com/skeeto/emacsql"))]) (emacsc . [(1 2 20131027) nil "helper for emacsc(1)" tar ((:url . "https://github.com/knu/emacsc") (:keywords "tools"))]) (emacs-setup . [(1 0) nil "Package for maintaining your emacs configuration. Clean up your .emacs!" tar nil]) (emacs-eclim . [(0 2) nil "No description available." tar nil]) (elx . [(0 9 6) ((emacs (24 3 50))) "extract information from Emacs Lisp libraries" single ((:url . "https://github.com/tarsius/elx") (:keywords "docs" "libraries" "packages"))]) (elpy . [(1 5 1) ((company (0 8 2)) (find-file-in-project (3 3)) (highlight-indentation (0 5 0)) (idomenu (0 1)) (pyvenv (1 3)) (yasnippet (0 8 0))) "Emacs Python Development Environment" tar nil]) (elpa-mirror . [(1 1 3) nil "ELPA mirror from locally installed packages is easy" tar nil]) (elpa-audit . [(0 4) nil "Handy functions for inspecting and comparing package archives" single ((:url . "https://github.com/purcell/elpa-audit") (:keywords "maint"))]) (elmine . [(0 3) nil "No description available." single nil]) (elmacro . [(0 2 0) ((s (1 9 0)) (dash (1 5 0)) (cl-lib (0 5))) "Convert keyboard macros to elisp" single ((:url . "https://github.com/Silex/elmacro") (:keywords "macro" "elisp" "convenience"))]) (elixir-mode . [(2 0 1) nil "Major mode for editing Elixir files" tar ((:url . "https://github.com/elixir-lang/emacs-elixir") (:keywords "languages" "elixir"))]) (elixir-mix . [(1 0 0) nil "Emacs integration for Elixir's mix" single ((:url . "http://github.com/tonini/elixir-mix.el") (:keywords "elixir" "mix" "elixir-mix"))]) (elisp-slime-nav . [(0 7) ((cl-lib (0 2))) "Make M-. and M-, work in elisp like they do in slime" single ((:url . "https://github.com/purcell/elisp-slime-nav") (:keywords "navigation" "slime" "elisp" "emacs-lisp"))]) (elfeed-web . [(1 1 1) ((simple-httpd (1 4 3)) (elfeed (1 0 1)) (emacs (24 1))) "web interface to Elfeed" tar nil]) (elfeed . [(1 1 1) ((emacs (24 1))) "an Emacs Atom/RSS feed reader" tar nil]) (el-x . [(0 3 0) nil "main entry point for el-x package" tar ((:keywords "lisp"))]) (el-spice . [(0 2 2) ((thingatpt+ (0))) "Extra spice for emacs lisp programming" tar ((:url . "https://github.com/vedang/el-spice") (:keywords "configuration"))]) (el-mock . [(1 25 0) nil "Tiny Mock and Stub framework in Emacs Lisp" single ((:url . "http://github.com/rejeep/el-mock.el") (:keywords "lisp" "testing" "unittest"))]) (el-get . [(5 1) nil "Manage the external elisp bits and pieces you depend upon" tar ((:url . "http://www.emacswiki.org/emacs/el-get") (:keywords "emacs" "package" "elisp" "install" "elpa" "git" "git-svn" "bzr" "cvs" "svn" "darcs" "hg" "apt-get" "fink" "pacman" "http" "http-tar" "emacswiki"))]) (el-autoyas . [(0 5) nil "Automatically create Emacs-Lisp Yasnippets" tar ((:url . "https://github.com/mlf176f2/el-autoyas.el") (:keywords "emacs" "lisp" "mode" "yasnippet"))]) (ein . [(0 2 0) ((websocket (0 9)) (auto-complete (1 4))) "Emacs IPython Notebook" tar nil]) (eide . [(2 0 0) nil "Emacs-IDE" tar ((:url . "http://emacs-ide.tuxfamily.org/"))]) (egison-mode . [(3 3 12) nil "Egison editing mode" single ((:url . "https://github.com/egisatoshi/egison3/blob/master/elisp/egison-mode.el"))]) (edts . [(0 1 0) nil "No description available." tar nil]) (editorconfig . [(0 3) nil "EditorConfig Emacs extension" single ((:url . "http://github.com/editorconfig/editorconfig-emacs#readme"))]) (edit-server . [(1 13) nil "server that responds to edit requests from Chrome" single ((:url . "https://github.com/stsquad/emacs_chrome"))]) (edit-list . [(0 3) nil "edit a single list" single ((:url . "http://mwolson.org/static/dist/elisp/edit-list.el"))]) (edbi . [(0 1 2) ((concurrent (0 3 1)) (ctable (0 1 1)) (epc (0 1 1))) "Emacs Database Interface" tar nil]) (ecukes . [(0 6 15) ((commander (0 6 1)) (espuds (0 2 2)) (ansi (0 3 0)) (dash (2 2 0)) (s (1 8 0)) (f (0 11 0))) "Cucumber for Emacs." tar nil]) (ecb . [(2 -3 24) nil "a code browser for Emacs" tar ((:keywords "browser" "code" "programming" "tools"))]) (ebib . [(1 15 6) nil "a BibTeX database manager" tar ((:keywords "text" "bibtex"))]) (easy-kill-extras . [(0 9 3) ((easy-kill (0 9 4))) "Extra functions for easy-kill." single ((:url . "https://github.com/knu/easy-kill-extras.el") (:keywords "killing" "convenience"))]) (easy-kill . [(0 9 3) ((emacs (24)) (cl-lib (0 5))) "kill & mark things easily" tar ((:url . "https://github.com/leoliu/easy-kill") (:keywords "killing" "convenience"))]) (e2wm-R . [(0 4) ((e2wm (1 2))) "some e2wm plugin and perspective for GNU R" single ((:keywords "window manager" "convenience" "e2wm"))]) (e2wm . [(1 3) nil "simple window manager for emacs" tar ((:keywords "tools" "window manager"))]) (dynamic-fonts . [(0 6 4) ((font-utils (0 7 0)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Set faces based on available fonts" single ((:url . "http://github.com/rolandwalker/dynamic-fonts") (:keywords "faces" "frames"))]) (dvorak-mode . [(1 0 0) nil "Switch to dvorak layout easily" single ((:url . "https://github.com/proofit404/dvorak-mode"))]) (ducpel . [(0 1) ((cl-lib (0 5))) "Logic game with sokoban elements" tar ((:url . "https://github.com/alezost/ducpel") (:keywords "games"))]) (drupal-spell . [(0 2 2) nil "Aspell extra dictionary for Drupal" tar ((:url . "https://github.com/arnested/drupal-spell") (:keywords "wp"))]) (drupal-mode . [(0 5 0) ((php-mode (1 5 0))) "Advanced minor mode for Drupal development" tar ((:url . "https://github.com/arnested/drupal-mode") (:keywords "programming" "php" "drupal"))]) (drag-stuff . [(0 1 0) nil "Drag stuff (lines, words, region, etc...) around" tar nil]) (dispass . [(1 1 2) nil "Emacs wrapper for DisPass" single ((:url . "http://projects.ryuslash.org/dispass.el/") (:keywords "processes"))]) (discover . [(0 3) ((makey (0 3))) "discover more of Emacs" single nil]) (dired-k . [(0 11) ((cl-lib (0 5)) (emacs (24))) "highlight dired buffer by file size, modified time, git status" tar ((:url . "https://github.com/syohex/emacs-dired-k"))]) (dired-efap . [(0 8) nil "Edit Filename At Point in a dired buffer" single ((:keywords "dired" "environment" "files" "renaming"))]) (diminish . [(0 44) nil "Diminished modes are minor modes with no modeline display" single ((:url . "http://www.eskimo.com/~seldon") (:keywords "extensions" "diminish" "minor" "codeprose"))]) (dim-autoload . [(1 1 2) nil "dim complete autoload cookie lines" single ((:url . "http://github.com/tarsius/dim-autoload") (:keywords "convenience"))]) (digistar-mode . [(0 3) nil "major mode for Digistar scripts" single ((:keywords "languages"))]) (dictionary . [(1 10) nil "No description available." single nil]) (desktop-registry . [(1 2 0) nil "Keep a central registry of desktop files" single ((:url . "http://projects.ryuslash.org/desktop-registry/") (:keywords "convenience"))]) (demangle-mode . [(1 0) ((emacs (24)) (cl-lib (0 1))) "Automatically demangle C++ symbols" single ((:keywords "c" "tools"))]) (deft . [(0 5 1) nil "quickly browse, filter, and edit plain text notes" single ((:url . "http://jblevins.org/projects/deft/") (:keywords "plain text" "notes" "simplenote" "notational velocity"))]) (deferred . [(0 3 2) nil "Simple asynchronous functions for emacs lisp" single ((:url . "https://github.com/kiwanami/emacs-deferred") (:keywords "deferred" "async"))]) (dedicated . [(1 0 0) nil "A very simple minor mode for dedicated buffers" single ((:keywords "dedicated" "buffer"))]) (dash-functional . [(2 9 0) ((dash (2 0 0)) (emacs (24))) "Collection of useful combinators for Emacs Lisp" single ((:keywords "lisp" "functions" "combinators"))]) (dash . [(2 9 0) nil "A modern list library for Emacs" single ((:keywords "lists"))]) (dart-mode . [(0 9) nil "Major mode for editing Dart files" single ((:url . "http://code.google.com/p/dart-mode") (:keywords "language"))]) (d-mode . [(2 0 6) nil "D Programming Language mode for (X)Emacs" single ((:keywords "d" "programming" "language" "emacs" "cc-mode"))]) (cython-mode . [(0 21 2 2) nil "Major mode for editing Cython files" single nil]) (cyberpunk-theme . [(1 10) nil "Cyberpunk Color Theme" single ((:keywords "color" "theme" "cyberpunk"))]) (cuda-mode . [(1 0 0) nil "NVIDIA CUDA Major Mode" single ((:keywords "c" "languages"))]) (ctags-update . [(0 2 0) nil "(auto) update TAGS in parent directory using exuberant-ctags" single ((:url . "https://github.com/jixiuf/helm-etags-plus") (:keywords "exuberant-ctags" "etags"))]) (ctags . [(1 1 1) nil "No description available." single nil]) (ctable . [(0 1 2) nil "Table component for Emacs Lisp" single ((:url . "https://github.com/kiwanami/emacs-ctable") (:keywords "table"))]) (cryptol-mode . [(0 1 0) nil "Cryptol major mode for Emacs" single ((:url . "http://github.com/thoughtpolice/cryptol-mode") (:keywords "cryptol" "cryptography"))]) (crm-custom . [(0 4) nil "Alternate `completing-read-multiple' that uses `completing-read'" single ((:url . "https://github.com/DarwinAwardWinner") (:keywords "completion" "minibuffer" "multiple elements"))]) (creds . [(0 0 6 1) ((s (1 9 0)) (dash (2 5 0))) "A parser credentials file library (not limited to credentials entries)" tar nil]) (cpputils-cmake . [(0 4 18) nil "Easy real time C++ syntax check and intellisense if you use CMake" tar nil]) (cperl-mode . [(6 2) nil "Perl code editing commands for Emacs" single ((:keywords "languages" "perl"))]) (connection . [(1 10) nil "No description available." single nil]) (conkeror-minor-mode . [(1 6 1) nil "Mode for editing conkeror javascript files." single ((:url . "http://github.com/BruceConnor/conkeror-minor-mode") (:keywords "programming" "tools"))]) (concurrent . [(0 3 2) ((deferred (0 3 1))) "Concurrent utility functions for emacs lisp" single ((:url . "https://github.com/kiwanami/emacs-deferred/blob/master/README-concurrent.markdown") (:keywords "deferred" "async" "concurrent"))]) (company-tern . [(0 2 0) ((company (0 8 0)) (tern (0 0 1)) (dash (2 8 0)) (dash-functional (2 8 0)) (s (1 9 0)) (cl-lib (0 5 0))) "Tern backend for company-mode" single ((:url . "https://github.com/proofit404/company-tern"))]) (company-ghc . [(0 1 7) ((cl-lib (0 5)) (company (0 8 0)) (ghc (4 1 1)) (emacs (24))) "company-mode ghc-mod backend" single ((:url . "https://github.com/iquiw/company-ghc") (:keywords "haskell" "completion"))]) (company . [(0 8 6) ((emacs (24 1)) (cl-lib (0 5))) "Modular text completion framework" tar ((:url . "http://company-mode.github.io/") (:keywords "abbrev" "convenience" "matching"))]) (commander . [(0 7 0) ((s (1 6 0)) (dash (2 0 0)) (cl-lib (0 3)) (f (0 6 1))) "Emacs command line parser" single ((:url . "http://github.com/rejeep/commander.el") (:keywords "cli" "argv"))]) (colorsarenice-theme . [(1 0 12) ((emacs (24))) "A color theme." tar nil]) (color-theme-sanityinc-tomorrow . [(1 14) nil "A version of Chris Kempson's various Tomorrow themes" tar nil]) (color-theme-sanityinc-solarized . [(2 27) nil "A version of Ethan Schoonover's Solarized themes" tar nil]) (coffee-mode . [(0 5 5) ((emacs (24 1)) (cl-lib (0 5))) "Major mode to edit CoffeeScript files in Emacs" single ((:url . "http://github.com/defunkt/coffee-mode") (:keywords "coffeescript" "major" "mode"))]) (codic . [(0 2) ((cl-lib (0 5))) "Search Codic (codic.jp) naming dictionaries" tar ((:url . "https://github.com/syohex/emacs-codic"))]) (cmake-mode . [(3 0 2) nil "major-mode for editing CMake sources" single nil]) (cmake-ide . [(0 2) nil "No description available." single nil]) (cm-mode . [(1 1) nil "Minor mode for CriticMarkup" single ((:keywords "text" "markdown"))]) (clojure-test-mode . [(3 0 0) ((clojure-mode (1 7)) (cider (0 4 0))) "Minor mode for Clojure tests" single ((:url . "http://emacswiki.org/cgi-bin/wiki/ClojureTestMode") (:keywords "languages" "lisp" "test"))]) (clojure-snippets . [(1 0 0) ((yasnippet (0 8 0))) "Yasnippets for clojure" tar nil]) (clojure-mode-extra-font-locking . [(3 0 0) ((clojure-mode (3 0))) "Extra font-locking for Clojure mode" single ((:url . "http://github.com/clojure-emacs/clojure-mode") (:keywords "languages" "lisp"))]) (clojure-mode . [(3 0 0) ((emacs (24 1))) "Major mode for Clojure code" single ((:url . "http://github.com/clojure-emacs/clojure-mode") (:keywords "languages" "clojure" "clojurescript" "lisp"))]) (clojure-cheatsheet . [(0 2 2) ((helm (1 5 3)) (cider (0 1 8))) "The Clojure Cheatsheet for Emacs" single ((:url . "https://github.com/krisajenkins/clojure-cheatsheet") (:keywords "clojure" "nrepl" "cheatsheet" "helm"))]) (clj-refactor . [(0 12 0) ((s (1 8 0)) (dash (2 4 0)) (yasnippet (0 6 1)) (paredit (22)) (multiple-cursors (1 2 2))) "A collection of clojure refactoring functions" single ((:keywords "convenience"))]) (clips-mode . [(0 7) nil "Major mode for editing CLIPS code and REPL" tar nil]) (cl-lib-highlight . [(1 0 0) ((cl-lib (0 3))) "full cl-lib font-lock highlighting" single ((:url . "https://github.com/skeeto/cl-lib-highlight"))]) (cider . [(0 7 0) ((clojure-mode (2 0 0)) (cl-lib (0 3)) (dash (2 4 1)) (pkg-info (0 4)) (emacs (24))) "Clojure Integrated Development Environment and REPL" tar ((:url . "http://www.github.com/clojure-emacs/cider") (:keywords "languages" "clojure" "cider"))]) (charmap . [(0 0 1) nil "Unicode table for Emacs" single ((:url . "https://github.com/lateau/charmap") (:keywords "unicode" "character" "ucs"))]) (cfengine-code-style . [(3 6 2) nil "C code style for CFEngine project." single ((:url . "https://github.com/cfengine/core"))]) (cerbere . [(0 1 0) ((s (1 9 0)) (f (0 16 0)) (go-mode (20140409)) (pkg-info (0 5))) "Unit testing in Emacs for several programming languages" tar ((:url . "https://github.com/nlamirault/cerbere") (:keywords "python" "go" "php" "tests" "tdd"))]) (cdlatex . [(4 7) nil "Fast input methods for LaTeX environments and math" single ((:keywords "tex"))]) (cask . [(0 7 2) ((s (1 8 0)) (dash (2 2 0)) (f (0 16 0)) (epl (0 5)) (shut-up (0 1 0)) (cl-lib (0 3)) (package-build (0 1))) "Cask: Project management for Emacs package development" tar ((:url . "http://github.com/cask/cask") (:keywords "speed" "convenience"))]) (calfw . [(1 3) nil "Calendar view framework on Emacs" tar ((:keywords "calendar"))]) (cake2 . [(2 1 0) ((dash (2 6 0)) (s (1 9 0)) (f (0 16 2)) (ht (2 0)) (json (1 2)) (cake-inflector (1 1 0)) (historyf (0 0 8)) (anything (1 3 9))) "CakePHP2 Minor Mode" tar ((:url . "http://code.101000lab.org"))]) (cake-inflector . [(1 1 1) ((s (1 9 0))) "Lazy porting CakePHP infrector.php to el" single ((:url . "https://github.com/k1LoW/emacs-cake-inflector"))]) (cake . [(1 4 3) ((cake-inflector (1 1 0)) (historyf (0 0 8)) (anything (1 3 9))) "CakePHP Minor Mode" tar ((:url . "https://github.com/k1LoW/emacs-cake"))]) (cacoo . [(2 1 2) ((concurrent (0 3 1))) "Minor mode for Cacoo : http://cacoo.com" tar nil]) (button-lock . [(1 0 0) nil "Clickable text defined by regular expression" single ((:url . "http://github.com/rolandwalker/button-lock") (:keywords "mouse" "button" "hypermedia" "extensions"))]) (butler . [(0 2 3) ((deferred (3 1)) (json (1 2)) (emacs (24))) "Emacs client for Jenkins" tar nil]) (bundler . [(1 1 0) ((inf-ruby (2 1))) "Interact with Bundler from Emacs" single ((:url . "http://github.com/tobiassvn/") (:keywords "bundler" "ruby"))]) (bug-reference-github . [(0 2 0) nil "Automatically set `bug-reference-url-format' in Github repositories." single ((:url . "https://github.com/arnested/bug-reference-github") (:keywords "programming" "tools"))]) (bufshow . [(0 1 0) nil "No description available." single nil]) (buffer-utils . [(0 1 0) nil "Buffer-manipulation utility functions" single ((:url . "http://github.com/rolandwalker/buffer-utils") (:keywords "extensions"))]) (buffer-move . [(0 6 1) nil "" single ((:url . "https://github.com/lukhas/buffer-move") (:keywords "lisp" "convenience"))]) (browse-url-dwim . [(0 6 8) ((string-utils (0 3 2))) "Context-sensitive external browse URL or Internet search" single ((:url . "http://github.com/rolandwalker/browse-url-dwim") (:keywords "hypermedia"))]) (browse-kill-ring . [(1 6 0) nil "interactively insert items from kill-ring" single ((:url . "https://github.com/browse-kill-ring/browse-kill-ring") (:keywords "convenience"))]) (bog . [(0 6 0) ((org (8 0 0)) (dash (2 5 0))) "Extensions for research notes in Org mode" single ((:url . "https://github.com/kyleam/bog") (:keywords "bibtex" "org-mode"))]) (birds-of-paradise-plus-theme . [(0 1 1) nil "A brown/orange light-on-dark theme for Emacs 24 (deftheme)." single ((:url . "https://github.com/jimeh/birds-of-paradise-plus-theme.el") (:keywords "themes"))]) (bind-key . [(20140601) nil "A simple way to manage personal keybindings" single ((:url . "https://github.com/jwiegley/use-package") (:keywords "keys" "keybinding" "config" "dotemacs"))]) (beeminder . [(1 0 0) nil "Emacs interface for Beeminder" single ((:keywords "beeminder"))]) (bbdb2erc . [(0 1 3) ((bbdb (3 0))) "make bbdb show if pal is online with ERC, click i to chat" single ((:keywords "irc" "contacts" "chat" "client" "internet"))]) (bbdb-vcard . [(0 3) nil "vCard import/export for BBDB" tar ((:url . "http://github.com/trebb/bbdb-vcard") (:keywords "data" "calendar" "mail" "news"))]) (bbcode-mode . [(2 0 0) nil "Major mode for writing BBCode markup" single ((:url . "https://github.com/ejmr/bbcode-mode"))]) (back-button . [(0 6 6) ((nav-flash (1 0 0)) (smartrep (0 0 3)) (ucs-utils (0 7 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Visual navigation through mark rings" single ((:url . "http://github.com/rolandwalker/back-button") (:keywords "convenience" "navigation" "interface"))]) (babel . [(1 4) nil "interface to web translation services such as Babelfish" single ((:keywords "translation" "web"))]) (autopair . [(0 6 1) ((cl-lib (0 3))) "Automagically pair braces and quotes like TextMate" single ((:url . "http://autopair.googlecode.com") (:keywords "convenience" "emulations"))]) (auto-shell-command . [(1 0 0) ((deferred (20130312)) (popwin (20130329))) "Run the shell command asynchronously that you specified when you save the file." single ((:keywords "shell" "save" "async" "deferred" "auto"))]) (auto-indent-mode . [(0 126) nil "Auto indent Minor mode" tar ((:url . "https://github.com/mlf176f2/auto-indent-mode.el/") (:keywords "auto" "indentation"))]) (auto-dictionary . [(1 1) nil "automatic dictionary switcher for flyspell" single ((:url . "http://nschum.de/src/emacs/auto-dictionary/") (:keywords "wp"))]) (auto-complete-exuberant-ctags . [(0 0 7) ((auto-complete (1 4 0))) "Exuberant ctags auto-complete.el source" single ((:url . "http://code.101000lab.org") (:keywords "anto-complete" "exuberant ctags"))]) (auto-complete-clang-async . [(0 5) nil "Auto Completion source for clang for GNU Emacs" single ((:keywords "completion" "convenience"))]) (auto-complete . [(1 4 0) ((popup (0 5 0))) "Auto Completion for GNU Emacs" tar nil]) (auto-compile . [(1 2 1) ((cl-lib (0 2)) (packed (0 3 4))) "automatically compile Emacs Lisp libraries" single ((:url . "http://tarsius.github.com/auto-compile") (:keywords "compile" "convenience" "lisp"))]) (aurel . [(0 6) nil "Search, get info, vote and download AUR packages" single ((:url . "https://github.com/alezost/aurel") (:keywords "tools"))]) (async . [(1 2) nil "Asynchronous processing in Emacs" tar nil]) (apples-mode . [(0 0 2) nil "Major mode for editing and executing AppleScript code" tar ((:keywords "applescript" "languages"))]) (anzu . [(0 41) ((cl-lib (0 5)) (emacs (24))) "Show number of matches in mode-line while searching" single ((:url . "https://github.com/syohex/emacs-anzu"))]) (anything-replace-string . [(0 9 2) ((anything (1 3 9))) "`replace-string' and `query-replace' `anything.el' interface" single ((:url . "http://code.101000lab.org"))]) (anything-exuberant-ctags . [(0 1 2) ((anything (1 3 9))) "Exuberant ctags anything.el interface" single ((:url . "http://code.101000lab.org") (:keywords "anything" "exuberant ctags"))]) (anything . [(1 3 9) nil "open anything / QuickSilver-like candidate-selection framework" tar ((:url . "http://repo.or.cz/w/anything-config.git") (:keywords "files" "frames" "help" "matching" "outlines" "processes" "tools" "convenience" "anything"))]) (anyins . [(0 1 1) nil "Insert content at multiple places from shell command or kill-ring" single ((:url . "http://github.com/antham/anyins") (:keywords "insert" "rectangular"))]) (anti-zenburn-theme . [(2 1) nil "Low-contrast Zenburn-inverted theme" single ((:url . "https://github.com/m00natic/anti-zenburn-theme"))]) (ansible-doc . [(0 1) ((emacs (24 1))) "Ansible documentation Minor Mode" single ((:url . "https://github.com/lunaryorn/ansible-doc.el") (:keywords "tools" "help"))]) (ansible . [(0 0 2) ((s (1 9 0)) (f (0 16 2))) "Ansible minor mode" tar ((:url . "http://101000lab.org"))]) (ansi . [(0 4 0) ((s (1 6 1)) (dash (1 5 0)) (noflet (0 0 11))) "Turn string into ansi strings" single ((:url . "http://github.com/rejeep/ansi") (:keywords "color" "ansi"))]) (angular-snippets . [(0 2 3) ((s (1 4 0)) (dash (1 2 0))) "Yasnippets for AngularJS" tar nil]) (anaphora . [(1 0 0) nil "anaphoric macros providing implicit temp variables" single ((:url . "http://github.com/rolandwalker/anaphora") (:keywords "extensions"))]) (anaconda-mode . [(0 1 0) nil "No description available." tar nil]) (alect-themes . [(0 6) nil "Configurable color themes (light, dark and black) for Emacs 24" tar nil]) (ag . [(0 44) nil "A front-end for ag ('the silver searcher'), the C ack replacement." single nil]) (aes . [(0 6) nil "Implementation of AES" single ((:url . "https://github.com/gaddhi/aes") (:keywords "data" "tools"))]) (adoc-mode . [(0 6 2) ((markup-faces (1 0 0))) "a major-mode for editing AsciiDoc files in Emacs" single ((:url . "https://github.com/sensorflo/adoc-mode/wiki") (:keywords "wp" "asciidoc"))]) (actionscript-mode . [(7 2 2) nil "A simple mode for editing Actionscript 3 files" single ((:keywords "language" "modes"))]) (ack-and-a-half . [(1 2 0) nil "Yet another front-end for ack" single ((:url . "http://technosorcery.net"))]) (ace-window . [(0 4 0) ((ace-jump-mode (2 0))) "Quickly switch windows using `ace-jump-mode'." single ((:url . "https://github.com/abo-abo/ace-window") (:keywords "cursor" "window" "location"))]) (ace-jump-mode . [(2 0) nil "a quick cursor location minor mode for emacs" single ((:url . "https://github.com/winterTTr/ace-jump-mode/") (:keywords "motion" "location" "cursor"))]) (ac-slime . [(0 7) ((auto-complete (1 4)) (slime (2 9)) (cl-lib (0 5))) "An auto-complete source using slime completions" single ((:url . "https://github.com/purcell/ac-slime"))]) (ac-octave . [(0 4) ((auto-complete (1 4 0))) "An auto-complete source for Octave" single ((:url . "https://github.com/coldnew/ac-octave") (:keywords "octave" "auto-complete" "completion"))]) (ac-ispell . [(0 6) ((auto-complete (1 4))) "ispell completion source for auto-complete" single ((:url . "https://github.com/syohex/emacs-ac-ispell"))]) (ac-inf-ruby . [(0 4) ((inf-ruby (2 3 2)) (auto-complete (1 4))) "Enable auto-complete in inf-ruby sessions" single ((:keywords "languages" "tools"))]) (ac-helm . [(2 1) ((helm (20130328)) (auto-complete (1 4 0)) (popup (0 5 0))) "Auto Complete with Helm" single ((:keywords "completion" "convenience" "helm"))]) (ac-haskell-process . [(0 4) ((auto-complete (1 4)) (haskell-mode (13))) "Haskell auto-complete source which uses the current haskell process" single ((:keywords "languages"))]) (ac-geiser . [(0 1) ((geiser (0 5)) (auto-complete (1 4))) "Auto-complete backend for geiser" tar nil]) (ac-etags . [(0 6) ((auto-complete (1 4))) "etags/ctags completion source for auto-complete" single ((:url . "https://github.com/syohex/emacs-ac-etags"))]) (ac-dcd . [(0 4) ((auto-complete (1 3 1)) (flycheck-dmd-dub (0 7))) "Auto Completion source for dcd for GNU Emacs" single ((:url . "http://github.com/atilaneves/ac-dcd") (:keywords "languages"))]) (ac-cider . [(0 2 0) ((cider (0 6 0)) (auto-complete (1 4))) "Clojure auto-complete sources using CIDER" single ((:url . "https://github.com/clojure-emacs/ac-cider") (:keywords "languages" "clojure" "nrepl" "cider" "compliment"))]) (ac-cake2 . [(1 0 1) ((cake2 (1 1 2)) (auto-complete (1 4 0))) "CakePHP 2 Minor Mode auto-complete.el source" single ((:url . "http://code.101000lab.org"))]) (ac-cake . [(1 0 0) ((cake (1 4 2)) (auto-complete (1 4))) "CakePHP Minor Mode auto-complete.el source" single ((:url . "http://code.101000lab.org"))]) (abc-mode . [(20140225 944) nil "Major mode for editing abc music files" single ((:keywords "local" "docs"))])) diff --git a/elpa/cider-0.4.0/cider-autoloads.el b/elpa/cider-0.4.0/cider-autoloads.el new file mode 100644 index 000000000..d99499f45 --- /dev/null +++ b/elpa/cider-0.4.0/cider-autoloads.el @@ -0,0 +1,86 @@ +;;; cider-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads (cider cider-jack-in) "cider" "cider.el" (21410 +;;;;;; 46219 594436 0)) +;;; Generated autoloads from cider.el + +(autoload 'cider-jack-in "cider" "\ +Start a nREPL server for the current project and connect to it. +If PROMPT-PROJECT is t, then prompt for the project for which to +start the server. + +\(fn &optional PROMPT-PROJECT)" t nil) + +(autoload 'cider "cider" "\ +Connect to an nREPL server identified by HOST and PORT. + +\(fn HOST PORT)" t nil) + +(eval-after-load 'clojure-mode '(progn (define-key clojure-mode-map (kbd "C-c M-j") 'cider-jack-in) (define-key clojure-mode-map (kbd "C-c M-c") 'cider))) + +;;;*** + +;;;### (autoloads (cider-macroexpand-all cider-macroexpand-1) "cider-macroexpansion" +;;;;;; "cider-macroexpansion.el" (21410 46219 576456 0)) +;;; Generated autoloads from cider-macroexpansion.el + +(autoload 'cider-macroexpand-1 "cider-macroexpansion" "\ +Invoke 'macroexpand-1' on the expression at point. +If invoked with a PREFIX argument, use 'macroexpand' instead of +'macroexpand-1'. + +\(fn &optional PREFIX)" t nil) + +(autoload 'cider-macroexpand-all "cider-macroexpansion" "\ +Invoke 'clojure.walk/macroexpand-all' on the expression at point. + +\(fn)" t nil) + +;;;*** + +;;;### (autoloads (cider-mode) "cider-mode" "cider-mode.el" (21410 +;;;;;; 46219 579114 0)) +;;; Generated autoloads from cider-mode.el + +(autoload 'cider-mode "cider-mode" "\ +Minor mode for REPL interaction from a Clojure buffer. + +\\{cider-mode-map} + +\(fn &optional ARG)" t nil) + +;;;*** + +;;;### (autoloads (cider-selector) "cider-selector" "cider-selector.el" +;;;;;; (21410 46219 586507 0)) +;;; Generated autoloads from cider-selector.el + +(autoload 'cider-selector "cider-selector" "\ +Select a new buffer by type, indicated by a single character. +The user is prompted for a single character indicating the method by +which to choose a new buffer. The `?' character describes then +available methods. OTHER-WINDOW provides an optional target. + +See `def-cider-selector-method' for defining new methods. + +\(fn &optional OTHER-WINDOW)" t nil) + +;;;*** + +;;;### (autoloads nil nil ("cider-client.el" "cider-eldoc.el" "cider-interaction.el" +;;;;;; "cider-pkg.el" "cider-repl.el" "cider-util.el" "cider-version.el" +;;;;;; "nrepl-client.el") (21410 46219 627094 149000)) + +;;;*** + +(provide 'cider-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; cider-autoloads.el ends here diff --git a/elpa/cider-0.4.0/cider-client.el b/elpa/cider-0.4.0/cider-client.el new file mode 100644 index 000000000..ab23b71ea --- /dev/null +++ b/elpa/cider-0.4.0/cider-client.el @@ -0,0 +1,163 @@ +;;; cider-client.el --- A layer of abstraction above the actual client code. + +;; Copyright © 2013 Bozhidar Batsov +;; +;; Author: Bozhidar Batsov + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; A layer of abstraction above the actual client code. + +;;; Code: + +(require 'nrepl-client) + +;;; Words of inspiration +(defun cider-user-first-name () + "Find the current user's first name." + (let ((name (if (string= (user-full-name) "") + (user-login-name) + (user-full-name)))) + (string-match "^[^ ]*" name) + (capitalize (match-string 0 name)))) + +(defvar cider-words-of-inspiration + `("The best way to predict the future is to invent it. -Alan Kay" + "A point of view is worth 80 IQ points. -Alan Kay" + "Lisp isn't a language, it's a building material. -Alan Kay" + "Simple things should be simple, complex things should be possible. -Alan Kay" + "Measuring programming progress by lines of code is like measuring aircraft building progress by weight. -Bill Gates" + "Controlling complexity is the essence of computer programming. -Brian Kernighan" + "The unavoidable price of reliability is simplicity. -C.A.R. Hoare" + "You're bound to be unhappy if you optimize everything. -Donald Knuth" + "Simplicity is prerequisite for reliability. -Edsger W. Dijkstra" + "Deleted code is debugged code. -Jeff Sickel" + "The key to performance is elegance, not battalions of special cases. -Jon Bentley and Doug McIlroy" + "First, solve the problem. Then, write the code. -John Johnson" + "Simplicity is the ultimate sophistication. -Leonardo da Vinci" + "Programming is not about typing... it's about thinking. -Rich Hickey" + "Design is about pulling things apart. -Rich Hickey" + "Programmers know the benefits of everything and the tradeoffs of nothing. -Rich Hickey" + "Code never lies, comments sometimes do. -Ron Jeffries" + "The true delight is in the finding out rather than in the knowing. -Isaac Asimov" + "Take this REPL, fellow hacker, and may it serve you well." + "Let the hacking commence!" + "Hacks and glory await!" + "Hack and be merry!" + "Your hacking starts... NOW!" + "May the Source be with you!" + "May the Source shine upon thy REPL!" + "Code long and prosper!" + "Happy hacking!" + "Backend is up, REPL is operational!" + "Your imagination is the only limit to what you can do with this REPL!" + "This REPL is yours to command!" + "Fame is but a hack away!" + ,(format "%s, this could be the start of a beautiful program." + (cider-user-first-name))) + "Scientifically-proven optimal words of hackerish encouragement.") + +(defun cider-random-words-of-inspiration () + "Select a random entry from `cider-words-of-inspiration'." + (eval (nth (random (length cider-words-of-inspiration)) + cider-words-of-inspiration))) + +(defun cider-display-connected-message () + "Message displayed on successful connection." + (message "Connected. %s" (cider-random-words-of-inspiration))) + +(add-hook 'nrepl-connected-hook 'cider-display-connected-message) + +;;; Evaluation helpers +(defun cider-eval (input callback &optional ns session) + "Send the request INPUT and register the CALLBACK as the response handler. +NS & SESSION specify the context in which to evaluate the request." + ;; namespace forms are always evaluated in the "user" namespace + (let ((ns (if (string-match "^[[:space:]]*\(ns\\([[:space:]]*$\\|[[:space:]]+\\)" input) + "user" + ns))) + ;; prevent forms from being evaluated in the wrong or a non-existing namespace + (when (and ns + (derived-mode-p 'clojure-mode) + (not (string= ns nrepl-buffer-ns))) + (cider-eval-ns-form)) + (nrepl-send-string input callback ns session))) + +(defun cider-tooling-eval (input callback &optional ns) + "Send the request INPUT and register the CALLBACK as the response handler. +NS specifies the namespace in which to evaluate the request." + ;; namespace forms are always evaluated in the "user" namespace + (cider-eval input callback ns (nrepl-current-tooling-session))) + +(defun cider-eval-sync (input &optional ns session) + "Send the INPUT to the backend synchronously. +NS & SESSION specify the evaluation context." + (nrepl-send-string-sync input ns session)) + +(defun cider-eval-and-get-value (input &optional ns session) + "Send the INPUT to the backend synchronously and return the value. +NS & SESSION specify the evaluation context." + (cider-get-value (cider-eval-sync input ns session))) + +(defun cider-tooling-eval-sync (input &optional ns) + "Send the INPUT to the backend using a tooling session synchronously. +NS specifies the namespace in which to evaluate the request." + (cider-eval-sync input ns (nrepl-current-tooling-session))) + +(defun cider-get-value (eval-result) + "Get the value from EVAL-RESULT." + (plist-get eval-result :value)) + +(defun cider-send-op (op attributes handler) + "Send the specified OP with ATTRIBUTES and response HANDLER." + (let ((buffer (current-buffer))) + (nrepl-send-request (append + (list "op" op + "session" (nrepl-current-session) + "ns" nrepl-buffer-ns) + attributes) + handler))) + +(defun cider-send-load-file (file-contents file-path file-name) + "Perform the nREPL \"load-file\" op. +FILE-CONTENTS, FILE-PATH and FILE-NAME are details of the file to be +loaded." + (let ((buffer (current-buffer))) + (nrepl-send-request (list "op" "load-file" + "session" (nrepl-current-session) + "file" file-contents + "file-path" file-path + "file-name" file-name) + (cider-load-file-handler buffer)))) + +(defun cider-interrupt () + "Interrupt any pending evaluations." + (interactive) + (let ((pending-request-ids (cider-util--hash-keys nrepl-pending-requests))) + (dolist (request-id pending-request-ids) + (nrepl-send-interrupt request-id (cider-interrupt-handler (current-buffer)))))) + +(defun cider-current-repl-buffer () + "The current REPL buffer." + (when (nrepl-current-connection-buffer) + (buffer-local-value 'nrepl-repl-buffer + (get-buffer (nrepl-current-connection-buffer))))) + +(provide 'cider-client) + +;;; cider-client.el ends here diff --git a/elpa/cider-0.4.0/cider-client.elc b/elpa/cider-0.4.0/cider-client.elc new file mode 100644 index 0000000000000000000000000000000000000000..38812d4f109d309fe48b654cdad863d335fda202 GIT binary patch literal 6424 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 Iy1mE#FJKZV5C8xG literal 0 HcmV?d00001 diff --git a/elpa/cider-0.4.0/cider-eldoc.el b/elpa/cider-0.4.0/cider-eldoc.el new file mode 100644 index 000000000..8cfb0a261 --- /dev/null +++ b/elpa/cider-0.4.0/cider-eldoc.el @@ -0,0 +1,119 @@ +;;; cider-eldoc.el --- eldoc support for Clojure + +;; Copyright © 2012-2013 Tim King, Phil Hagelberg +;; Copyright © 2013 Bozhidar Batsov, Hugo Duncan, Steve Purcell +;; +;; Author: Tim King +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; eldoc support for Clojure. + +;;; Code: + +(require 'cider-client) +(require 'cider-interaction) ; for cider-symbol-at-point + +(require 'eldoc) +(require 'dash) + +(defvar cider-extra-eldoc-commands '("cider-complete" "yas/expand") + "Extra commands to be added to eldoc's safe commands list.") + +(defun cider-eldoc-format-thing (thing) + "Format the eldoc THING." + (propertize thing 'face 'font-lock-function-name-face)) + +(defun cider-highlight-args (arglist pos) + "Format the the function ARGLIST for eldoc. +POS is the index of the currently highlighted argument." + (let* ((rest-pos (cider--find-rest-args-position arglist)) + (i 0)) + (mapconcat + (lambda (arg) + (let ((argstr (format "%s" arg))) + (if (eq arg '&) + argstr + (prog1 + (if (or (= (1+ i) pos) + (and rest-pos (> (+ 1 i) rest-pos) + (> pos rest-pos))) + (propertize argstr 'face + 'eldoc-highlight-function-argument) + argstr) + (setq i (1+ i)))))) arglist " "))) + +(defun cider--find-rest-args-position (arglist) + "Find the position of & in the ARGLIST vector." + (-elem-index '& (append arglist ()))) + +(defun cider-highlight-arglist (arglist pos) + "Format the ARGLIST for eldoc. +POS is the index of the argument to highlight." + (concat "[" (cider-highlight-args arglist pos) "]")) + +(defun cider-eldoc-format-arglist (arglist pos) + "Format all the ARGLIST for eldoc. +POS is the index of current argument." + (concat "(" + (mapconcat (lambda (args) (cider-highlight-arglist args pos)) + (read arglist) " ") ")")) + +(defun cider-eldoc-info-in-current-sexp () + "Return a list of the current sexp and the current argument index." + (save-excursion + (let ((argument-index (1- (eldoc-beginning-of-sexp)))) + ;; If we are at the beginning of function name, this will be -1. + (when (< argument-index 0) + (setq argument-index 0)) + ;; Don't do anything if current word is inside a string. + (if (= (or (char-after (1- (point))) 0) ?\") + nil + (list (cider-symbol-at-point) argument-index))))) + +(defun cider-eldoc () + "Backend function for eldoc to show argument list in the echo area." + (when (cider-connected-p) + (let* ((info (cider-eldoc-info-in-current-sexp)) + (thing (car info)) + (pos (cadr info)) + (form (format "(try + (:arglists + (clojure.core/meta + (clojure.core/resolve + (clojure.core/read-string \"%s\")))) + (catch Throwable t nil))" thing)) + (value (when thing + (cider-get-value (cider-tooling-eval-sync form nrepl-buffer-ns))))) + (unless (string= value "nil") + (format "%s: %s" + (cider-eldoc-format-thing thing) + (cider-eldoc-format-arglist value pos)))))) + +(defun cider-turn-on-eldoc-mode () + "Turn on eldoc mode in the current buffer." + (setq-local eldoc-documentation-function 'cider-eldoc) + (apply 'eldoc-add-command cider-extra-eldoc-commands) + (turn-on-eldoc-mode)) + +(provide 'cider-eldoc) +;;; cider-eldoc ends here diff --git a/elpa/cider-0.4.0/cider-eldoc.elc b/elpa/cider-0.4.0/cider-eldoc.elc new file mode 100644 index 0000000000000000000000000000000000000000..184d3fd3bb34bbc553dab8b2f68c9b2102823907 GIT binary patch literal 3460 zcmbtW`*Yhw5YCT@JB1Fz474z1Bh$uakYYV-=P?W^r7dAPJem}Kh&^zTPPV9gGCDbp z``7dBNwS@1nW;RIPrALm-S6Ao+x=%RpMJKsw$|9+->0Y9WSXQhqSHA|L@`c;{wtDi zMK~^GexUME*PbcmJ3Mk`+8O0Z)D*LYboD@r-_+DROtI)7|Ut?gbt4I&NU} z$2o*z>_FS&Y$CU>?6K|0i3qh5ZOe2jw!3`l1cJT6cEr(!%QBJ6J6Rd(^6A3S7MTc1l7986E)J`Vm8+W zi6{aZi+$W($J@Q4Bg&vdWd((qDg=aQMQrcji?W{_Jv}_6a4d2W0z&<**wW%Y8x92VHEyhhB|Fqjfqjq#b6FBx~SzI=J1po zZ*TR*UwsMi(&<}tlFNT*NiL}*IfSbU5E{l41+ah^b7~l;Na*p9ymq5`(A}kH=S406 z_hbSnH5D1-SaOB2S+S)_ix}E#p)}Ej^Hrl2$@om<)kcyP*=7Npsnl(?tjZ>&Ln;et zku?{3Tb@s`oz$BXyhz?jibaSAV$Dvo@QoeMltIcy5KEgUhZIyc z?)d%okd1UZomDH@(s~^|dG+Gu;n6Wv=B4>gHl#E=i+|>VrkO5X_SZM>!{Oio9$nl$hM?d4rt-g*&!sMG zETW_$&yHc6Z9cPZo=Z%~bWpseNX8JHlpB^CRm!dVW`pmb-~V`R1Am^sHc-cRUSk++ ztqo$H+2&7!_>XdYXE7T1Zf64z7q`b8c^&9b$Dgz@=D3C}j0h?TEM;kWSIFpGqe6T1wY$0Vjx3CmQH4yjwkr5o&crQ!XZ)wry!{2!rM zqr%z00PQ-z7LyF5v2W?nG6+kDHsA|<`u&na%%XK-RdIJgAtr{ajP!a{#`XQ$F+PP> zDR_@_RgT@7RTs+0ZEhh-ORm_h^-VmxO+0#+J+xZZm87ZC(_3d$77S|>(`7ZgfCNK3 zB!7r_7ZJxPS#2P*pnPX1C@Jst>6I*IxgtS^kBh~HGzu;88OfksMx(4p*YR9plBhUC z=-Jge+bCA=?EkDa}2#d;h2ASjfeOCKH|jheQMtD#ee-h-n$R^J)rd; zR|=BJ$11|heNW{mQ400k&f;>@4*5Y9F?v2Z%~D%%{leJ>l&U=N++ME&Wruzc;Tz7B zI`NkUnPXg!v$uP&TZZEdGg91$3aVfU0GKECsmDI`F$4?;D2Moe@Z_NV1s6B2 zZD9OME{xqx2r_7{KZx%REI!EHhxhOv3_QPM@aeJ$uR?isdmD%`xBt<-I|Hj}LjzYt z<^*K&VRvq#hYKO8TuxK_bQZ_x@szHhLfKX*Q8Kcp)t6g%tqW?a$mat^H(#y2DoOOM zV$=%L?4McA-E5BbR2JfP`AZ8>>9h1qzGuyqMIy4xzLN$x8wOSz*R48QIN8E6dhI-W zD^Af)7hGQ3?YcsZWMQ9)bXGT4MV6%;ni3yvJy#)FkVk?((tE_G(T&Z?H4}BYF&hl2 zUx#uK)Mt@T$DG}Z=54}lVil})K9{^-7qMI!Z1m10?`G{Xd^vwRbvx-J5ODyZrkM(5 znokqo9CYP!wDcxdP5ZxSm1=*l>;5L +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Provides an Emacs Lisp client to connect to Clojure nREPL servers. + +;;; Code: + +(require 'cider-client) +(require 'cider-util) + +(require 'clojure-mode) +(require 'dash) +(require 'thingatpt) +(require 'etags) +(require 'arc-mode) +(require 'ansi-color) +(require 'cl-lib) +(require 'compile) +(require 'tramp) + +(defconst cider-error-buffer "*cider-error*") +(defconst cider-doc-buffer "*cider-doc*") +(defconst cider-src-buffer "*cider-src*") +(defconst cider-result-buffer "*cider-result*") + +(defcustom cider-use-local-resources t + "Use local resources under HOME if possible." + :type 'boolean + :group 'cider) + +(defcustom cider-popup-stacktraces t + "Non-nil means pop-up error stacktraces for evaluation errors. +Nil means show only an error message in the minibuffer. See also +`cider-repl-popup-stacktraces', which overrides this setting +for REPL buffers." + :type 'boolean + :group 'cider) + +(defcustom cider-popup-on-error t + "When `cider-popup-on-error' is set to t, stacktraces will be displayed. +When set to nil, stactraces will not be displayed, but will be available +in the `cider-error-buffer', which defaults to *cider-error*." + :type 'boolean + :group 'cider) + +(defcustom cider-auto-select-error-buffer nil + "Controls whether to auto-select the error popup buffer." + :type 'boolean + :group 'cider) + +(defface cider-error-highlight-face + '((((supports :underline (:style wave))) + (:underline (:style wave :color "red") :inherit unspecified)) + (t (:inherit font-lock-warning-face :underline t))) + "Face used to highlight compilation errors in Clojure buffers." + :group 'cider) + +(defface cider-warning-highlight-face + '((((supports :underline (:style wave))) + (:underline (:style wave :color "yellow") :inherit unspecified)) + (t (:inherit font-lock-warning-face :underline (:color "yellow")))) + "Face used to highlight compilation warnings in Clojure buffers." + :group 'cider) + +;;; Connection info +(defun cider--clojure-version () + "Retrieve the underlying connection's Clojure version." + (let ((version-string (cider-eval-and-get-value "(clojure-version)"))) + (substring version-string 1 (1- (length version-string))))) + +(defun cider--backend-version () + "Retrieve the underlying connection's nREPL version." + (let ((version-string (cider-eval-and-get-value "(:version-string clojure.tools.nrepl/version)"))) + (substring version-string 1 (1- (length version-string))))) + +(defun cider--connection-info (nrepl-connection-buffer) + "Return info about NREPL-CONNECTION-BUFFER. + +Info contains project name, current REPL namespace, host:port endpoint and Clojure version." + (with-current-buffer (get-buffer nrepl-connection-buffer) + (format "Active nREPL connection: %s:%s, %s:%s (Clojure %s, nREPL %s)" + (or (nrepl--project-name nrepl-project-dir) "") + nrepl-buffer-ns + (car nrepl-endpoint) + (cadr nrepl-endpoint) + (cider--clojure-version) + (cider--backend-version)))) + +(defun cider-display-current-connection-info () + "Display information about the current connection." + (interactive) + (message (cider--connection-info (nrepl-current-connection-buffer)))) + +(defun cider-rotate-connection () + "Rotate and display the current nREPL connection." + (interactive) + (setq nrepl-connection-list + (append (cdr nrepl-connection-list) + (list (car nrepl-connection-list)))) + (message (cider--connection-info (car nrepl-connection-list)))) + +;;; Switching between REPL & source buffers +(make-variable-buffer-local + (defvar cider-last-clojure-buffer nil + "A buffer-local variable holding the last Clojure source buffer. +`cider-switch-to-last-clojure-buffer' uses this variable to jump +back to last Clojure source buffer.")) + +(defvar cider-current-clojure-buffer nil + "This variable holds current buffer temporarily when connecting to a REPL. +It is set to current buffer when `nrepl' or `cider-jack-in' is called. +After the REPL buffer is created, the value of this variable is used +to call `cider-remember-clojure-buffer'.") + +(defun cider-remember-clojure-buffer (buffer) + "Try to remember the BUFFER from which the user jumps. +The BUFFER needs to be a Clojure buffer and current major mode needs +to be `cider-repl-mode'. The user can use `cider-switch-to-last-clojure-buffer' +to jump back to the last Clojure source buffer." + (when (and buffer + (with-current-buffer buffer + (derived-mode-p 'clojure-mode)) + (derived-mode-p 'cider-repl-mode)) + (setq cider-last-clojure-buffer buffer))) + +(defun cider-switch-to-repl-buffer (&optional arg) + "Select the REPL buffer, when possible in an existing window. + +Hint: You can use `display-buffer-reuse-frames' and +`special-display-buffer-names' to customize the frame in which +the buffer should appear. + +With a prefix ARG sets the name of the REPL buffer to the one +of the current source file." + (interactive "P") + (if (not (cider-connected-p)) + (message "No active nREPL connection.") + (let ((buffer (current-buffer))) + (when arg + (cider-repl-set-ns (cider-current-ns))) + (pop-to-buffer (cider-find-or-create-repl-buffer)) + (cider-remember-clojure-buffer buffer) + (goto-char (point-max))))) + +(defun cider-switch-to-relevant-repl-buffer (arg) + "Select the REPL buffer, when possible in an existing window. +The buffer chosen is based on the file open in the current buffer. + +Hint: You can use `display-buffer-reuse-frames' and +`special-display-buffer-names' to customize the frame in which +the buffer should appear. + +With a prefix ARG sets the name of the REPL buffer to the one +of the current source file. + +With a second prefix ARG the chosen REPL buffer is based on a +supplied project directory." + (interactive "P") + (if (not (cider-connected-p)) + (message "No active nREPL connection.") + (let ((project-directory + (or (when arg + (ido-read-directory-name "Project: ")) + (nrepl-project-directory-for (nrepl-current-dir))))) + (if project-directory + (let ((buf (car (-filter + (lambda (conn) + (let ((conn-proj-dir (with-current-buffer (get-buffer conn) + nrepl-project-dir))) + (when conn-proj-dir + (equal (file-truename project-directory) + (file-truename conn-proj-dir))))) + nrepl-connection-list)))) + (if buf + (setq nrepl-connection-list + (cons buf (delq buf nrepl-connection-list))) + (message "No relevant nREPL connection found. Switching to default connection."))) + (message "No project directory found. Switching to default nREPL connection."))) + (cider-switch-to-repl-buffer '()))) + +(defun cider-switch-to-last-clojure-buffer () + "Switch to the last Clojure buffer. +The default keybinding for this command is +the same as `cider-switch-to-repl-buffer', +so that it is very convenient to jump between a +Clojure buffer and the REPL buffer." + (interactive) + (if (and (derived-mode-p 'cider-repl-mode) + (buffer-live-p cider-last-clojure-buffer)) + (pop-to-buffer cider-last-clojure-buffer) + (message "Don't know the original Clojure buffer"))) + +(defun cider-find-and-clear-repl-buffer () + "Find the current REPL buffer and clear it. +Returns to the buffer in which the command was invoked." + (interactive) + (let ((origin-buffer (current-buffer))) + (switch-to-buffer (cider-current-repl-buffer)) + (cider-repl-clear-buffer) + (switch-to-buffer origin-buffer))) + +;;; Evaluating +(defun cider-read-and-eval () + "Read a sexp from the minibuffer and output its result to the echo area." + (interactive) + (cider-interactive-eval (read-from-minibuffer "CIDER Eval: "))) + +(defun cider-eval-region (start end) + "Evaluate the region. +The two arguments START and END are character positions; +they can be in either order." + (interactive "r") + (cider-interactive-eval (buffer-substring-no-properties start end))) + +(defun cider-eval-buffer () + "Evaluate the current buffer." + (interactive) + (cider-eval-region (point-min) (point-max))) + +(defun cider-defun-at-point () + "Return the text of the top-level sexp at point." + (apply #'buffer-substring-no-properties + (cider--region-for-defun-at-point))) + +(defun cider--region-for-defun-at-point () + "Return the start and end position of defun at point." + (save-excursion + (save-match-data + (end-of-defun) + (let ((end (point))) + (beginning-of-defun) + (list (point) end))))) + +(defun cider-eval-defun-at-point (&optional prefix) + "Evaluate the current toplevel form, and print result in the minibuffer. +With a PREFIX argument, print the result in the current buffer." + (interactive "P") + (let ((form (cider-defun-at-point))) + (if prefix + (cider-interactive-eval-print form) + (cider-interactive-eval form)))) + +(define-obsolete-function-alias + 'cider-eval-expression-at-point + 'cider-eval-defun-at-point) + +(defun cider-eval-ns-form () + "Evaluate the current buffer's namespace form." + (interactive) + (when (clojure-find-ns) + (save-excursion + (goto-char (match-beginning 0)) + (cider-eval-defun-at-point)))) + +(defun cider-bounds-of-sexp-at-point () + "Return the bounds sexp at point as a pair (or nil)." + (or (and (equal (char-after) ?\() + (member (char-before) '(?\' ?\, ?\@)) + ;; hide stuff before ( to avoid quirks with '( etc. + (save-restriction + (narrow-to-region (point) (point-max)) + (bounds-of-thing-at-point 'sexp))) + (bounds-of-thing-at-point 'sexp))) + +(defun cider-symbol-at-point () + "Return the name of the symbol at point, otherwise nil." + (let ((str (substring-no-properties (or (thing-at-point 'symbol) "")))) + (and str + (not (equal str (concat (cider-find-ns) "> "))) + (not (equal str "")) + (substring-no-properties str)))) + +(defun cider-sexp-at-point () + "Return the sexp at point as a string, otherwise nil." + (let ((bounds (cider-bounds-of-sexp-at-point))) + (if bounds + (buffer-substring-no-properties (car bounds) + (cdr bounds))))) + +(defun cider-sexp-at-point-with-bounds () + "Return a list containing the sexp at point and its bounds." + (let ((bounds (cider-bounds-of-sexp-at-point))) + (if bounds + (let ((start (car bounds)) + (end (cdr bounds))) + (list (buffer-substring-no-properties start end) + (cons (set-marker (make-marker) start) + (set-marker (make-marker) end))))))) + +(defun cider-last-sexp () + "Return the last sexp." + (buffer-substring-no-properties + (save-excursion (backward-sexp) (point)) + (point))) + +;;; +(defun cider-tramp-prefix () + "Top element on `find-tag-marker-ring' used to determine Clojure host." + (let ((jump-origin (buffer-file-name + (marker-buffer + (ring-ref find-tag-marker-ring 0))))) + (when (tramp-tramp-file-p jump-origin) + (let ((vec (tramp-dissect-file-name jump-origin))) + (tramp-make-tramp-file-name (tramp-file-name-method vec) + (tramp-file-name-user vec) + (tramp-file-name-host vec) + nil))))) + +(defun cider-home-prefix-adjustment (resource) + "System-dependent HOME location will be adjusted in RESOURCE. +Removes any leading slash if on Windows." + (save-match-data + (cond ((string-match "^\\/\\(Users\\|home\\)\\/\\w+\\(\\/.+\\)" resource) + (concat (getenv "HOME") (match-string 2 resource))) + ((and (eq system-type 'windows-nt) + (string-match "^/" resource) + (not (tramp-tramp-file-p resource))) + (substring resource 1)) + (t + resource)))) + +(defun cider-emacs-or-clojure-side-adjustment (resource) + "Fix the RESOURCE path depending on `cider-use-local-resources`." + (let ((resource (cider-home-prefix-adjustment resource)) + (clojure-side-res (concat (cider-tramp-prefix) resource)) + (emacs-side-res resource)) + (cond ((equal resource "") resource) + ((and cider-use-local-resources + (file-exists-p emacs-side-res)) + emacs-side-res) + ((file-exists-p clojure-side-res) + clojure-side-res) + (t + resource)))) + +(defun cider-find-file (filename) + "Switch to a buffer visiting FILENAME. +Adjusts for HOME location using `cider-home-prefix-adjustment'. +Uses `find-file'." + (find-file (cider-emacs-or-clojure-side-adjustment filename))) + +(defun cider-find-resource (resource) + "Find and display RESOURCE." + (cond ((string-match "^file:\\(.+\\)" resource) + (cider-find-file (match-string 1 resource))) + ((string-match "^\\(jar\\|zip\\):file:\\(.+\\)!/\\(.+\\)" resource) + (let* ((jar (match-string 2 resource)) + (path (match-string 3 resource)) + (buffer-already-open (get-buffer (file-name-nondirectory jar)))) + (cider-find-file jar) + (goto-char (point-min)) + (search-forward path) + (let ((opened-buffer (current-buffer))) + (archive-extract) + (unless buffer-already-open + (kill-buffer opened-buffer))))) + (t (error "Unknown resource path %s" resource)))) + +(defun cider-jump-to-def-for (location) + "Jump to LOCATION's definition in the source code." + ;; ugh; elisp destructuring doesn't work for vectors + (let ((resource (aref location 0)) + (path (aref location 1)) + (line (aref location 2))) + (if (and path (file-exists-p path)) + (find-file path) + (cider-find-resource resource)) + (goto-char (point-min)) + (forward-line (1- line)))) + +(defun cider-jump-to-def-handler (buffer) + "Create a handler for jump-to-def in BUFFER." + ;; TODO: got to be a simpler way to do this + (nrepl-make-response-handler buffer + (lambda (buffer value) + (with-current-buffer buffer + (ring-insert find-tag-marker-ring (point-marker))) + (cider-jump-to-def-for + (car (read-from-string value)))) + (lambda (buffer out) (message out)) + (lambda (buffer err) (message err)) + nil)) + +(defun cider-jump-to-def (var) + "Jump to the definition of the VAR at point." + (let ((form (format "(let [ns-symbol '%s + ns-var '%s + ns-file (clojure.core/comp :file + clojure.core/meta + clojure.core/second + clojure.core/first + clojure.core/ns-publics) + resource-str (clojure.core/comp clojure.core/str + clojure.java.io/resource + ns-file) + file-str (clojure.core/comp clojure.core/str + clojure.java.io/file + ns-file)] + (cond ((clojure.core/ns-aliases ns-symbol) ns-var) + (let [resolved-ns ((clojure.core/ns-aliases ns-symbol) ns-var)] + [(resource-str resolved-ns) + (file-str resolved-ns) + 1]) + + (find-ns ns-var) + [(resource-str ns-var) + (file-str ns-var) + 1] + + (clojure.core/ns-resolve ns-symbol ns-var) + ((clojure.core/juxt + (clojure.core/comp clojure.core/str + clojure.java.io/resource + :file) + (clojure.core/comp clojure.core/str + clojure.java.io/file + :file) + :line) + (clojure.core/meta (clojure.core/ns-resolve ns-symbol ns-var)))))" + (cider-current-ns) var))) + (cider-tooling-eval form + (cider-jump-to-def-handler (current-buffer)) + nrepl-buffer-ns))) + +(defun cider-jump (query) + "Jump to the definition of QUERY." + (interactive "P") + (cider-read-symbol-name "Symbol: " 'cider-jump-to-def query)) + +(defalias 'cider-jump-back 'pop-tag-mark) + +(defun cider-completion-complete-core-fn (str) + "Return a list of completions for STR using complete.core/completions." + (let ((strlst + (cider-eval-and-get-value + (format "(require 'complete.core) (complete.core/completions \"%s\" *ns*)" str) + nrepl-buffer-ns + (nrepl-current-tooling-session)))) + (when strlst + (car (read-from-string strlst))))) + +(defun cider-completion-complete-op-fn (str) + "Return a list of completions for STR using the nREPL \"complete\" op." + (let ((strlst (plist-get + (nrepl-send-request-sync + (list "op" "complete" + "session" (nrepl-current-tooling-session) + "ns" nrepl-buffer-ns + "symbol" str)) + :value))) + (when strlst + (car strlst)))) + +(defun cider-dispatch-complete-symbol (str) + "Return a list of completions for STR. +Dispatch to the nREPL \"complete\" op if supported, +otherwise dispatch to internal completion function." + (if (nrepl-op-supported-p "complete") + (cider-completion-complete-op-fn str) + (cider-completion-complete-core-fn str))) + +(defun cider-complete-at-point () + "Complete the symbol at point." + (let ((sap (symbol-at-point))) + (when (and sap (not (in-string-p))) + (let ((bounds (bounds-of-thing-at-point 'symbol))) + (list (car bounds) (cdr bounds) + (completion-table-dynamic #'cider-dispatch-complete-symbol)))))) + + +;;; JavaDoc Browsing +;;; Assumes local-paths are accessible in the VM. +(defvar cider-javadoc-local-paths nil + "List of paths to directories with Javadoc.") + +(defun cider-javadoc-op (symbol-name) + "Invoke the nREPL \"javadoc\" op on SYMBOL-NAME." + (cider-send-op + "javadoc" + `("symbol" ,symbol-name "ns" ,nrepl-buffer-ns + "local-paths" ,(mapconcat #'identity cider-javadoc-local-paths " ")) + (nrepl-make-response-handler + (current-buffer) + (lambda (buffer url) + (if url + (browse-url url) + (error "No javadoc url for %s" symbol-name))) + nil nil nil))) + +(defun cider-javadoc-handler (symbol-name) + "Invoke the nREPL \"javadoc\" op on SYMBOL-NAME if available." + (when symbol-name + (let ((bounds (bounds-of-thing-at-point 'symbol))) + (if (nrepl-op-supported-p "javadoc") + (cider-javadoc-op symbol-name) + (message "No Javadoc middleware available"))))) + +(defun cider-javadoc (query) + "Browse Javadoc on the Java class QUERY at point." + (interactive "P") + (cider-read-symbol-name "Javadoc for: " 'cider-javadoc-handler query)) + +(defun cider-stdin-handler (buffer) + "Make a stdin response handler for BUFFER." + (nrepl-make-response-handler buffer + (lambda (buffer value) + (cider-repl-emit-result buffer value t)) + (lambda (buffer out) + (cider-repl-emit-output buffer out t)) + (lambda (buffer err) + (cider-repl-emit-output buffer err t)) + nil)) + +(defun cider-insert-eval-handler (buffer) + "Make a nREPL evaluation handler for the BUFFER. +The handler simply inserts the result value in BUFFER." + (nrepl-make-response-handler buffer + (lambda (buffer value) + (with-current-buffer buffer + (insert value))) + (lambda (buffer out) + (cider-repl-emit-interactive-output out)) + (lambda (buffer err) + (message "%s" err) + (cider-highlight-compilation-errors + buffer err)) + '())) + +(defun cider-interactive-eval-handler (buffer) + "Make an interactive eval handler for BUFFER." + (nrepl-make-response-handler buffer + (lambda (buffer value) + (message "%s" value)) + (lambda (buffer value) + (cider-repl-emit-interactive-output value)) + (lambda (buffer err) + (message "%s" err) + (cider-highlight-compilation-errors + buffer err)) + '())) + +(defun cider-load-file-handler (buffer) + "Make a load file handler for BUFFER." + (let (current-ns (cider-current-ns)) + (nrepl-make-response-handler buffer + (lambda (buffer value) + (message "%s" value) + (with-current-buffer buffer + (setq nrepl-buffer-ns (clojure-find-ns)) + (run-hooks 'cider-file-loaded-hook))) + (lambda (buffer value) + (cider-repl-emit-interactive-output value)) + (lambda (buffer err) + (message "%s" err) + (cider-highlight-compilation-errors + buffer err)) + '() + (lambda (buffer ex root-ex session) + (let ((cider-popup-on-error nil)) + (funcall nrepl-err-handler + buffer ex root-ex session)))))) + +(defun cider-interactive-eval-print-handler (buffer) + "Make a handler for evaluating and printing result in BUFFER." + (nrepl-make-response-handler buffer + (lambda (buffer value) + (with-current-buffer buffer + (insert (format "%s" value)))) + '() + (lambda (buffer err) + (message "%s" err)) + '())) + +(defun cider-popup-eval-print-handler (buffer) + "Make a handler for evaluating and printing result in popup BUFFER." + (nrepl-make-response-handler buffer + (lambda (buffer str) + (cider-emit-into-popup-buffer buffer str)) + '() + (lambda (buffer str) + (cider-emit-into-popup-buffer buffer str)) + '())) + +(defun cider-popup-eval-out-handler (buffer) + "Make a handler for evaluating and printing stdout/stderr in popup BUFFER." + (nrepl-make-response-handler buffer + '() + (lambda (buffer str) + (cider-emit-into-popup-buffer buffer str)) + (lambda (buffer str) + (cider-emit-into-popup-buffer buffer str)) + '())) + +(defun cider-visit-error-buffer () + "Visit the `cider-error-buffer' (usually *cider-error*) if it exists." + (interactive) + (let ((buffer (get-buffer cider-error-buffer))) + (when buffer + (cider-popup-buffer-display buffer)))) + +(defun cider-find-property (property &optional backward) + "Find the next text region which has the specified PROPERTY. +If BACKWARD is t, then search backward. +Returns the position at which PROPERTY was found, or nil if not found." + (let ((p (if backward + (previous-single-char-property-change (point) property) + (next-single-char-property-change (point) property)))) + (when (and (not (= p (point-min))) (not (= p (point-max)))) + p))) + +(defun cider-jump-to-compilation-error (&optional arg reset) + "Jump to the line causing the current compilation error. + +ARG and RESET are ignored, as there is only ever one compilation error. +They exist for compatibility with `next-error'." + (interactive) + (cl-labels ((goto-next-note-boundary + () + (let ((p (or (cider-find-property 'cider-note-p) + (cider-find-property 'cider-note-p t)))) + (when p + (goto-char p) + (message (get-char-property p 'cider-note)))))) + ;; if we're already on a compilation error, first jump to the end of + ;; it, so that we find the next error. + (when (get-char-property (point) 'cider-note-p) + (goto-next-note-boundary)) + (goto-next-note-boundary))) + +(defun cider-default-err-handler (buffer ex root-ex session) + "Make an error handler for BUFFER, EX, ROOT-EX and SESSION." + ;; TODO: use ex and root-ex as fallback values to display when pst/print-stack-trace-not-found + (let ((replp (with-current-buffer buffer (derived-mode-p 'cider-repl-mode)))) + (if (or (and cider-repl-popup-stacktraces replp) + (and cider-popup-stacktraces (not replp))) + (lexical-let ((cider-popup-on-error cider-popup-on-error)) + (with-current-buffer buffer + (cider-eval "(if-let [pst+ (clojure.core/resolve 'clj-stacktrace.repl/pst+)] + (pst+ *e) (clojure.stacktrace/print-stack-trace *e))" + (nrepl-make-response-handler + (cider-make-popup-buffer cider-error-buffer) + nil + (lambda (buffer value) + (cider-emit-into-color-buffer buffer value) + (when cider-popup-on-error + (cider-popup-buffer-display buffer cider-auto-select-error-buffer))) + nil nil) nil session)) + (with-current-buffer cider-error-buffer + (compilation-minor-mode +1)))))) + +(defvar cider-compilation-regexp + '("\\(?:.*\\(warning, \\)\\|.*?\\(, compiling\\):(\\)\\([^:]*\\):\\([[:digit:]]+\\)\\(?::\\([[:digit:]]+\\)\\)?\\(\\(?: - \\(.*\\)\\)\\|)\\)" 3 4 5 (1)) + "Specifications for matching errors and warnings in Clojure stacktraces. +See `compilation-error-regexp-alist' for help on their format.") + +(add-to-list 'compilation-error-regexp-alist-alist + (cons 'cider cider-compilation-regexp)) +(add-to-list 'compilation-error-regexp-alist 'cider) + +(defun cider-extract-error-info (regexp message) + "Extract error information with REGEXP against MESSAGE." + (let ((file (nth 1 regexp)) + (line (nth 2 regexp)) + (col (nth 3 regexp)) + (type (nth 4 regexp)) + (pat (car regexp))) + (when (string-match pat message) + ;; special processing for type (1.2) style + (setq type (if (consp type) + (or (and (car type) (match-end (car type)) 1) + (and (cdr type) (match-end (cdr type)) 0) + 2))) + (list + (when file + (let ((val (match-string-no-properties file message))) + (unless (string= val "NO_SOURCE_PATH") val))) + (when line (string-to-number (match-string-no-properties line message))) + (when col + (let ((val (match-string-no-properties col message))) + (when val (string-to-number val)))) + (aref [cider-warning-highlight-face + cider-warning-highlight-face + cider-error-highlight-face] + (or type 2)) + message)))) + +(defun cider-highlight-compilation-errors (buffer message) + "Highlight compilation error line in BUFFER, using MESSAGE." + (with-current-buffer buffer + (let ((info (cider-extract-error-info cider-compilation-regexp message))) + (when info + (let ((file (nth 0 info)) + (line (nth 1 info)) + (col (nth 2 info)) + (face (nth 3 info)) + (note (nth 4 info))) + (save-excursion + ;; when we don't have a filename the line number + ;; is relative to form start + (if file + (goto-char (point-min)) ; start of file + (beginning-of-defun)) + (forward-line (1- line)) + ;; if have column, highlight sexp at that point otherwise whole line. + (move-to-column (or col 0)) + (let ((begin (progn (if col (backward-up-list) (back-to-indentation)) (point))) + (end (progn (if col (forward-sexp) (move-end-of-line nil)) (point)))) + (let ((overlay (make-overlay begin end))) + (overlay-put overlay 'cider-note-p t) + (overlay-put overlay 'face face) + (overlay-put overlay 'cider-note note) + (overlay-put overlay 'help-echo note))))))))) + +(defun cider-need-input (buffer) + "Handle an need-input request from BUFFER." + (with-current-buffer buffer + (nrepl-send-stdin (concat (read-from-minibuffer "Stdin: ") "\n") + (cider-stdin-handler buffer)))) + + +;;;; Popup buffers +(define-minor-mode cider-popup-buffer-mode + "Mode for CIDER popup buffers" + nil + (" cider-tmp") + '(("q" . cider-popup-buffer-quit-function))) + +(make-variable-buffer-local + (defvar cider-popup-buffer-quit-function 'cider-popup-buffer-quit + "The function that is used to quit a temporary popup buffer.")) + +(defun cider-popup-buffer-quit-function (&optional kill-buffer-p) + "Wrapper to invoke the function `cider-popup-buffer-quit-function'. +KILL-BUFFER-P is passed along." + (interactive) + (funcall cider-popup-buffer-quit-function kill-buffer-p)) + +(defun cider-popup-buffer (name &optional select) + "Create new popup buffer called NAME. +If SELECT is non-nil, select the newly created window" + (with-current-buffer (cider-make-popup-buffer name) + (setq buffer-read-only t) + (cider-popup-buffer-display (current-buffer) select))) + +(defun cider-popup-buffer-display (popup-buffer &optional select) + "Display POPUP-BUFFER. +If SELECT is non-nil, select the newly created window" + (with-current-buffer popup-buffer + (let ((new-window (display-buffer (current-buffer)))) + (set-window-point new-window (point)) + (when select + (select-window new-window)) + (current-buffer)))) + +(defun cider-popup-buffer-quit (&optional kill-buffer-p) + "Quit the current (temp) window and bury its buffer using `quit-window'. +If prefix argument KILL-BUFFER-P is non-nil, kill the buffer instead of burying it." + (interactive) + (quit-window kill-buffer-p (selected-window))) + +(defun cider-make-popup-buffer (name) + "Create a temporary buffer called NAME." + (with-current-buffer (get-buffer-create name) + (kill-all-local-variables) + (setq buffer-read-only nil) + (erase-buffer) + (set-syntax-table clojure-mode-syntax-table) + (cider-popup-buffer-mode 1) + (current-buffer))) + +(defun cider-emit-into-popup-buffer (buffer value) + "Emit into BUFFER the provided VALUE." + (with-current-buffer buffer + (let ((inhibit-read-only t) + (buffer-undo-list t)) + (insert (format "%s" value)) + (indent-sexp) + (font-lock-fontify-buffer)))) + +(defun cider-emit-into-color-buffer (buffer value) + "Emit into color BUFFER the provided VALUE." + (with-current-buffer buffer + (let ((inhibit-read-only t) + (buffer-undo-list t)) + (goto-char (point-max)) + (insert (format "%s" value)) + (ansi-color-apply-on-region (point-min) (point-max))) + (goto-char (point-min)))) + +;;; Namespace handling +(defun cider-find-ns () + "Return the ns of the current buffer. + +For Clojure buffers the ns is extracted from the ns header. If +it's missing \"user\" is used as fallback." + (cond + ((derived-mode-p 'clojure-mode) + (or (save-restriction + (widen) + (clojure-find-ns)) + "user")) + ((derived-mode-p 'cider-repl-mode) + nrepl-buffer-ns))) + +(defun cider-current-ns () + "Return the ns in the current context. +If `nrepl-buffer-ns' has a value then return that, otherwise +search for and read a `ns' form." + (let ((ns nrepl-buffer-ns)) + (or (and (string= ns "user") + (cider-find-ns)) + ns))) + + +;;; Evaluation +(defun cider-popup-eval-print (form) + "Evaluate the given FORM and print value in current buffer." + (let ((buffer (current-buffer))) + (cider-eval form + (cider-popup-eval-print-handler buffer) + (cider-current-ns)))) + +(defun cider-interactive-eval-print (form) + "Evaluate the given FORM and print value in current buffer." + (let ((buffer (current-buffer))) + (cider-eval form + (cider-interactive-eval-print-handler buffer) + (cider-current-ns)))) + +(defun cider-interactive-eval (form) + "Evaluate the given FORM and print value in minibuffer." + (remove-overlays (point-min) (point-max) 'cider-note-p t) + (let ((buffer (current-buffer))) + (cider-eval form + (cider-interactive-eval-handler buffer) + (cider-current-ns)))) + +(defun cider-interactive-eval-to-repl (form) + "Evaluate the given FORM and print it's value in REPL buffer." + (let ((buffer (cider-current-repl-buffer))) + (cider-eval form + (cider-insert-eval-handler buffer) + (cider-current-ns)))) + +(defun cider-eval-last-sexp (&optional prefix) + "Evaluate the expression preceding point. +If invoked with a PREFIX argument, print the result in the current buffer." + (interactive "P") + (if prefix + (cider-interactive-eval-print (cider-last-sexp)) + (cider-interactive-eval (cider-last-sexp)))) + +(define-obsolete-function-alias + 'cider-eval-last-expression + 'cider-eval-last-sexp) + +(defun cider-eval-last-sexp-and-replace () + "Evaluate the expression preceding point and replace it with its result." + (interactive) + (let ((last-sexp (cider-last-sexp))) + (backward-kill-sexp) + (cider-interactive-eval-print last-sexp))) + +(defun cider-eval-last-sexp-to-repl (&optional prefix) + "Evaluate the expression preceding point and insert its result in the REPL. +If invoked with a PREFIX argument, switch to the REPL buffer." + (interactive "P") + (cider-interactive-eval-to-repl (cider-last-sexp)) + (when prefix + (cider-switch-to-repl-buffer))) + +(defun cider-eval-print-last-sexp () + "Evaluate the expression preceding point. +Print its value into the current buffer" + (interactive) + (cider-interactive-eval-print (cider-last-sexp))) + +(defun cider-pprint-eval-last-sexp () + "Evaluate the expression preceding point and pprint its value in a popup buffer." + (interactive) + (let ((form (cider-last-sexp)) + (result-buffer (cider-popup-buffer cider-result-buffer nil))) + (cider-tooling-eval (format "(clojure.pprint/pprint %s)" form) + (cider-popup-eval-out-handler result-buffer) + (cider-current-ns)))) + +(defun cider-insert-last-sexp-in-repl (&optional arg) + "Insert the expression preceding point in the REPL buffer. +If invoked with a prefix ARG eval the expression after inserting it." + (interactive "P") + (let ((form (cider-last-sexp)) + (start-pos (point))) + (with-current-buffer (cider-current-repl-buffer) + (insert form) + (indent-region start-pos (point)) + (when arg + (cider-repl-return)))) + (cider-switch-to-repl-buffer)) + +(defun cider-ping () + "Check that communication with the server works." + (interactive) + (message "%s" (cider-eval-and-get-value "\"PONG\""))) + +(defun clojure-enable-cider () + "Turn on CIDER mode (see command `cider-mode'). +Useful in hooks." + (cider-mode 1) + (setq next-error-function 'cider-jump-to-compilation-error)) + +(defun clojure-disable-cider () + "Turn off CIDER mode (see command `cider-mode'). +Useful in hooks." + (cider-mode -1)) + +(defun cider-connected-p () + "Return t if CIDER is currently connected, nil otherwise." + (condition-case nil + (nrepl-current-connection-buffer) + (error nil))) + +(defun cider-enable-on-existing-clojure-buffers () + "Enable interaction mode on existing Clojure buffers. +See command `cider-mode'." + (interactive) + (add-hook 'clojure-mode-hook 'clojure-enable-cider) + (dolist (buffer (cider-util--clojure-buffers)) + (with-current-buffer buffer + (clojure-enable-cider)))) + +(defun cider-disable-on-existing-clojure-buffers () + "Disable `cider-mode' on existing Clojure buffers. +See command `cider-mode'." + (interactive) + (dolist (buffer (cider-util--clojure-buffers)) + (with-current-buffer buffer + (setq nrepl-buffer-ns "user") + (clojure-disable-cider)))) + +(defun cider-possibly-disable-on-existing-clojure-buffers () + "If not connected, disable `cider-mode' on existing Clojure buffers." + (unless (cider-connected-p) + (cider-disable-on-existing-clojure-buffers))) + +;; this is horrible, but with async callbacks we can't rely on dynamic scope +(defvar cider-ido-ns nil) + +(defun cider-ido-form (ns) + "Construct a Clojure form for ido read using NS." + `(concat (if (find-ns (symbol ,ns)) + (map name (concat (keys (ns-interns (symbol ,ns))) + (keys (ns-refers (symbol ,ns)))))) + (if (not= "" ,ns) [".."]) + (->> (all-ns) + (map (fn [n] + (re-find (re-pattern (str "^" (if (not= ,ns "") + (str ,ns "\\.")) + "[^\\.]+")) + (str n)))) + (filter identity) + (map (fn [n] (str n "/"))) + (into (hash-set))))) + +(defun cider-ido-up-ns (ns) + "Perform up using NS." + (mapconcat 'identity (butlast (split-string ns "\\.")) ".")) + +(defun cider-ido-select (selected targets callback) + "Peform ido select using SELECTED, TARGETS and CALLBACK." + ;; TODO: immediate RET gives "" as selected for some reason + ;; this is an OK workaround though + (cond ((equal "" selected) + (cider-ido-select (car targets) targets callback)) + ((equal "/" (substring selected -1)) ; selected a namespace + (cider-ido-read-var (substring selected 0 -1) callback)) + ((equal ".." selected) + (cider-ido-read-var (cider-ido-up-ns cider-ido-ns) callback)) + ;; non ido variable selection techniques don't return qualified symbols, so this shouldn't either + (t (funcall callback selected)))) + +(defun cider-ido-read-var-handler (ido-callback buffer) + "Create an ido read var handler with IDO-CALLBACK for BUFFER." + (lexical-let ((ido-callback ido-callback)) + (nrepl-make-response-handler buffer + (lambda (buffer value) + ;; make sure to eval the callback in the buffer that the symbol was requested from so we get the right namespace + (with-current-buffer buffer + (let* ((targets (car (read-from-string value))) + (selected (ido-completing-read "Var: " targets nil t))) + (cider-ido-select selected targets ido-callback)))) + nil nil nil))) + +(defun cider-ido-read-var (ns ido-callback) + "Perform ido read var in NS using IDO-CALLBACK." + ;; Have to be stateful =( + (setq cider-ido-ns ns) + (cider-tooling-eval (prin1-to-string (cider-ido-form cider-ido-ns)) + (cider-ido-read-var-handler ido-callback (current-buffer)) + nrepl-buffer-ns)) + +(defun cider-read-symbol-name (prompt callback &optional query) + "Either read a symbol name using PROMPT or choose the one at point. +Use CALLBACK as the ido read var callback. +The user is prompted with PROMPT if a prefix argument is in effect, +if there is no symbol at point, or if QUERY is non-nil." + (let ((symbol-name (cider-symbol-at-point))) + (cond ((not (or current-prefix-arg query (not symbol-name))) + (funcall callback symbol-name)) + (ido-mode (cider-ido-read-var nrepl-buffer-ns callback)) + (t (funcall callback (read-from-minibuffer prompt symbol-name)))))) + +(defun cider-doc-handler (symbol) + "Create a handler to lookup documentation for SYMBOL." + (let ((form (format "(clojure.repl/doc %s)" symbol)) + (doc-buffer (cider-popup-buffer cider-doc-buffer t))) + (cider-tooling-eval form + (cider-popup-eval-out-handler doc-buffer) + nrepl-buffer-ns))) + +(defun cider-doc (query) + "Open a window with the docstring for the given QUERY. +Defaults to the symbol at point. With prefix arg or no symbol +under point, prompts for a var." + (interactive "P") + (cider-read-symbol-name "Symbol: " 'cider-doc-handler query)) + +(defun cider-src-handler (symbol) + "Create a handler to lookup source for SYMBOL." + (let ((form (format "(clojure.repl/source %s)" symbol)) + (src-buffer (cider-popup-buffer cider-src-buffer t))) + (with-current-buffer src-buffer + (clojure-mode) + (cider-popup-buffer-mode +1)) + (cider-tooling-eval form + (cider-popup-eval-out-handler src-buffer) + nrepl-buffer-ns))) + +(defun cider-src (query) + "Open a window with the source for the given QUERY. +Defaults to the symbol at point. With prefix arg or no symbol +under point, prompts for a var." + (interactive "P") + (cider-read-symbol-name "Symbol: " 'cider-src-handler query)) + +;; TODO: implement reloading ns +(defun cider-eval-load-file (form) + "Load FORM." + (let ((buffer (current-buffer))) + (cider-eval form (cider-interactive-eval-handler buffer)))) + +(defun cider-file-string (file) + "Read the contents of a FILE and return as a string." + (with-current-buffer (find-file-noselect file) + (buffer-string))) + +(defun cider-load-file-op (filename) + "Send \"load-file\" op for FILENAME." + (cider-send-load-file (cider-file-string filename) + filename + (file-name-nondirectory filename))) + +(defun cider-load-file (filename) + "Load the Clojure file FILENAME." + (interactive (list + (read-file-name "Load file: " nil nil + nil (if (buffer-file-name) + (file-name-nondirectory + (buffer-file-name)))))) + (remove-overlays (point-min) (point-max) 'cider-note-p t) + (cider-load-file-op filename) + (message "Loading %s..." filename)) + +(defun cider-load-current-buffer () + "Load current buffer's file." + (interactive) + (check-parens) + (unless buffer-file-name + (error "Buffer %s is not associated with a file" (buffer-name))) + (when (and (buffer-modified-p) + (y-or-n-p (format "Save file %s? " (buffer-file-name)))) + (save-buffer)) + (cider-load-file (buffer-file-name))) + +;;; interrupt evaluation +(defun cider-interrupt-handler (buffer) + "Create an interrupt response handler for BUFFER." + (nrepl-make-response-handler buffer nil nil nil nil)) + +;;; quiting +(defun cider--close-buffer (buffer) + "Close the BUFFER and kill its associated process (if any)." + (when (get-buffer-process buffer) + (delete-process (get-buffer-process buffer))) + (when (get-buffer buffer) + (kill-buffer buffer))) + +(defvar cider-ancilliary-buffers + (list cider-error-buffer + cider-doc-buffer + cider-src-buffer + nrepl-event-buffer-name)) + +(defun cider-close-ancilliary-buffers () + "Close buffers that are shared across connections." + (interactive) + (dolist (buf-name cider-ancilliary-buffers) + (cider--close-buffer buf-name))) + +(defun cider-quit () + "Quit CIDER. + +Quitting closes all active nREPL connections and kills all CIDER buffers." + (interactive) + (when (y-or-n-p "Are you sure you want to quit CIDER? ") + (dolist (connection nrepl-connection-list) + (when connection + (nrepl-close connection))) + (message "All active nREPL connections were closed") + (cider-close-ancilliary-buffers))) + +(defun cider-restart (&optional prompt-project) + "Quit CIDER and restart it. +If PROMPT-PROJECT is t, then prompt for the project in which to +restart the server." + (interactive) + (cider-quit) + (cider-jack-in current-prefix-arg)) + +(add-hook 'nrepl-connected-hook 'cider-enable-on-existing-clojure-buffers) +(add-hook 'nrepl-disconnected-hook + 'cider-possibly-disable-on-existing-clojure-buffers) + +(provide 'cider-interaction) +;;; cider-interaction.el ends here diff --git a/elpa/cider-0.4.0/cider-interaction.elc b/elpa/cider-0.4.0/cider-interaction.elc new file mode 100644 index 0000000000000000000000000000000000000000..7302f0fb76935ba7ea22ab95c946aa62bcea75eb GIT binary patch literal 41528 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

JRy8k%9IyyWDzU6IO?!PD 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 Kzd(camH!PUKD?y> literal 0 HcmV?d00001 diff --git a/elpa/cider-0.4.0/cider-macroexpansion.el b/elpa/cider-0.4.0/cider-macroexpansion.el new file mode 100644 index 000000000..7620090da --- /dev/null +++ b/elpa/cider-0.4.0/cider-macroexpansion.el @@ -0,0 +1,165 @@ +;;; cider-macroexpansion.el --- Macro expansion support + +;; Copyright © 2012-2013 Tim King, Phil Hagelberg +;; Copyright © 2013 Bozhidar Batsov, Hugo Duncan, Steve Purcell +;; +;; Author: Tim King +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Macro expansion support. + +;;; Code: + +(require 'cider-mode) + +(defconst cider-macroexpansion-buffer "*cider-macroexpansion*") + +(push cider-macroexpansion-buffer cider-ancilliary-buffers) + +(defun cider-macroexpand-undo (&optional arg) + "Undo the last macroexpansion, using `undo-only'. +ARG is passed along to `undo-only'." + (interactive) + (let ((inhibit-read-only t)) + (undo-only arg))) + +(defvar cider-last-macroexpand-expression nil + "Specify the last macroexpansion preformed. +This variable specifies both what was expanded and the expander.") + +(defun cider-macroexpand-form (expander expr) + "Macroexpand, using EXPANDER, the given EXPR." + (format + "(clojure.pprint/write (%s '%s) :suppress-namespaces false :dispatch clojure.pprint/code-dispatch)" + expander expr)) + +(defun cider-macroexpand-expr (expander expr &optional buffer) + "Macroexpand, use EXPANDER, the given EXPR from BUFFER." + (let* ((form (cider-macroexpand-form expander expr)) + (expansion (plist-get (cider-eval-sync form nrepl-buffer-ns) :stdout))) + (setq cider-last-macroexpand-expression form) + (cider-initialize-macroexpansion-buffer expansion nrepl-buffer-ns))) + +(defun cider-macroexpand-expr-inplace (expander) + "Substitute the current form at point with its macroexpansion using EXPANDER." + (interactive) + (let ((form-with-bounds (cider-sexp-at-point-with-bounds))) + (if form-with-bounds + (destructuring-bind (expr bounds) form-with-bounds + (let* ((form (cider-macroexpand-form expander expr)) + (expansion (plist-get (cider-eval-sync form nrepl-buffer-ns) :stdout))) + (cider-redraw-macroexpansion-buffer + expansion (current-buffer) (car bounds) (cdr bounds) (point))))))) + +(defun cider-macroexpand-again () + "Repeat the last macroexpansion." + (interactive) + (let ((expansion + (plist-get (cider-eval-sync cider-last-macroexpand-expression nrepl-buffer-ns) :stdout))) + (cider-initialize-macroexpansion-buffer expansion nrepl-buffer-ns))) + +;;;###autoload +(defun cider-macroexpand-1 (&optional prefix) + "Invoke 'macroexpand-1' on the expression at point. +If invoked with a PREFIX argument, use 'macroexpand' instead of +'macroexpand-1'." + (interactive "P") + (let ((expander (if prefix 'macroexpand 'macroexpand-1))) + (cider-macroexpand-expr expander (cider-sexp-at-point)))) + +(defun cider-macroexpand-1-inplace (&optional prefix) + "Perform inplace 'macroexpand-1' on the expression at point. +If invoked with a PREFIX argument, use 'macroexpand' instead of +'macroexpand-1'." + (interactive "P") + (let ((expander (if prefix 'macroexpand 'macroexpand-1))) + (cider-macroexpand-expr-inplace expander))) + +;;;###autoload +(defun cider-macroexpand-all () + "Invoke 'clojure.walk/macroexpand-all' on the expression at point." + (interactive) + (cider-macroexpand-expr + 'clojure.walk/macroexpand-all (cider-sexp-at-point))) + +(defun cider-macroexpand-all-inplace () + "Perform inplace 'clojure.walk/macroexpand-all' on the expression at point." + (interactive) + (cider-macroexpand-expr-inplace 'clojure.walk/macroexpand-all)) + +(defun cider-initialize-macroexpansion-buffer (expansion ns) + "Create a new Macroexpansion buffer with EXPANSION and namespace NS." + (pop-to-buffer (cider-create-macroexpansion-buffer)) + (setq nrepl-buffer-ns ns) + (setq buffer-undo-list nil) + (let ((inhibit-read-only t) + (buffer-undo-list t)) + (erase-buffer) + (insert (format "%s" expansion)) + (goto-char (point-min)) + (font-lock-fontify-buffer))) + +(defun cider-redraw-macroexpansion-buffer (expansion buffer start end current-point) + "Redraw the macroexpansion with new EXPANSION. +Text in BUFFER from START to END is replaced with new expansion, +and point is placed at CURRENT-POINT." + (with-current-buffer buffer + (let ((buffer-read-only nil)) + (goto-char start) + (delete-region start end) + (insert (format "%s" expansion)) + (goto-char start) + (indent-sexp) + (goto-char current-point)))) + +(defun cider-create-macroexpansion-buffer () + "Create a new macroexpansion buffer." + (with-current-buffer (cider-popup-buffer cider-macroexpansion-buffer t) + (clojure-mode) + (clojure-disable-cider) + (cider-macroexpansion-minor-mode 1) + (current-buffer))) + +(defvar cider-macroexpansion-minor-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "g") 'cider-macroexpand-again) + (define-key map (kbd "q") 'cider-popup-buffer-quit-function) + (cl-labels ((redefine-key (from to) + (dolist (mapping (where-is-internal from cider-mode-map)) + (define-key map mapping to)))) + (redefine-key 'cider-macroexpand-1 'cider-macroexpand-1-inplace) + (redefine-key 'cider-macroexpand-all 'cider-macroexpand-all-inplace) + (redefine-key 'advertised-undo 'cider-macroexpand-undo) + (redefine-key 'undo 'cider-macroexpand-undo)) + map)) + +(define-minor-mode cider-macroexpansion-minor-mode + "Minor mode for nrepl macroexpansion. + +\\{cider-macroexpansion-minor-mode-map}" + nil + " Macroexpand" + cider-macroexpansion-minor-mode-map) + +(provide 'cider-macroexpansion) +;;; cider-macroexpansion.el ends here diff --git a/elpa/cider-0.4.0/cider-macroexpansion.elc b/elpa/cider-0.4.0/cider-macroexpansion.elc new file mode 100644 index 0000000000000000000000000000000000000000..42392282d43c8d0c4f210c9b345fd6eba636a920 GIT binary patch literal 6599 zcmd5>`%fF$73N1UO4M{!HOX#wZ%ipT;+lE*0g2MW5)x50ECNzRicvG3xwfZ_?@ZNSU%q4q;W+XG;j#V=8$0R9 zcapz(;@WXXsfhPvJZ$q!O1nu<%`9mSW8Z7a%#p5Wy5X3GlAVt-_UBA8bC((I7wz2_ zErVHx*;4xtVoVy~1hzd2$71`|8QV=UcHE@tZHpjswq4&7F*lm6rjbA6YaEI%ks}j7 zluZ$+eSOIeX&t)~F^w~;)wG+I`gZN7BjyAF3!~H@`#(D=CM3<8`glI_6Mdm95ef5d zq%-zi=7nyO#=aaTTlg9$DRVpzu$1SRyG?8N)*fDnJ!F_NH9Hhat|M7rupo4%4#|Z{m~i627commm}uGhTNQ^JBp_w6eybCmOX)PYeJ8fXhdx)W-YSU;ugQ&*y!8UdQ_WO)9vHy;yyD<;O=o z+pv0;(XF$O^Oh7F>TfVdKL~s$zRAa-6hF9NR-?AIx6@(or56HA0Pf&|(-yVGvIKf( zpE6A1p$u*|nzjAYw+wa?IY|N|aDosM(r{|d4@zVQrzRy5rOY0@21l-a-24L>VJMw| zIq|T;>Lk}={IOS_HFEiUIr95{%46Yp>H;*CrL4RV1Yw(Nzh_O>ZMPdrG!o1-cG+1Z zTz_zLmvAhK#UPBw!fV!)>8pdPa~rwOC`wifw-v! z#s;~D2}@pK>2b`AMWVbB=;t@y?b;2xY^%fGRqzy`AAUI5KYo39x}}a9`d0#e{o&*^ zKkQC)NhU(KxE$Rw&e0`smsi$uaHnQ4S_eVvn{E*PJ&Q#%is1C=_I2#1f^DutmFr1^ zy+|^AfGix*K_rpm0;ho!B!a#0e7vXbh|O$4rpt?ujrs*^XKjSY>(I`7}J8<&|FjDKP5xY}4q;)gDaJG<)^$dh$1TvU&py zJ--t@CSwr=xtnpB8;nxA_Qm_mV%C#At`r#sK1^vSir68poPZ}c(uE>YFU*Q@U;3#J zoA_Bw*c~06UuOdImXTxL-C<{0KS}*GgNDhV-7JoUOqDG#7(*1o0+>n~ewxfghdekG zT3Te6qzUfJD1gOGY9z;=^(@nT3~bx4mX_)H$y?IIdyLqRmsV(G|Ir@atRI$?dPpR$`TB6C*=yOsjV!Q_(KYB*D-=5m)W?F z1Rf4JVpui?&MFk&N(#SF^Re(^=X$=@@3zPb)-8On+wE3?)3({Ehy-+hM^0FzW@kvb ze(fWLIg02uep}>N__wXytJ9NsFEp^&HSTt+|Gsxvwy|5GVFHdLc@ufo?`s;mK#`+q{wnC9MopcS_HXC?o@>| z%4_}?xE0(8;U30codOT4|Aaubto$ z6-7}WcpRkvUZY*W*{EiyoZ5i>Ao>~>YzRg+kBMr|Q!s&EbKZq=YnqCnmD$*^o5~ft zo!eIPKNPlrd{*dZ_ljGt%5OGb>`IMxYo}9**x6+VAiBuK4wK?~f)pwak=F?-8>^&y zcJ$M+;-V!JW5;Lng2f_oK=DJRHce2$@^rMejShprrm;*lNB7rAp#~-5r<80>%GfXj z&?23A>n;t5em>k{1yceOnhoJv7F7vwVmOF?vqZnTP!vWy4X4W*R{?cb)R>lAe(?VE^zitc zpZs)md_GUh_Y#3A4d<4Wq)rT&a9qy&G>3uq>3Pil?I)qmz=njQ~&TH(d_ z!Xh5@3%%#ZggL$8CTXLq%mK5pi7(rMHL@frn#e)WOt_>XGTl<0`nld z*NXCR7gMZTreN2r7pT~|?HjG)p^XV0pZXc(#rR$PA_drlGkwB?|qDg=V*WwJ3z-uZ`sbJGx9s!y$k# z1-}$GpyOlbQgD=+F?<^%G_m^5>cjdijF9^jC#`=jzD?rJ(XdJRAd@cjB9!I9S5$?W zhB^?cx{#!ON&K1OG_Rt0?qgU56o zP&UlJL%ez??=f5LBHOW25_xwq9_ +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Minor mode for REPL interactions. + +;;; Code: + +(require 'cider-interaction) + +(defvar cider-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "M-.") 'cider-jump) + (define-key map (kbd "M-,") 'cider-jump-back) + (define-key map (kbd "M-TAB") 'complete-symbol) + (define-key map (kbd "C-M-x") 'cider-eval-defun-at-point) + (define-key map (kbd "C-c C-c") 'cider-eval-defun-at-point) + (define-key map (kbd "C-x C-e") 'cider-eval-last-sexp) + (define-key map (kbd "C-c C-e") 'cider-eval-last-sexp) + (define-key map (kbd "C-c C-w") 'cider-eval-last-sexp-and-replace) + (define-key map (kbd "C-c M-e") 'cider-eval-last-sexp-to-repl) + (define-key map (kbd "C-c M-p") 'cider-insert-last-sexp-in-repl) + (define-key map (kbd "C-c C-p") 'cider-pprint-eval-last-sexp) + (define-key map (kbd "C-c C-r") 'cider-eval-region) + (define-key map (kbd "C-c C-n") 'cider-eval-ns-form) + (define-key map (kbd "C-c M-:") 'cider-read-and-eval) + (define-key map (kbd "C-c C-m") 'cider-macroexpand-1) + (define-key map (kbd "C-c M-m") 'cider-macroexpand-all) + (define-key map (kbd "C-c M-n") 'cider-repl-set-ns) + (define-key map (kbd "C-c C-d") 'cider-doc) + (define-key map (kbd "C-c C-s") 'cider-src) + (define-key map (kbd "C-c C-z") 'cider-switch-to-repl-buffer) + (define-key map (kbd "C-c C-Z") 'cider-switch-to-relevant-repl-buffer) + (define-key map (kbd "C-c M-o") 'cider-find-and-clear-repl-buffer) + (define-key map (kbd "C-c C-k") 'cider-load-current-buffer) + (define-key map (kbd "C-c C-l") 'cider-load-file) + (define-key map (kbd "C-c C-b") 'cider-interrupt) + (define-key map (kbd "C-c C-j") 'cider-javadoc) + (define-key map (kbd "C-c M-s") 'cider-selector) + (define-key map (kbd "C-c M-r") 'cider-rotate-connection) + (define-key map (kbd "C-c M-d") 'cider-display-current-connection-info) + (define-key map (kbd "C-c C-q") 'cider-quit) + map)) + +;;;###autoload +(define-minor-mode cider-mode + "Minor mode for REPL interaction from a Clojure buffer. + +\\{cider-mode-map}" + nil + " cider" + cider-mode-map + (make-local-variable 'completion-at-point-functions) + (add-to-list 'completion-at-point-functions + 'cider-complete-at-point)) + +(easy-menu-define cider-mode-menu cider-mode-map + "Menu for CIDER mode" + '("CIDER" + ["Jump" cider-jump] + ["Jump back" cider-jump-back] + "--" + ["Complete symbol" complete-symbol] + "--" + ["Eval top-level sexp at point" cider-eval-defun-at-point] + ["Eval last sexp" cider-eval-last-sexp] + ["Eval last sexp in popup buffer" cider-pprint-eval-last-sexp] + ["Eval last sexp to REPL buffer" cider-eval-last-sexp-to-repl] + ["Eval last sexp and replace it with its result" cider-eval-last-sexp-and-replace] + ["Eval region" cider-eval-region] + ["Eval ns form" cider-eval-ns-form] + ["Insert last sexp in REPL" cider-insert-last-sexp-in-repl] + "--" + ["Load current buffer" cider-load-current-buffer] + ["Load file" cider-load-file] + "--" + ["Macroexpand-1 last expression" cider-macroexpand-1] + ["Macroexpand-all last expression" cider-macroexpand-all] + "--" + ["Display documentation" cider-doc] + ["Display source" cider-src] + ["Display JavaDoc" cider-javadoc] + "--" + ["Set ns" cider-repl-set-ns] + ["Switch to REPL" cider-switch-to-repl-buffer] + ["Switch to Relevant REPL" cider-switch-to-relevant-repl-buffer] + ["Toggle REPL Pretty Print" cider-pretty-toggle] + ["Clear REPL" cider-find-and-clear-repl-buffer] + ["Interrupt" cider-interrupt] + ["Quit" cider-quit] + ["Restart" cider-restart] + "--" + ["Display current nREPL connection" cider-display-current-connection-info] + ["Rotate current nREPL connection" cider-rotate-connection] + "--" + ["Version info" cider-version])) + +(provide 'cider-mode) +;;; cider-mode.el ends here diff --git a/elpa/cider-0.4.0/cider-mode.elc b/elpa/cider-0.4.0/cider-mode.elc new file mode 100644 index 0000000000000000000000000000000000000000..b64e40c225b77ca179fd9dc59e1dfdced04fa22f GIT binary patch literal 4614 zcmbtYZExeo5jNr!NE9?^lMgxcODA;FlYmebUnJRg4U)p=7Czh+*Skx;SVFrdR~GO1 zRxatpE&AX4%#urSZMi5A0~W~HnP+BaXXhE|>G_MZFAfe4Mo*tUrL!U{lT^lZbxWD3 zw~0`HkL6Dy+SaoAKCiClZjX2DQ;nA7 zbk5pzBP*4_w;xV}sjt_5O6o0%G^L`flPvj{sG*>yBfa=`o2WL7MoC5SZ7#ATqPU1u zT_yRo`Ub0&s!7B#lF|F|PN)9qJ&d>jMqbnu6?rY7+|(QQ1d`nS)0?x43yQX)5)m?} zzR~VQ9+N645;9=)om@^2(RRkTo8+ysbNCzMy)4nzYS%_Zc%K;sy;8|*?xN1&rfkf~|y`AZaPPp#sLk(`!yEFtRJNPn1K5I8u z0RPZ{qfz7abMvYye*Inliryb>P0rk_X0t&TZJUuAtfhzL%ot(`!nG8b2v8m6NklmuN#zET;p+&^{{@R({)9;ob^RbT{$NZ4%p z`#pp~>}P!R6-_ZboO+00tb2el>Qd~cMTENRNQlGXP?vLhndC^4jt{j0J8bVUoxlt_!&OYhrQXCE#GMxLnHM3mD5R>#==$37>{A<%^76O zPm5j$5I#f9f(u3uh#&uWpxG49fp3;tGHcQP3{_AW(Eh?tVT(4w;~X|%U-rp8_sIM9 z=!xzqnN&*P$gsuk3hAVpN;k`Oaea-cuB_0Ne|GaGlT{MA=n0LaS=+w#Q9;z6y6L(| zVBb?+G+14?iU%*gz-fXZtUZywOZOePLOb3T#d|dfObdqZfM*>`wApkrv>h3v>bttQ zk?E~llE^XqcH4He^R|$_R=Ud3)+O$$gL~u+S8kg>J@ryQ_%$)mL#(l>Hd@Ra?X}J;8B-ay{J%R|<8j zvE8^}UPa~xF}GfwJux~oc67vmbe@CbO`~GIUw1OP0>KX#G~=(yaa}e$>)4)Jwuhok z|GnZlGg@7gE_gzwq*-0mq}kuVYudC20}ex*^7YYHmU2(i_x1RDMp=|i*|j5Mx0k&4 zn4`byKG!xgW35B%y&6{BW6u5Bj3h}-`U_N2E67xn)(^l9=9nI`9V0A*R@7^N&3U4* zRJtjHbuRQoLwy1{F}yRQ|IozKAKeR(vAJq@lDUVc*`>B%dNw|^9t(QVm)1n1gTs7- z?C@7lV>TRWJO&s#`m7~u{%VSzim#W?e33Y4Dhxk z6J5-&Dp}XJ^or+K6CRQd8A_QshYiknGP9gKJhZX?1$TU&y9}bH02c7--!S!epn)cLhfpE-iAy;H7Z-%VBq4xI77W-s>sS`Tr3^*)4jZ`SK$`LX*kgoiof WxBE?DJpn@(HyFPM?RHJ`$>_g1C!bsZ literal 0 HcmV?d00001 diff --git a/elpa/cider-0.4.0/cider-pkg.el b/elpa/cider-0.4.0/cider-pkg.el new file mode 100644 index 000000000..9c2e46134 --- /dev/null +++ b/elpa/cider-0.4.0/cider-pkg.el @@ -0,0 +1,3 @@ +(define-package "cider" "0.4.0" + "Clojure Integrated Development Environment and REPL" + '((clojure-mode "2.0.0") (cl-lib "0.3") (dash "2.1.0") (pkg-info "0.3"))) diff --git a/elpa/cider-0.4.0/cider-pkg.elc b/elpa/cider-0.4.0/cider-pkg.elc new file mode 100644 index 0000000000000000000000000000000000000000..232d06b63da75be902db6800bdfda70fc2bf04b1 GIT binary patch literal 725 zcmbtSv2NQi5cRAd=z7o+8;B@bwt+fc61W~5WGLF~#hE-wY{;WPQVx=@4<#D~ij3jH z>^0V5fgccP4PWtxOn)zKORAL z=uxHyhTF*=SwV0hk>NyO9R6o=eM|sCZ!~#`T_V=2i*Fjzm)2OoS67y0b4872DteSJ z*b?N^pmNBkQKfxv+~2_y963_!F{U>DpfefQTjB@@K5OrIipO^RI{bXf;buOUmwSbE lDyi0@5>>u{lrD@ujq;p3{*y{iQ literal 0 HcmV?d00001 diff --git a/elpa/cider-0.4.0/cider-repl.el b/elpa/cider-0.4.0/cider-repl.el new file mode 100644 index 000000000..85717da46 --- /dev/null +++ b/elpa/cider-0.4.0/cider-repl.el @@ -0,0 +1,1032 @@ +;;; cider-repl.el --- REPL interactions + +;; Copyright © 2012-2013 Tim King, Phil Hagelberg +;; Copyright © 2013 Bozhidar Batsov, Hugo Duncan, Steve Purcell +;; +;; Author: Tim King +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; REPL interactions. + +;;; Code: + +(require 'cider-client) +(require 'cider-interaction) +(require 'cider-version) +(require 'cider-eldoc) ; for cider-turn-on-eldoc-mode + +(require 'clojure-mode) +(require 'easymenu) + +(eval-when-compile + (defvar paredit-version) + (defvar paredit-space-for-delimiter-predicates)) + +(defgroup cider-repl nil + "Interaction with the REPL." + :prefix "cider-repl-" + :group 'cider) + +(defface cider-repl-prompt-face + '((t (:inherit font-lock-keyword-face))) + "Face for the prompt in the REPL buffer." + :group 'cider-repl) + +(defface cider-repl-output-face + '((t (:inherit font-lock-string-face))) + "Face for output in the REPL buffer." + :group 'cider-repl) + +(defface cider-repl-input-face + '((t (:bold t))) + "Face for previous input in the REPL buffer." + :group 'cider-repl) + +(defface cider-repl-result-face + '((t ())) + "Face for the result of an evaluation in the REPL buffer." + :group 'cider-repl) + +(defcustom cider-repl-popup-stacktraces nil + "Non-nil means pop-up error stacktraces in the REPL buffer. +Nil means show only an error message in the minibuffer. This variable +overrides `cider-popup-stacktraces' in REPL buffers." + :type 'boolean + :group 'cider-repl) + +(defcustom cider-repl-pop-to-buffer-on-connect t + "Controls whether to pop to the REPL buffer on connect. + +When set to nil the buffer will only be created." + :type 'boolean + :group 'cider-repl) + +(defcustom cider-repl-display-in-current-window nil + "Controls whether the REPL buffer is displayed in the current window." + :type 'boolean + :group 'cider-repl) + +(defcustom cider-repl-use-pretty-printing nil + "Control whether the results in REPL are pretty-printed or not. +The `cider-toggle-pretty-printing' command can be used to interactively +change the setting's value." + :type 'boolean + :group 'cider-repl) + +(defcustom cider-repl-tab-command 'cider-repl-indent-and-complete-symbol + "Select the command to be invoked by the TAB key. +The default option is `cider-repl-indent-and-complete-symbol'. If +you'd like to use the default Emacs behavior use +`indent-for-tab-command'." + :type 'symbol + :group 'cider-repl) + +(defcustom cider-lein-command + "lein" + "The command used to execute leiningen 2.x." + :type 'string + :group 'cider-repl) + +(defcustom cider-server-command + (if (or (locate-file cider-lein-command exec-path) + (locate-file (format "%s.bat" cider-lein-command) exec-path)) + (format "%s repl :headless" cider-lein-command) + (format "echo \"%s repl :headless\" | eval $SHELL -l" cider-lein-command)) + "The command used to start the nREPL via command `cider-jack-in'. +For a remote nREPL server lein must be in your PATH. The remote +proc is launched via sh rather than bash, so it might be necessary +to specific the full path to it. Localhost is assumed." + :type 'string + :group 'cider-repl) + +;;;; REPL buffer local variables +(defvar cider-repl-input-start-mark) + +(defvar cider-repl-prompt-start-mark) + +(defvar cider-repl-old-input-counter 0 + "Counter used to generate unique `cider-old-input' properties. +This property value must be unique to avoid having adjacent inputs be +joined together.") + +(defvar cider-repl-input-history '() + "History list of strings read from the nREPL buffer.") + +(defvar cider-repl-input-history-items-added 0 + "Variable counting the items added in the current session.") + +(defvar cider-repl-output-start nil + "Marker for the start of output.") + +(defvar cider-repl-output-end nil + "Marker for the end of output.") + +(nrepl-make-variables-buffer-local + 'cider-repl-input-start-mark + 'cider-repl-prompt-start-mark + 'cider-repl-old-input-counter + 'cider-repl-input-history + 'cider-repl-input-history-items-added + 'cider-repl-output-start + 'cider-repl-output-end) + +(defun cider-repl-tab () + "Invoked on TAB keystrokes in `cider-repl-mode' buffers." + (interactive) + (funcall cider-repl-tab-command)) + +(defun cider-repl-reset-markers () + "Reset all REPL markers." + (dolist (markname '(cider-repl-output-start + cider-repl-output-end + cider-repl-prompt-start-mark + cider-repl-input-start-mark)) + (set markname (make-marker)) + (set-marker (symbol-value markname) (point)))) + +(defmacro cider-propertize-region (props &rest body) + "Add PROPS to all text inserted by executing BODY. +More precisely, PROPS are added to the region between the point's +positions before and after executing BODY." + (let ((start (make-symbol "start-pos"))) + `(let ((,start (point))) + (prog1 (progn ,@body) + (add-text-properties ,start (point) ,props))))) + +(put 'cider-propertize-region 'lisp-indent-function 1) + +;;; REPL init +(defun cider-repl-buffer-name () + "Generate a REPL buffer name based on current connection buffer." + (with-current-buffer (get-buffer (nrepl-current-connection-buffer)) + (nrepl-buffer-name nrepl-repl-buffer-name-template))) + +(defun cider-create-repl-buffer (process) + "Create a REPL buffer for PROCESS." + (cider-init-repl-buffer + process + (let ((buffer-name (cider-repl-buffer-name))) + (if cider-repl-display-in-current-window + (add-to-list 'same-window-buffer-names buffer-name)) + (if cider-repl-pop-to-buffer-on-connect + (pop-to-buffer buffer-name) + (generate-new-buffer buffer-name)) + buffer-name))) + +(defun cider-make-repl (process) + "Make a REPL for the connection PROCESS." + (let ((connection-buffer (process-buffer process)) + (repl-buffer (cider-create-repl-buffer process))) + (with-current-buffer repl-buffer + (setq nrepl-connection-buffer (buffer-name connection-buffer))) + (with-current-buffer connection-buffer + (setq nrepl-repl-buffer (buffer-name repl-buffer))))) + +(defun cider-repl--banner () + "Generate the welcome REPL buffer banner." + (format "; CIDER %s (Clojure %s, nREPL %s)" + (cider-version) + (cider--clojure-version) + (cider--backend-version))) + +(defun cider-repl--insert-banner-and-prompt (ns) + "Insert REPL banner and REPL prompt, taking into account NS." + (when (zerop (buffer-size)) + (insert (propertize (cider-repl--banner) 'face 'font-lock-comment-face))) + (goto-char (point-max)) + (cider-repl--mark-output-start) + (cider-repl--mark-input-start) + (cider-repl--insert-prompt ns)) + +(defun cider-init-repl-buffer (connection buffer &optional noprompt) + "Initialize the REPL for CONNECTION in BUFFER. +Insert a banner, unless NOPROMPT is non-nil." + (with-current-buffer buffer + (unless (eq major-mode 'cider-repl-mode) + (cider-repl-mode)) + ;; use the same requires by default as clojure.main does + (cider-eval-sync nrepl-repl-requires-sexp) + (cider-repl-reset-markers) + (unless noprompt + (cider-repl--insert-banner-and-prompt nrepl-buffer-ns)) + (cider-remember-clojure-buffer cider-current-clojure-buffer) + (current-buffer))) + +(defun cider-find-or-create-repl-buffer () + "Return the REPL buffer, create it if necessary." + (let ((buffer (cider-current-repl-buffer))) + (if (null buffer) + (error "No active nREPL connection") + (let ((buffer (get-buffer buffer))) + (or (when (buffer-live-p buffer) buffer) + (let ((buffer (nrepl-current-connection-buffer))) + (if (null buffer) + (error "No active nREPL connection") + (cider-init-repl-buffer + (get-process buffer) + (get-buffer-create + (cider-repl-buffer-name)))))))))) + +;;; REPL interaction +(defun cider-property-bounds (prop) + "Return the the positions of the previous and next change to PROP. +PROP is the name of a text property." + (assert (get-text-property (point) prop)) + (let ((end (next-single-char-property-change (point) prop))) + (list (previous-single-char-property-change end prop) end))) + +(defun cider-repl--in-input-area-p () + "Return t if in input area." + (<= cider-repl-input-start-mark (point))) + +(defun cider-repl--current-input (&optional until-point-p) + "Return the current input as string. +The input is the region from after the last prompt to the end of +buffer. If UNTIL-POINT-P is non-nil, the input is until the current +point." + (buffer-substring-no-properties cider-repl-input-start-mark + (if until-point-p + (point) + (point-max)))) + +(defun cider-repl-previous-prompt () + "Move backward to the previous prompt." + (interactive) + (cider-repl--find-prompt t)) + +(defun cider-repl-next-prompt () + "Move forward to the next prompt." + (interactive) + (cider-repl--find-prompt)) + +(defun cider-repl--find-prompt (&optional backward) + "Find the next prompt. +If BACKWARD is non-nil look backward." + (let ((origin (point)) + (prop 'cider-prompt)) + (while (progn + (cider-search-property-change prop backward) + (not (or (cider-end-of-proprange-p prop) (bobp) (eobp))))) + (unless (cider-end-of-proprange-p prop) + (goto-char origin)))) + +(defun cider-search-property-change (prop &optional backward) + "Search forward for a property change to PROP. +If BACKWARD is non-nil search backward." + (cond (backward + (goto-char (previous-single-char-property-change (point) prop))) + (t + (goto-char (next-single-char-property-change (point) prop))))) + +(defun cider-end-of-proprange-p (property) + "Return t if at the the end of a property range for PROPERTY." + (and (get-char-property (max 1 (1- (point))) property) + (not (get-char-property (point) property)))) + +(defun cider-repl--mark-input-start () + "Mark the input start." + (set-marker cider-repl-input-start-mark (point) (current-buffer))) + +(defun cider-repl--mark-output-start () + "Mark the output start." + (set-marker cider-repl-output-start (point)) + (set-marker cider-repl-output-end (point))) + +(defun cider-repl--mark-output-end () + "Mark the output end." + (add-text-properties cider-repl-output-start cider-repl-output-end + '(face cider-repl-output-face + rear-nonsticky (face)))) + +(defun cider-repl--same-line-p (pos1 pos2) + "Return t if buffer positions POS1 and POS2 are on the same line." + (save-excursion (goto-char (min pos1 pos2)) + (<= (max pos1 pos2) (line-end-position)))) + +(defun cider-repl--bol-internal () + "Go to the beginning of line or the prompt." + (cond ((and (>= (point) cider-repl-input-start-mark) + (cider-repl--same-line-p (point) cider-repl-input-start-mark)) + (goto-char cider-repl-input-start-mark)) + (t (beginning-of-line 1)))) + +(defun cider-repl-bol () + "Go to the beginning of line or the prompt." + (interactive) + (deactivate-mark) + (cider-repl--bol-internal)) + +(defun cider-repl-bol-mark () + "Set the mark and go to the beginning of line or the prompt." + (interactive) + (unless mark-active + (set-mark (point))) + (cider-repl--bol-internal)) + +(defun cider-repl--at-prompt-start-p () + "Return t if point is at the start of prompt. +This will not work on non-current prompts." + (= (point) cider-repl-input-start-mark)) + +(defun cider-repl--show-maximum-output () + "Put the end of the buffer at the bottom of the window." + (when (eobp) + (let ((win (get-buffer-window (current-buffer)))) + (when win + (with-selected-window win + (set-window-point win (point-max)) + (recenter -1)))))) + +(defmacro cider-save-marker (marker &rest body) + "Save MARKER and execute BODY." + (let ((pos (make-symbol "pos"))) + `(let ((,pos (marker-position ,marker))) + (prog1 (progn . ,body) + (set-marker ,marker ,pos))))) + +(put 'cider-save-marker 'lisp-indent-function 1) + +(defun cider-repl--insert-prompt (namespace) + "Insert the prompt (before markers!), taking into account NAMESPACE. +Set point after the prompt. +Return the position of the prompt beginning." + (goto-char cider-repl-input-start-mark) + (cider-save-marker cider-repl-output-start + (cider-save-marker cider-repl-output-end + (unless (bolp) (insert-before-markers "\n")) + (let ((prompt-start (point)) + (prompt (format "%s> " namespace))) + (cider-propertize-region + '(face cider-repl-prompt-face read-only t intangible t + cider-prompt t + rear-nonsticky (cider-prompt read-only face intangible)) + (insert-before-markers prompt)) + (set-marker cider-repl-prompt-start-mark prompt-start) + prompt-start)))) + +(defun cider-repl-emit-output-at-pos (buffer string position &optional bol) + "Using BUFFER, insert STRING at POSITION and mark it as output. +If BOL is non-nil insert at the beginning of line." + (with-current-buffer buffer + (save-excursion + (cider-save-marker cider-repl-output-start + (cider-save-marker cider-repl-output-end + (goto-char position) + ;; TODO: Review the need for bol + (when (and bol (not (bolp))) (insert-before-markers "\n")) + (cider-propertize-region `(face cider-repl-output-face + rear-nonsticky (face)) + (insert-before-markers string) + (when (and (= (point) cider-repl-prompt-start-mark) + (not (bolp))) + (insert-before-markers "\n") + (set-marker cider-repl-output-end (1- (point)))))))) + (cider-repl--show-maximum-output))) + +(defun cider-repl-emit-interactive-output (string) + "Emit STRING as interactive output." + (with-current-buffer (cider-current-repl-buffer) + (let ((pos (1- (cider-repl--input-line-beginning-position)))) + (cider-repl-emit-output-at-pos (current-buffer) string pos t) + (ansi-color-apply-on-region pos (point-max))))) + +(defun cider-repl-emit-output (buffer string &optional bol) + "Using BUFFER, emit STRING. +If BOL is non-nil, emit at the beginning of the line." + (with-current-buffer buffer + (let ((pos (1- (cider-repl--input-line-beginning-position)))) + (cider-repl-emit-output-at-pos buffer string cider-repl-input-start-mark bol) + (ansi-color-apply-on-region pos (point-max))))) + +(defun cider-repl-emit-prompt (buffer) + "Emit the REPL prompt into BUFFER." + (with-current-buffer buffer + (save-excursion + (cider-save-marker cider-repl-output-start + (cider-save-marker cider-repl-output-end + (cider-repl--insert-prompt nrepl-buffer-ns)))) + (cider-repl--show-maximum-output))) + +(defun cider-repl-emit-result (buffer string &optional bol) + "Emit into BUFFER the result STRING and mark it as an evaluation result. +If BOL is non-nil insert at the beginning of the line." + (with-current-buffer buffer + (save-excursion + (cider-save-marker cider-repl-output-start + (cider-save-marker cider-repl-output-end + (goto-char cider-repl-input-start-mark) + (when (and bol (not (bolp))) (insert-before-markers "\n")) + (cider-propertize-region `(face cider-repl-result-face + rear-nonsticky (face)) + (insert-before-markers string))))) + (cider-repl--show-maximum-output))) + +(defun cider-repl-newline-and-indent () + "Insert a newline, then indent the next line. +Restrict the buffer from the prompt for indentation, to avoid being +confused by strange characters (like unmatched quotes) appearing +earlier in the buffer." + (interactive) + (save-restriction + (narrow-to-region cider-repl-prompt-start-mark (point-max)) + (insert "\n") + (lisp-indent-line))) + +(defun cider-repl-indent-and-complete-symbol () + "Indent the current line and perform symbol completion. +First indent the line. If indenting doesn't move point, complete +the symbol." + (interactive) + (let ((pos (point))) + (lisp-indent-line) + (when (= pos (point)) + (if (save-excursion (re-search-backward "[^() \n\t\r]+\\=" nil t)) + (completion-at-point))))) + +(defun cider-repl-kill-input () + "Kill all text from the prompt to point." + (interactive) + (cond ((< (marker-position cider-repl-input-start-mark) (point)) + (kill-region cider-repl-input-start-mark (point))) + ((= (point) (marker-position cider-repl-input-start-mark)) + (cider-repl-delete-current-input)))) + +(defun cider-repl--input-complete-p (start end) + "Return t if the region from START to END is a complete sexp." + (save-excursion + (goto-char start) + (cond ((looking-at "\\s *[@'`#]?[(\"]") + (ignore-errors + (save-restriction + (narrow-to-region start end) + ;; Keep stepping over blanks and sexps until the end of + ;; buffer is reached or an error occurs. Tolerate extra + ;; close parens. + (loop do (skip-chars-forward " \t\r\n)") + until (eobp) + do (forward-sexp)) + t))) + (t t)))) + +(defun cider-repl-handler (buffer) + "Make a nREPL evaluation handler for the REPL BUFFER." + (nrepl-make-response-handler buffer + (lambda (buffer value) + (cider-repl-emit-result buffer value t)) + (lambda (buffer out) + (cider-repl-emit-output buffer out)) + (lambda (buffer err) + (cider-repl-emit-output buffer err)) + (lambda (buffer) + (cider-repl-emit-prompt buffer)))) + +(defun cider-repl--send-input (&optional newline) + "Go to the end of the input and send the current input. +If NEWLINE is true then add a newline at the end of the input." + (unless (cider-repl--in-input-area-p) + (error "No input at point")) + (goto-char (point-max)) + (let ((end (point))) ; end of input, without the newline + (cider-repl--add-to-input-history (buffer-substring cider-repl-input-start-mark end)) + (when newline + (insert "\n") + (cider-repl--show-maximum-output)) + (let ((inhibit-modification-hooks t)) + (add-text-properties cider-repl-input-start-mark + (point) + `(cider-old-input + ,(incf cider-repl-old-input-counter)))) + (let ((overlay (make-overlay cider-repl-input-start-mark end))) + ;; These properties are on an overlay so that they won't be taken + ;; by kill/yank. + (overlay-put overlay 'read-only t) + (overlay-put overlay 'face 'cider-repl-input-face))) + (let* ((input (cider-repl--current-input)) + (form (if (and (not (string-match "\\`[ \t\r\n]*\\'" input)) cider-repl-use-pretty-printing) + (format "(clojure.pprint/pprint %s)" input) input))) + (goto-char (point-max)) + (cider-repl--mark-input-start) + (cider-repl--mark-output-start) + (cider-eval form (cider-repl-handler (current-buffer)) nrepl-buffer-ns))) + +(defun cider-repl-return (&optional end-of-input) + "Evaluate the current input string, or insert a newline. +Send the current input ony if a whole expression has been entered, +i.e. the parenthesis are matched. +When END-OF-INPUT is non-nil, send the input even if the parentheses +are not balanced." + (interactive "P") + (cond + (end-of-input + (cider-repl--send-input)) + ((and (get-text-property (point) 'cider-old-input) + (< (point) cider-repl-input-start-mark)) + (cider-repl--grab-old-input end-of-input) + (cider-repl--recenter-if-needed)) + ((cider-repl--input-complete-p cider-repl-input-start-mark (point-max)) + (cider-repl--send-input t)) + (t + (cider-repl-newline-and-indent) + (message "[input not complete]")))) + +(defun cider-repl--recenter-if-needed () + "Make sure that the point is visible." + (unless (pos-visible-in-window-p (point-max)) + (save-excursion + (goto-char (point-max)) + (recenter -1)))) + +(defun cider-repl--grab-old-input (replace) + "Resend the old REPL input at point. +If REPLACE is non-nil the current input is replaced with the old +input; otherwise the new input is appended. The old input has the +text property `cider-old-input'." + (multiple-value-bind (beg end) (cider-property-bounds 'cider-old-input) + (let ((old-input (buffer-substring beg end)) ;;preserve + ;;properties, they will be removed later + (offset (- (point) beg))) + ;; Append the old input or replace the current input + (cond (replace (goto-char cider-repl-input-start-mark)) + (t (goto-char (point-max)) + (unless (eq (char-before) ?\ ) + (insert " ")))) + (delete-region (point) (point-max)) + (save-excursion + (insert old-input) + (when (equal (char-before) ?\n) + (delete-char -1))) + (forward-char offset)))) + +(defun cider-repl-closing-return () + "Evaluate the current input string after closing all open lists." + (interactive) + (goto-char (point-max)) + (save-restriction + (narrow-to-region cider-repl-input-start-mark (point)) + (while (ignore-errors (save-excursion (backward-up-list 1)) t) + (insert ")"))) + (cider-repl-return)) + +(defun cider-repl-toggle-pretty-printing () + "Toggle pretty-printing in the REPL." + (interactive) + (setq cider-repl-use-pretty-printing (not cider-repl-use-pretty-printing)) + (message "Pretty printing in nREPL %s." + (if cider-repl-use-pretty-printing "enabled" "disabled"))) + +(defvar cider-repl-clear-buffer-hook) + +(defun cider-repl-clear-buffer () + "Delete the output generated by the Clojure process." + (interactive) + (let ((inhibit-read-only t)) + (delete-region (point-min) cider-repl-prompt-start-mark) + (delete-region cider-repl-output-start cider-repl-output-end) + (when (< (point) cider-repl-input-start-mark) + (goto-char cider-repl-input-start-mark)) + (recenter t)) + (run-hooks 'cider-repl-clear-buffer-hook)) + +(defun cider-repl--input-line-beginning-position () + "Return the position of the beginning of input." + (save-excursion + (goto-char cider-repl-input-start-mark) + (line-beginning-position))) + +(defun cider-repl-clear-output () + "Delete the output inserted since the last input." + (interactive) + (let ((start (save-excursion + (cider-repl-previous-prompt) + (ignore-errors (forward-sexp)) + (forward-line) + (point))) + (end (1- (cider-repl--input-line-beginning-position)))) + (when (< start end) + (let ((inhibit-read-only t)) + (delete-region start end) + (save-excursion + (goto-char start) + (insert + (propertize ";;; output cleared" 'face 'font-lock-comment-face))))))) + +(defun cider--all-ns () + "Get a list of the available namespaces." + (read (cider-eval-and-get-value "(map str (all-ns))"))) + +(defun cider-repl-set-ns (ns) + "Switch the namespace of the REPL buffer to NS. + +If invoked in a REPL buffer the command will prompt you for the name of the +namespace to switch to." + (interactive (list (if (derived-mode-p 'cider-repl-mode) + (completing-read "Switch to namespace: " + (cider--all-ns)) + (cider-current-ns)))) + (if ns + (with-current-buffer (cider-current-repl-buffer) + (cider-eval + (format "(in-ns '%s)" ns) + (cider-repl-handler (current-buffer)))) + (error "Cannot determine the current namespace"))) + +;;;;; History + +(defcustom cider-repl-wrap-history nil + "T to wrap history around when the end is reached." + :type 'boolean + :group 'cider-repl) + +(define-obsolete-variable-alias 'cider-wrap-history 'cider-repl-wrap-history) + +;; These two vars contain the state of the last history search. We +;; only use them if `last-command' was `cider-repl--history-replace', +;; otherwise we reinitialize them. + +(defvar cider-repl-input-history-position -1 + "Newer items have smaller indices.") + +(defvar cider-repl-history-pattern nil + "The regexp most recently used for finding input history.") + +(defun cider-repl--add-to-input-history (string) + "Add STRING to the input history. +Empty strings and duplicates are ignored." + (unless (or (equal string "") + (equal string (car cider-repl-input-history))) + (push string cider-repl-input-history) + (incf cider-repl-input-history-items-added))) + +(defun cider-repl-delete-current-input () + "Delete all text after the prompt." + (goto-char (point-max)) + (delete-region cider-repl-input-start-mark (point-max))) + +(defun cider-repl--replace-input (string) + "Replace the current REPL input with STRING." + (cider-repl-delete-current-input) + (insert-and-inherit string)) + +(defun cider-repl--position-in-history (start-pos direction regexp) + "Return the position of the history item starting at START-POS. +Search in DIRECTION for REGEXP. +Return -1 resp the length of the history if no item matches." + ;; Loop through the history list looking for a matching line + (let* ((step (ecase direction + (forward -1) + (backward 1))) + (history cider-repl-input-history) + (len (length history))) + (loop for pos = (+ start-pos step) then (+ pos step) + if (< pos 0) return -1 + if (<= len pos) return len + if (string-match regexp (nth pos history)) return pos))) + +(defun cider-repl--history-replace (direction &optional regexp) + "Replace the current input with the next line in DIRECTION. +DIRECTION is 'forward' or 'backward' (in the history list). +If REGEXP is non-nil, only lines matching REGEXP are considered." + (setq cider-repl-history-pattern regexp) + (let* ((min-pos -1) + (max-pos (length cider-repl-input-history)) + (pos0 (cond ((cider-history-search-in-progress-p) + cider-repl-input-history-position) + (t min-pos))) + (pos (cider-repl--position-in-history pos0 direction (or regexp ""))) + (msg nil)) + (cond ((and (< min-pos pos) (< pos max-pos)) + (cider-repl--replace-input (nth pos cider-repl-input-history)) + (setq msg (format "History item: %d" pos))) + ((not cider-repl-wrap-history) + (setq msg (cond ((= pos min-pos) "End of history") + ((= pos max-pos) "Beginning of history")))) + (cider-repl-wrap-history + (setq pos (if (= pos min-pos) max-pos min-pos)) + (setq msg "Wrapped history"))) + (when (or (<= pos min-pos) (<= max-pos pos)) + (when regexp + (setq msg (concat msg "; no matching item")))) + (message "%s%s" msg (cond ((not regexp) "") + (t (format "; current regexp: %s" regexp)))) + (setq cider-repl-input-history-position pos) + (setq this-command 'cider-repl--history-replace))) + +(defun cider-history-search-in-progress-p () + "Return t if a current history search is in progress." + (eq last-command 'cider-repl--history-replace)) + +(defun cider-terminate-history-search () + "Terminate the current history search." + (setq last-command this-command)) + +(defun cider-repl-previous-input () + "Cycle backwards through input history. +If the `last-command' was a history navigation command use the +same search pattern for this command. +Otherwise use the current input as search pattern." + (interactive) + (cider-repl--history-replace 'backward (cider-repl-history-pattern t))) + +(defun cider-repl-next-input () + "Cycle forwards through input history. +See `cider-previous-input'." + (interactive) + (cider-repl--history-replace 'forward (cider-repl-history-pattern t))) + +(defun cider-repl-forward-input () + "Cycle forwards through input history." + (interactive) + (cider-repl--history-replace 'forward (cider-repl-history-pattern))) + +(defun cider-repl-backward-input () + "Cycle backwards through input history." + (interactive) + (cider-repl--history-replace 'backward (cider-repl-history-pattern))) + +(defun cider-repl-previous-matching-input (regexp) + "Find the previous input matching REGEXP." + (interactive "sPrevious element matching (regexp): ") + (cider-terminate-history-search) + (cider-repl--history-replace 'backward regexp)) + +(defun cider-repl-next-matching-input (regexp) + "Find then next input matching REGEXP." + (interactive "sNext element matching (regexp): ") + (cider-terminate-history-search) + (cider-repl--history-replace 'forward regexp)) + +(defun cider-repl-history-pattern (&optional use-current-input) + "Return the regexp for the navigation commands. +If USE-CURRENT-INPUT is non-nil, use the current input." + (cond ((cider-history-search-in-progress-p) + cider-repl-history-pattern) + (use-current-input + (assert (<= cider-repl-input-start-mark (point))) + (let ((str (cider-repl--current-input t))) + (cond ((string-match "^[ \n]*$" str) nil) + (t (concat "^" (regexp-quote str)))))) + (t nil))) + +;;; persistent history +(defcustom cider-repl-history-size 500 + "The maximum number of items to keep in the REPL history." + :type 'integer + :safe 'integerp + :group 'cider-repl-mode) + +(define-obsolete-variable-alias 'cider-history-size 'cider-repl-history-size) + +(defcustom cider-repl-history-file nil + "File to save the persistent REPL history to." + :type 'string + :safe 'stringp + :group 'cider-repl-mode) + +(define-obsolete-variable-alias 'cider-history-file 'cider-repl-history-file) + +(defun cider-repl--history-read-filename () + "Ask the user which file to use, defaulting `cider-repl-history-file'." + (read-file-name "Use CIDER REPL history file: " + cider-repl-history-file)) + +(defun cider-repl--history-read (filename) + "Read history from FILENAME and return it. +It does not yet set the input history." + (if (file-readable-p filename) + (with-temp-buffer + (insert-file-contents filename) + (read (current-buffer))) + '())) + +(defun cider-repl-history-load (&optional filename) + "Load history from FILENAME into current session. +FILENAME defaults to the value of `cider-repl-history-file' but user +defined filenames can be used to read special history files. + +The value of `cider-repl-input-history' is set by this function." + (interactive (list (cider-repl--history-read-filename))) + (let ((f (or filename cider-repl-history-file))) + ;; TODO: probably need to set cider-repl-input-history-position as well. + ;; in a fresh connection the newest item in the list is currently + ;; not available. After sending one input, everything seems to work. + (setq cider-repl-input-history (cider-repl--history-read f)))) + +(defun cider-repl--history-write (filename) + "Write history to FILENAME. +Currently coding system for writing the contents is hardwired to +utf-8-unix." + (let* ((mhist (cider-repl--histories-merge cider-repl-input-history + cider-repl-input-history-items-added + (cider-repl--history-read filename))) + ;; newest items are at the beginning of the list, thus 0 + (hist (cl-subseq mhist 0 (min (length mhist) cider-repl-history-size)))) + (unless (file-writable-p filename) + (error (format "History file not writable: %s" filename))) + (let ((print-length nil) (print-level nil)) + (with-temp-file filename + ;; TODO: really set cs for output + ;; TODO: does cs need to be customizable? + (insert ";; -*- coding: utf-8-unix -*-\n") + (insert ";; Automatically written history of CIDER REPL session\n") + (insert ";; Edit at your own risk\n\n") + (prin1 (mapcar #'substring-no-properties hist) (current-buffer)))))) + +(defun cider-repl-history-save (&optional filename) + "Save the current REPL input history to FILENAME. +FILENAME defaults to the value of `cider-repl-history-file'." + (interactive (list (cider-repl--history-read-filename))) + (let* ((file (or filename cider-repl-history-file))) + (cider-repl--history-write file))) + +(defun cider-repl-history-just-save () + "Just save the history to `cider-repl-history-file'. +This function is meant to be used in hooks to avoid lambda +constructs." + (cider-repl-history-save cider-repl-history-file)) + +;; SLIME has different semantics and will not save any duplicates. +;; we keep track of how many items were added to the history in the +;; current session in `cider-repl--add-to-input-history' and merge only the +;; new items with the current history found in the file, which may +;; have been changed in the meantime by another session. +(defun cider-repl--histories-merge (session-hist n-added-items file-hist) + "Merge histories from SESSION-HIST adding N-ADDED-ITEMS into FILE-HIST." + (append (cl-subseq session-hist 0 n-added-items) + file-hist)) + +;;; REPL shortcuts +(defcustom cider-repl-shortcut-dispatch-char ?\, + "Character used to distinguish REPL commands from Lisp forms." + :type '(character) + :group 'cider-repl) + +(defvar cider-repl-shortcuts (make-hash-table :test 'equal)) + +(defun cider-repl-add-shortcut (name handler) + "Add a REPL shortcut command, defined by NAME and HANDLER." + (puthash name handler cider-repl-shortcuts)) + +(cider-repl-add-shortcut "hasta la vista" 'cider-quit) +(cider-repl-add-shortcut "version" 'cider-version) +(cider-repl-add-shortcut "conn-info" 'cider-display-current-connection-info) +(cider-repl-add-shortcut "conn-rotate" 'cider-rotate-connection) +(cider-repl-add-shortcut "clear" 'cider-repl-clear-buffer) +(cider-repl-add-shortcut "ns" 'cider-repl-set-ns) + +(defun cider-repl--available-shortcuts () + "Return the available REPL shortcuts." + (cider-util--hash-keys cider-repl-shortcuts)) + +(defun cider-repl-handle-shortcut () + "Execute a REPL shortcut." + (interactive) + (if (> (point) cider-repl-input-start-mark) + (insert (string cider-repl-shortcut-dispatch-char)) + (let ((command (completing-read "Command: " + (cider-repl--available-shortcuts)))) + (if (not (equal command "")) + (call-interactively (gethash command cider-repl-shortcuts)) + (error "No command selected"))))) + + +;;;;; CIDER REPL mode + +;;; Prevent paredit from inserting some inappropriate spaces. +;;; C.f. clojure-mode.el +(defun cider-space-for-delimiter-p (endp delim) + "Hook for paredit's `paredit-space-for-delimiter-predicates'. + +Decides if paredit should insert a space after/before (if/unless +ENDP) DELIM." + (if (derived-mode-p 'cider-repl-mode) + (save-excursion + (backward-char) + (if (and (or (char-equal delim ?\() + (char-equal delim ?\") + (char-equal delim ?{)) + (not endp)) + (if (char-equal (char-after) ?#) + (and (not (bobp)) + (or (char-equal ?w (char-syntax (char-before))) + (char-equal ?_ (char-syntax (char-before))))) + t) + t)) + t)) + +(defvar cider-repl-mode-hook nil + "Hook executed when entering `cider-repl-mode'.") + +(defvar cider-repl-mode-syntax-table + (copy-syntax-table clojure-mode-syntax-table)) + +(defvar cider-repl-mode-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map clojure-mode-map) + (define-key map (kbd "M-.") 'cider-jump) + (define-key map (kbd "M-,") 'cider-jump-back) + (define-key map (kbd "RET") 'cider-repl-return) + (define-key map (kbd "TAB") 'cider-repl-tab) + (define-key map (kbd "C-") 'cider-repl-closing-return) + (define-key map (kbd "C-j") 'cider-repl-newline-and-indent) + (define-key map (kbd "C-c C-d") 'cider-doc) + (define-key map (kbd "C-c C-s") 'cider-src) + (define-key map (kbd "C-c C-o") 'cider-repl-clear-output) + (define-key map (kbd "C-c M-o") 'cider-repl-clear-buffer) + (define-key map (kbd "C-c M-n") 'cider-repl-set-ns) + (define-key map (kbd "C-c C-u") 'cider-repl-kill-input) + (define-key map (kbd "C-a") 'cider-repl-bol) + (define-key map (kbd "C-S-a") 'cider-repl-bol-mark) + (define-key map [home] 'cider-repl-bol) + (define-key map [S-home] 'cider-repl-bol-mark) + (define-key map (kbd "C-") 'cider-repl-backward-input) + (define-key map (kbd "C-") 'cider-repl-forward-input) + (define-key map (kbd "M-p") 'cider-repl-previous-input) + (define-key map (kbd "M-n") 'cider-repl-next-input) + (define-key map (kbd "M-r") 'cider-repl-previous-matching-input) + (define-key map (kbd "M-s") 'cider-repl-next-matching-input) + (define-key map (kbd "C-c C-n") 'cider-repl-next-prompt) + (define-key map (kbd "C-c C-p") 'cider-repl-previous-prompt) + (define-key map (kbd "C-c C-b") 'cider-interrupt) + (define-key map (kbd "C-c C-c") 'cider-interrupt) + (define-key map (kbd "C-c C-j") 'cider-javadoc) + (define-key map (kbd "C-c C-m") 'cider-macroexpand-1) + (define-key map (kbd "C-c M-m") 'cider-macroexpand-all) + (define-key map (kbd "C-c C-z") 'cider-switch-to-last-clojure-buffer) + (define-key map (kbd "C-c M-s") 'cider-selector) + (define-key map (kbd "C-c M-r") 'cider-rotate-connection) + (define-key map (kbd "C-c M-d") 'cider-display-current-connection-info) + (define-key map (kbd "C-c C-q") 'cider-quit) + (define-key map (string cider-repl-shortcut-dispatch-char) 'cider-repl-handle-shortcut) + map)) + +(define-derived-mode cider-repl-mode fundamental-mode "REPL" + "Major mode for Clojure REPL interactions. + +\\{cider-repl-mode-map}" + (setq-local lisp-indent-function 'clojure-indent-function) + (setq-local indent-line-function 'lisp-indent-line) + (make-local-variable 'completion-at-point-functions) + (add-to-list 'completion-at-point-functions + 'cider-complete-at-point) + (set-syntax-table cider-repl-mode-syntax-table) + (cider-turn-on-eldoc-mode) + (if (fboundp 'hack-dir-local-variables-non-file-buffer) + (hack-dir-local-variables-non-file-buffer)) + (when cider-repl-history-file + (cider-repl-history-load cider-repl-history-file) + (add-hook 'kill-buffer-hook 'cider-repl-history-just-save t t) + (add-hook 'kill-emacs-hook 'cider-repl-history-just-save)) + (add-hook 'paredit-mode-hook + (lambda () + (when (>= paredit-version 21) + (define-key cider-repl-mode-map "{" 'paredit-open-curly) + (define-key cider-repl-mode-map "}" 'paredit-close-curly) + (add-to-list 'paredit-space-for-delimiter-predicates + 'cider-space-for-delimiter-p))))) + +(easy-menu-define cider-repl-mode-menu cider-repl-mode-map + "Menu for CIDER's REPL mode" + '("REPL" + ["Jump" cider-jump] + ["Jump back" cider-jump-back] + "--" + ["Complete symbol" complete-symbol] + "--" + ["Display documentation" cider-doc] + ["Display source" cider-src] + ["Display JavaDoc" cider-javadoc] + "--" + ["Set REPL ns" cider-repl-set-ns] + ["Toggle pretty printing of results" cider-repl-toggle-pretty-printing] + ["Clear output" cider-repl-clear-output] + ["Clear buffer" cider-repl-clear-buffer] + ["Kill input" cider-repl-kill-input] + ["Interrupt" cider-interrupt] + ["Quit" cider-quit] + ["Restart" cider-restart] + "--" + ["Version info" cider-version])) + + +(provide 'cider-repl) +;;; cider-repl.el ends here diff --git a/elpa/cider-0.4.0/cider-repl.elc b/elpa/cider-0.4.0/cider-repl.elc new file mode 100644 index 0000000000000000000000000000000000000000..279a79b1df3943ff3286979ea2bad192483d4d19 GIT binary patch literal 38330 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 +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Buffer selection command inspired by SLIME's selector. + +;;; Code: + +(require 'cider-client) +(require 'cider-interaction) +(require 'cider-repl) ; for cider-find-or-create-repl-buffer + +(defvar cider-selector-methods nil + "List of buffer-selection methods for the `cider-select' command. +Each element is a list (KEY DESCRIPTION FUNCTION). +DESCRIPTION is a one-line description of what the key selects.") + +(defvar cider-selector-other-window nil + "If non-nil use `switch-to-buffer-other-window'.") + +(defun cider--recently-visited-buffer (mode) + "Return the most recently visited buffer whose `major-mode' is MODE. +Only considers buffers that are not already visible." + (loop for buffer in (buffer-list) + when (and (with-current-buffer buffer (eq major-mode mode)) + (not (string-match "^ " (buffer-name buffer))) + (null (get-buffer-window buffer 'visible))) + return buffer + finally (error "Can't find unshown buffer in %S" mode))) + +;;;###autoload +(defun cider-selector (&optional other-window) + "Select a new buffer by type, indicated by a single character. +The user is prompted for a single character indicating the method by +which to choose a new buffer. The `?' character describes then +available methods. OTHER-WINDOW provides an optional target. + +See `def-cider-selector-method' for defining new methods." + (interactive) + (message "Select [%s]: " + (apply #'string (mapcar #'car cider-selector-methods))) + (let* ((cider-selector-other-window other-window) + (ch (save-window-excursion + (select-window (minibuffer-window)) + (read-char))) + (method (cl-find ch cider-selector-methods :key #'car))) + (cond (method + (funcall (cl-caddr method))) + (t + (message "No method for character: ?\\%c" ch) + (ding) + (sleep-for 1) + (discard-input) + (cider-selector))))) + +(defmacro def-cider-selector-method (key description &rest body) + "Define a new `cider-select' buffer selection method. + +KEY is the key the user will enter to choose this method. + +DESCRIPTION is a one-line sentence describing how the method +selects a buffer. + +BODY is a series of forms which are evaluated when the selector +is chosen. The returned buffer is selected with +`switch-to-buffer'." + (let ((method `(lambda () + (let ((buffer (progn ,@body))) + (cond ((not (get-buffer buffer)) + (message "No such buffer: %S" buffer) + (ding)) + ((get-buffer-window buffer) + (select-window (get-buffer-window buffer))) + (cider-selector-other-window + (switch-to-buffer-other-window buffer)) + (t + (switch-to-buffer buffer))))))) + `(setq cider-selector-methods + (cl-sort (cons (list ,key ,description ,method) + (cl-remove ,key cider-selector-methods :key #'car)) + #'< :key #'car)))) + +(def-cider-selector-method ?? "Selector help buffer." + (ignore-errors (kill-buffer "*Select Help*")) + (with-current-buffer (get-buffer-create "*Select Help*") + (insert "Select Methods:\n\n") + (loop for (key line nil) in cider-selector-methods + do (insert (format "%c:\t%s\n" key line))) + (goto-char (point-min)) + (help-mode) + (display-buffer (current-buffer) t)) + (cider-selector) + (current-buffer)) + +(pushnew (list ?4 "Select in other window" (lambda () (cider-selector t))) + cider-selector-methods :key #'car) + +(def-cider-selector-method ?c + "Most recently visited clojure-mode buffer." + (cider--recently-visited-buffer 'clojure-mode)) + +(def-cider-selector-method ?e + "Most recently visited emacs-lisp-mode buffer." + (cider--recently-visited-buffer 'emacs-lisp-mode)) + +(def-cider-selector-method ?q "Abort." + (top-level)) + +(def-cider-selector-method ?r + "Current REPL buffer." + (cider-find-or-create-repl-buffer)) + +(def-cider-selector-method ?n + "Connections browser buffer." + (nrepl-connection-browser) + nrepl--connection-browser-buffer-name) + +(def-cider-selector-method ?v + "*nrepl-events* buffer." + nrepl-event-buffer-name) + +(def-cider-selector-method ?s + "Cycle to the next CIDER connection." + (cider-rotate-connection) + (cider-find-or-create-repl-buffer)) + +(provide 'cider-selector) +;;; cider-selector.el ends here diff --git a/elpa/cider-0.4.0/cider-selector.elc b/elpa/cider-0.4.0/cider-selector.elc new file mode 100644 index 0000000000000000000000000000000000000000..822d0f94bdf802cc798496c934a4f0f14f4e09d4 GIT binary patch literal 7102 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 f{cj24A}^5%E +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Common utility functions that don't belong anywhere else + +;;; Code: + +(require 'dash) + +;;; Compatibility +(eval-and-compile + ;; `setq-local' for Emacs 24.2 and below + (unless (fboundp 'setq-local) + (defmacro setq-local (var val) + "Set variable VAR to value VAL in current buffer." + `(set (make-local-variable ',var) ,val)))) + +(defun cider-util--hash-keys (hashtable) + "Return a list of keys in HASHTABLE." + (let ((keys '())) + (maphash (lambda (k v) (setq keys (cons k keys))) hashtable) + keys)) + +(defun cider-util--clojure-buffers () + "Return a list of all existing `clojure-mode' buffers." + (-filter + (lambda (buffer) (with-current-buffer buffer (derived-mode-p 'clojure-mode))) + (buffer-list))) + +(provide 'cider-util) + +;;; cider-util.el ends here diff --git a/elpa/cider-0.4.0/cider-util.elc b/elpa/cider-0.4.0/cider-util.elc new file mode 100644 index 0000000000000000000000000000000000000000..b536a6d439a2b0fff40dcc08fa2300b444a302e3 GIT binary patch literal 1280 zcmbtUO;6iE5ak$rMAJ3Bkxcszy+SuJ?UGMKNSqNdujEEOpusjNT>xGyYxwF1Hs1j8@G(U&BECsefl=J>VwK+Y zIRWqeJkRUR*M|A2%ouc^;vm2g?mtDLn?yKbTm;G94o(xd#4*HieE!sJQ2_!@y6~vj z(sIQhqq=~6F0IHGpqW|vrA%oF8Ov#jeTe;-DhUUVy%klkqGi8kuE`ur=kjuQ+Qw`V zE(~6KVNEC>w>h0-^DV73Yz7H*?+~%wewf^XkuJ7n@G!Y?g-@+gOc#EZJ?c)#I+*m2wtMSh1+m>d4UxM=J|KHXI-egOoDyMPVA?Pat=c%r|k3Rx@ z6i#}BNA;?+Z2Kd0;QfvB27t|=_=;t<9De~DI;YNAYz6wRAb;$JK@>Z`y@ir1{Gq^K ImFRoF0hmI9i2wiq literal 0 HcmV?d00001 diff --git a/elpa/cider-0.4.0/cider-version.el b/elpa/cider-0.4.0/cider-version.el new file mode 100644 index 000000000..f7b7d0695 --- /dev/null +++ b/elpa/cider-0.4.0/cider-version.el @@ -0,0 +1,78 @@ +;;; cider-version.el --- Version information utilities + +;; Copyright © 2012-2013 Tim King, Phil Hagelberg +;; Copyright © 2013 Bozhidar Batsov, Hugo Duncan, Steve Purcell +;; +;; Author: Tim King +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Contains several functions for extracting and displaying version information. + +;;; Code: + +(require 'pkg-info) + +(defun cider--library-version () + "Get the version in the CIDER library header." + (-when-let (version (pkg-info-library-version 'cider)) + (pkg-info-format-version version))) + +(defun cider--package-version () + "Get the package version of CIDER. + +This is the version number of the installed CIDER package. +Returns nil if CIDER was not installed via package.el." + (condition-case nil + (-when-let (version (pkg-info-package-version 'cider)) + (pkg-info-format-version version)) + (error nil))) + +(defun cider-version (&optional show-version) + "Get the CIDER version as string. + +If called interactively or if SHOW-VERSION is non-nil, show the +version in the echo area and the messages buffer. + +The returned string includes both, the version from package.el +and the library version, if both a present and different. + +If the version number could not be determined, signal an error, +if called interactively, or if SHOW-VERSION is non-nil, otherwise +just return nil." + (interactive (list (not (or executing-kbd-macro noninteractive)))) + (let* ((lib-version (cider--library-version)) + (pkg-version (cider--package-version)) + (version (cond + ((and lib-version pkg-version + (not (string= lib-version pkg-version))) + (format "%s (package: %s)" lib-version pkg-version)) + ((or pkg-version lib-version) + (format "%s" (or pkg-version lib-version)))))) + (when show-version + (unless version + (error "Could not find out CIDER version")) + (message "CIDER version: %s" version)) + version)) + +(provide 'cider-version) +;;; cider-version.el ends here diff --git a/elpa/cider-0.4.0/cider-version.elc b/elpa/cider-0.4.0/cider-version.elc new file mode 100644 index 0000000000000000000000000000000000000000..0b4942cfc195c8046fe6a42dec6cb0c282e113d0 GIT binary patch literal 2063 zcmbtVZExE)5cbDZ{Q>KS0=vrXDxsDvS#nY*K+(YqHV?xJB*pe24hCAHEH)D9l2SbH z*Y7BicG_epunG_)k;i*^p65aUz`Nme#g zzU6W~4O-5VP``z(3fGe5A#VxKXqbr_1c&!!3%|A;;u%EK)9LIqjbIYRY3IL?XjEVX z7?+}^<9jj2A+1TK!hB4t4H;)Fr!t7bG>pvqEtQH19@46F$T*zq17Ox+l7>k*>Grm) zDS=cKh)u(4_77?BpbDLC^L@!wpGm8zf_%qG%`(VErW(okT8(g5ss>1&BOd!W@hqIo z?)k_C`rx90Oz?)FaoZHZYh2;MkC*es00%V|L>6dJtj*$#|JU@0A5aaMu5OrjX?$+P7oj-MFN|5E2Dw<6J`m-takuFrB6TwJs)}M*C_uB)cK&Lsg>a zD?&~>Euoz57R}pwg~XwiUS(W0s6-S}kAiU)Iv2EQB}eUGh0J(_ErOxNbU1a(2-q{U zdJr|UZL5I;YLP__fjco!>3H61*U%snIsISYeje~k;QHWsR7xRz{{Z#tDC(h3ab8&A z^cYz-5sbbi5$Q#NEz{x1I5rb@6uYI>4usU`UHqi_68k-vRm1?T3YqK$T*v zd2p;xBT1T-0*IspbU$jMYN`~ntYFm^1?p3iOF?!lA$xryNK96>xwaBbIr@b6Zo(a? za;#&kdy~OP=c`Wx5-X{q948ItkTV??zxrZzN;YSss7$m~-pK<8M@|uinsJ(Ak!;OL zgs;{@*%H(k_ywB)bQN>2%7!sgbE0$YK7-c26Z<@6Y{=b5oRUY7`A$;dwi1LW} literal 0 HcmV?d00001 diff --git a/elpa/cider-0.4.0/cider.el b/elpa/cider-0.4.0/cider.el new file mode 100644 index 000000000..a49c65aaf --- /dev/null +++ b/elpa/cider-0.4.0/cider.el @@ -0,0 +1,110 @@ +;;; cider.el --- Clojure Integrated Development Environment and REPL + +;; Copyright © 2012-2013 Tim King, Phil Hagelberg +;; Copyright © 2013 Bozhidar Batsov, Hugo Duncan, Steve Purcell +;; +;; Author: Tim King +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell +;; URL: http://www.github.com/clojure-emacs/cider +;; Version: 0.4.0 +;; Keywords: languages, clojure, cider + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Provides a Clojure IDE and REPL for Emacs, built on top of nREPL. + +;;; Installation: + +;; Available as a package in marmalade-repo.org and melpa.milkbox.net. + +;; (add-to-list 'package-archives +;; '("marmalade" . "http://marmalade-repo.org/packages/")) +;; +;; or +;; +;; (add-to-list 'package-archives +;; '("melpa" . "http://melpa.milkbox.net/packages/") t) +;; +;; M-x package-install cider + +;;; Usage: + +;; M-x cider-jack-in + +;;; Code: + +(defgroup cider nil + "Clojure Integrated Development Environment and REPL." + :prefix "cider-" + :group 'applications) + +(require 'cider-client) +(require 'cider-version) +(require 'cider-interaction) +(require 'cider-eldoc) +(require 'cider-repl) +(require 'cider-mode) + +;;;###autoload +(defun cider-jack-in (&optional prompt-project) + "Start a nREPL server for the current project and connect to it. +If PROMPT-PROJECT is t, then prompt for the project for which to +start the server." + (interactive "P") + (setq cider-current-clojure-buffer (current-buffer)) + (let* ((project (when prompt-project + (ido-read-directory-name "Project: "))) + (project-dir (nrepl-project-directory-for + (or project (nrepl-current-dir))))) + (when (nrepl-check-for-repl-buffer nil project-dir) + (let* ((nrepl-project-dir project-dir) + (cmd (if project + (format "cd %s && %s" project cider-server-command) + cider-server-command)) + (process (start-process-shell-command + "nrepl-server" + (generate-new-buffer-name (nrepl-server-buffer-name)) + cmd))) + (set-process-filter process 'nrepl-server-filter) + (set-process-sentinel process 'nrepl-server-sentinel) + (set-process-coding-system process 'utf-8-unix 'utf-8-unix) + (with-current-buffer (process-buffer process) + (setq nrepl-project-dir project-dir)) + (message "Starting nREPL server..."))))) + +;;;###autoload +(defun cider (host port) + "Connect to an nREPL server identified by HOST and PORT." + (interactive (list (read-string "Host: " nrepl-host nil nrepl-host) + (string-to-number (let ((port (nrepl-default-port))) + (read-string "Port: " port nil port))))) + (setq cider-current-clojure-buffer (current-buffer)) + (when (nrepl-check-for-repl-buffer `(,host ,port) nil) + (nrepl-connect host port))) + +;;;###autoload +(eval-after-load 'clojure-mode + '(progn + (define-key clojure-mode-map (kbd "C-c M-j") 'cider-jack-in) + (define-key clojure-mode-map (kbd "C-c M-c") 'cider))) + +(provide 'cider) +;;; cider.el ends here diff --git a/elpa/cider-0.4.0/cider.elc b/elpa/cider-0.4.0/cider.elc new file mode 100644 index 0000000000000000000000000000000000000000..5e8a70c24102b71a1bb4ef5acb0000ca160820b2 GIT binary patch literal 2438 zcmbtV-*4MC5YF3B2kkasz<{;rF3OhKTd7!*ou4lq(g01-B1Riv4|Py55^XV+NR^_J zWqk48Xz|G7cXzz+j>o4jPrl#S*ytS}AJd60D_Mw)uI{MhHkZ79mx)`R z=2n=e%FM^CQ7Q@DENtp$l zNpMq0VaVoCj1zAc3HqX+bKpyVyb!P=jbtWj7Cc_~{gb`yT7$b}^#vaE0&R5eo zf<`-{tra0&6_Qn9v?`2Og*^zv{ea%4O>K3_GLaVC2sSsmsi@@&DOpf(Qt0c(2s%?% z%ni3lRCiad}t(~ zy-tcO0niHzDtbx6woAPur(Y2TSk}#rsETe{;wCTYV9?us8jTLXYGaHuSQ&jSQmDauP*1tJ)g*1$JDbtu_4%vG1;gjX>B$9w@b-y2uH3n@vP-xH zjDx?;Wtsz|SGNv0Yu z5;nfKv7p1&4=oiGR`i#xX;=#uK z$4(#IiuR{T3}(fEc<^xh@gq#*2kt*{IF4}fsFlY{d9RiCu^Ry{8k%X63?Dq&`rw4k z?*<%^gEqLVZnqo{uQ_6sl8nx$|ZgZhkbJ<^p+w2GHS0=eH{ntfBXU z>KXl9)6Ne518OtxyiG-2vpN?=v2-!;HoW5j&4mKH(Fc^c?Qp%zt7>Z-wXjQQyZ|VU z&h73ly0ulc8dR4`6zhu1)m2rrBQ$ST-_=%>z6;}}LNPC*>0&Pt8K2{3+cLwEwK@w! zw1KqD7N;(0ME&ibD5S$E2B9axr7P3%J|4tmGB--(O{TPgqK?*mW@YNB@K4|MzgZJdAK*_y#ob4*>3c(EA&_+y%M- literal 0 HcmV?d00001 diff --git a/elpa/cider-0.4.0/nrepl-client.el b/elpa/cider-0.4.0/nrepl-client.el new file mode 100644 index 000000000..f6800aaef --- /dev/null +++ b/elpa/cider-0.4.0/nrepl-client.el @@ -0,0 +1,888 @@ +;;; nrepl-client.el --- Client for Clojure nREPL + +;; Copyright © 2012-2013 Tim King, Phil Hagelberg +;; Copyright © 2013 Bozhidar Batsov, Hugo Duncan, Steve Purcell +;; +;; Author: Tim King +;; Phil Hagelberg +;; Bozhidar Batsov +;; Hugo Duncan +;; Steve Purcell + +;; 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 . + +;; This file is not part of GNU Emacs. + +;;; Commentary: + +;; Provides an Emacs Lisp client to connect to Clojure nREPL servers. + +;;; Code: +(require 'clojure-mode) +(require 'dash) +(require 'thingatpt) +(require 'etags) +(require 'ansi-color) +(require 'ewoc) +(require 'cl-lib) +(require 'cider-util) + + +(defgroup nrepl nil + "Interaction with the Clojure nREPL Server." + :prefix "nrepl-" + :group 'applications) + +(defcustom nrepl-buffer-name-separator " " + "Used in constructing the REPL buffer name. +The `nrepl-buffer-name-separator' separates `nrepl' from the project name." + :type '(string) + :group 'nrepl) + +(defcustom nrepl-buffer-name-show-port nil + "Show the connection port in the nrepl REPL buffer name, if set to t." + :type 'boolean + :group 'nrepl) + +(defcustom nrepl-connected-hook nil + "List of functions to call when connecting to the nREPL server." + :type 'hook + :group 'nrepl) + +(defcustom nrepl-disconnected-hook nil + "List of functions to call when disconnected from the nREPL server." + :type 'hook + :group 'nrepl) + +(defcustom nrepl-file-loaded-hook nil + "List of functions to call when a load file has completed." + :type 'hook + :group 'nrepl) + +(defcustom nrepl-host "127.0.0.1" + "The default hostname (or IP address) to connect to." + :type 'string + :group 'nrepl) + +(defcustom nrepl-port nil + "The default port to connect to." + :type 'string + :group 'nrepl) + +(defvar nrepl-repl-requires-sexp "(apply require '[[clojure.repl :refer (source apropos dir pst doc find-doc)] [clojure.java.javadoc :refer (javadoc)] [clojure.pprint :refer (pp pprint)]])" + "Things to require in the tooling session and the REPL buffer.") + +(defvar nrepl-connection-buffer nil) +(defvar nrepl-server-buffer nil) +(defvar nrepl-repl-buffer nil) +(defvar nrepl-endpoint nil) +(defvar nrepl-project-dir nil) + +(defconst nrepl-repl-buffer-name-template "*cider-repl%s*") +(defconst nrepl-connection-buffer-name-template "*nrepl-connection%s*") +(defconst nrepl-server-buffer-name-template "*nrepl-server%s*") + +(defcustom nrepl-hide-special-buffers nil + "Control the display of some special buffers in buffer switching commands. +When true some special buffers like the connection and the server +buffer will be hidden.") + +(defun nrepl-apply-hide-special-buffers (buffer-name) + "Apply a prefix to BUFFER-NAME that will hide the buffer." + (concat (if nrepl-hide-special-buffers " " "") buffer-name)) + +(defun nrepl-buffer-name (buffer-name-template) + "Generate a buffer name using BUFFER-NAME-TEMPLATE. + +The name will include the project name if available. The name will +also include the connection port if `nrepl-buffer-name-show-port' is true." + (generate-new-buffer-name + (let ((project-name (nrepl--project-name nrepl-project-dir)) + (nrepl-proj-port (cadr nrepl-endpoint))) + (format + buffer-name-template + (concat (if project-name + (format "%s%s" nrepl-buffer-name-separator project-name) "") + (if (and nrepl-proj-port nrepl-buffer-name-show-port) + (format ":%s" nrepl-proj-port) "")))))) + +(defun nrepl-connection-buffer-name () + "Return the name of the connection buffer." + (nrepl-apply-hide-special-buffers + (nrepl-buffer-name nrepl-connection-buffer-name-template))) + +(defun nrepl-server-buffer-name () + "Return the name of the server buffer." + (nrepl-apply-hide-special-buffers + (nrepl-buffer-name nrepl-server-buffer-name-template))) + +;; buffer local declarations +(defvar nrepl-session nil + "Current nREPL session id.") + +(defvar nrepl-tooling-session nil + "Current nREPL tooling session id. +To be used for tooling calls (i.e. completion, eldoc, etc)") + +(defvar nrepl-request-counter 0 + "Continuation serial number counter.") + +(defvar nrepl-pending-requests (make-hash-table :test 'equal)) + +(defvar nrepl-completed-requests (make-hash-table :test 'equal)) + +(defvar nrepl-buffer-ns "user" + "Current Clojure namespace of this buffer.") + +(defvar nrepl-sync-response nil + "Result of the last sync request.") + +(defvar nrepl-err-handler 'cider-default-err-handler + "Evaluation error handler.") + +(defvar nrepl-ops nil + "Available nREPL server ops (from describe).") + +(defun nrepl-make-variables-buffer-local (&rest variables) + "Make all VARIABLES buffer local." + (mapcar #'make-variable-buffer-local variables)) + +(nrepl-make-variables-buffer-local + 'nrepl-connection-buffer + 'nrepl-repl-buffer + 'nrepl-server-buffer + 'nrepl-endpoint + 'nrepl-project-dir + 'nrepl-ops + 'nrepl-session + 'nrepl-tooling-session + 'nrepl-request-counter + 'nrepl-pending-requests + 'nrepl-completed-requests + 'nrepl-done-requests + 'nrepl-buffer-ns + 'nrepl-sync-response) + +;;; Bencode +;;; Adapted from http://www.emacswiki.org/emacs-en/bencode.el +;;; and modified to work with utf-8 +(defun nrepl-bdecode-buffer () + "Decode a bencoded string in the current buffer starting at point." + (cond ((looking-at "i\\([0-9]+\\)e") + (goto-char (match-end 0)) + (string-to-number (match-string 1))) + ((looking-at "\\([0-9]+\\):") + (goto-char (match-end 0)) + (let ((start (point)) + (end (byte-to-position (+ (position-bytes (point)) + (string-to-number (match-string 1)))))) + (goto-char end) + (buffer-substring-no-properties start end))) + ((looking-at "l") + (goto-char (match-end 0)) + (let (result item) + (while (setq item (nrepl-bdecode-buffer)) + (setq result (cons item result))) + (nreverse result))) + ((looking-at "d") + (goto-char (match-end 0)) + (let (dict key item) + (while (setq item (nrepl-bdecode-buffer)) + (if key + (setq dict (cons (cons key item) dict) + key nil) + (unless (stringp item) + (error "Dictionary keys have to be strings: %s" item)) + (setq key item))) + (cons 'dict (nreverse dict)))) + ((looking-at "e") + (goto-char (match-end 0)) + nil) + (t + (error "Cannot decode object: %d" (point))))) + +(defun nrepl-decode (str) + "Decode bencoded STR." + (with-temp-buffer + (save-excursion + (insert str)) + (let ((result '())) + (while (not (eobp)) + (setq result (cons (nrepl-bdecode-buffer) result))) + (nreverse result)))) + +(defun nrepl-netstring (string) + "Encode STRING in bencode." + (let ((size (string-bytes string))) + (format "%s:%s" size string))) + +(defun nrepl-bencode (message) + "Encode with bencode MESSAGE." + (concat "d" (apply 'concat (mapcar 'nrepl-netstring message)) "e")) + +;;; Response handlers +(defmacro nrepl-dbind-response (response keys &rest body) + "Destructure an nREPL RESPONSE dict. +Bind the value of the provided KEYS and execute BODY." + `(let ,(loop for key in keys + collect `(,key (cdr (assoc ,(format "%s" key) ,response)))) + ,@body)) + +(put 'nrepl-dbind-response 'lisp-indent-function 2) + +(defun nrepl-make-response-handler + (buffer value-handler stdout-handler stderr-handler done-handler + &optional eval-error-handler) + "Make a response handler for BUFFER. +Uses the specified VALUE-HANDLER, STDOUT-HANDLER, STDERR-HANDLER, +DONE-HANDLER, and EVAL-ERROR-HANDLER as appropriate." + (lexical-let ((buffer buffer) + (value-handler value-handler) + (stdout-handler stdout-handler) + (stderr-handler stderr-handler) + (done-handler done-handler) + (eval-error-handler eval-error-handler)) + (lambda (response) + (nrepl-dbind-response response (value ns out err status id ex root-ex + session) + (cond (value + (with-current-buffer buffer + (if ns + (setq nrepl-buffer-ns ns))) + (if value-handler + (funcall value-handler buffer value))) + (out + (if stdout-handler + (funcall stdout-handler buffer out))) + (err + (if stderr-handler + (funcall stderr-handler buffer err))) + (status + (if (member "interrupted" status) + (message "Evaluation interrupted.")) + (if (member "eval-error" status) + (funcall (or eval-error-handler nrepl-err-handler) + buffer ex root-ex session)) + (if (member "namespace-not-found" status) + (message "Namespace not found.")) + (if (member "need-input" status) + (cider-need-input buffer)) + (if (member "done" status) + (progn + (puthash id (gethash id nrepl-pending-requests) nrepl-completed-requests) + (remhash id nrepl-pending-requests) + (if done-handler + (funcall done-handler buffer)))))))))) + +;;; communication +(defun nrepl-default-handler (response) + "Default handler which is invoked when no handler is found. +Handles message contained in RESPONSE." + (nrepl-dbind-response response (out value) + (cond + (out + (cider-repl-emit-interactive-output out))))) + +(defun nrepl-dispatch (response) + "Dispatch the RESPONSE to associated callback. + +First we check the list of pending requests for the callback to invoke +and afterwards we check the completed requests as well, since responses +could be received even for requests with status \"done\"." + (nrepl-log-event response) + (nrepl-dbind-response response (id) + (let ((callback (or (gethash id nrepl-pending-requests) + (gethash id nrepl-completed-requests)))) + (if callback + (funcall callback response) + (nrepl-default-handler response))))) + +(defun nrepl-net-decode () + "Decode the data in the current buffer. +Remove the processed data from the buffer if the decode successful." + (let* ((start (point-min)) + (end (point-max)) + (data (buffer-substring start end))) + (prog1 + (nrepl-decode data) + (delete-region start end)))) + +(defun nrepl-net-process-input (process) + "Handle all complete messages from PROCESS. +Assume that any error during decoding indicates an incomplete message." + (with-current-buffer (process-buffer process) + (let ((nrepl-connection-dispatch (current-buffer))) + (ignore-errors + (while (> (buffer-size) 1) + (let ((responses (nrepl-net-decode))) + (dolist (response responses) + (nrepl-dispatch response)))))))) + +(defun nrepl-net-filter (process string) + "Decode the message(s) from PROCESS contained in STRING and dispatch." + (with-current-buffer (process-buffer process) + (goto-char (point-max)) + (insert string)) + (nrepl-net-process-input process)) + +(defun nrepl-sentinel (process message) + "Handle sentinel events from PROCESS. +Display MESSAGE and if the process is closed kill the +process buffer and run the hook `nrepl-disconnected-hook'." + (message "nREPL connection closed: %s" message) + (if (equal (process-status process) 'closed) + (progn + (with-current-buffer (process-buffer process) + (when (get-buffer nrepl-repl-buffer) + (kill-buffer nrepl-repl-buffer)) + (kill-buffer (current-buffer))) + (run-hooks 'nrepl-disconnected-hook)))) + +(defun nrepl-write-message (process message) + "Send the PROCESS the MESSAGE." + (process-send-string process message)) + +;;; Log nREPL events + +(defcustom nrepl-log-events nil + "Log protocol events to the *nrepl-events* buffer." + :type 'boolean + :group 'nrepl) + +(defconst nrepl-event-buffer-name "*nrepl-events*" + "Event buffer for nREPL message logging.") + +(defconst nrepl-event-buffer-max-size 50000 + "Maximum size for the nREPL event buffer. +Defaults to 50000 characters, which should be an insignificant +memory burdon, while providing reasonable history.") + +(defconst nrepl-event-buffer-reduce-denominator 4 + "Divisor by which to reduce event buffer size. +When the maximum size for the nREPL event buffer is exceed, the +size of the buffer is reduced by one over this value. Defaults +to 4, so that 1/4 of the buffer is removed, which should ensure +the buffer's maximum is reasonably utilised, while limiting the +number of buffer shrinking operations.") + +(defun nrepl-log-event (msg) + "Log the given MSG to the buffer given by `nrepl-event-buffer-name'. +The default buffer name is *nrepl-events*." + (when nrepl-log-events + (with-current-buffer (nrepl-events-buffer) + (when (> (buffer-size) nrepl-event-buffer-max-size) + (goto-char (/ (buffer-size) nrepl-event-buffer-reduce-denominator)) + (re-search-forward "^(" nil t) + (delete-region (point-min) (- (point) 1))) + (goto-char (point-max)) + (pp msg (current-buffer))))) + +(defun nrepl-events-buffer () + "Return or create the buffer given by `nrepl-event-buffer-name'. +The default buffer name is *nrepl-events*." + (or (get-buffer nrepl-event-buffer-name) + (let ((buffer (get-buffer-create nrepl-event-buffer-name))) + (with-current-buffer buffer + (buffer-disable-undo) + (setq-local comment-start ";") + (setq-local comment-end "")) + buffer))) + +(defun nrepl-log-events (&optional disable) + "Turn on event logging to *nrepl-events*. +With a prefix argument DISABLE, turn it off." + (interactive "P") + (setq nrepl-log-events (not disable))) + + +;;; Connections + +;;; A connection is the communication between the nrepl.el client and an nrepl +;;; server. + +(defvar nrepl-connection-dispatch nil + "Bound to the connection a message was received on. +This is bound for the duration of the handling of that message") + +(defvar nrepl-connection-list nil + "A list of connections.") + + + +(defun nrepl-make-connection-buffer () + "Create an nREPL connection buffer." + (let ((buffer (generate-new-buffer (nrepl-connection-buffer-name)))) + (with-current-buffer buffer + (buffer-disable-undo) + (setq-local kill-buffer-query-functions nil)) + buffer)) + +(defun nrepl-current-connection-buffer () + "The connection to use for nREPL interaction." + (or nrepl-connection-dispatch + nrepl-connection-buffer + (car (nrepl-connection-buffers)) + (error "No nREPL connection"))) + +(defun nrepl-connection-buffers () + "Clean up dead buffers from the `nrepl-connection-list'. +Return the connection list." + (nrepl--connection-list-purge) + nrepl-connection-list) + +(defun nrepl--connection-list-purge () + "Clean up dead buffers from the `nrepl-connection-list'." + (setq nrepl-connection-list + (-remove (lambda (buffer) + (not (buffer-live-p (get-buffer buffer)))) + nrepl-connection-list))) + +(defun nrepl-make-repl-connection-default (connection-buffer) + "Make the nREPL CONNECTION-BUFFER the default connection. +Moves CONNECITON-BUFFER to the front of `nrepl-connection-list'." + (interactive (list nrepl-connection-buffer)) + (if connection-buffer + ;; maintain the connection list in most recently used order + (let ((buf-name (buffer-name (get-buffer connection-buffer)))) + (setq nrepl-connection-list + (cons buf-name (delq buf-name nrepl-connection-list))) + (nrepl--connections-refresh)) + (message "Not in an nREPL REPL buffer."))) + +(defun nrepl--close-connection-buffer (connection-buffer) + "Closes CONNECTION-BUFFER, removing it from `nrepl-connection-list'. +Also closes associated REPL and server buffers." + (let ((nrepl-connection-dispatch connection-buffer)) + (let ((buffer (get-buffer connection-buffer))) + (setq nrepl-connection-list + (delq (buffer-name buffer) nrepl-connection-list)) + (when (buffer-live-p buffer) + (dolist (buf-name `(,(buffer-local-value 'nrepl-repl-buffer buffer) + ,(buffer-local-value 'nrepl-server-buffer buffer) + ,buffer)) + (when buf-name + (cider--close-buffer buf-name))))))) + +;;; Connection browser +(defvar nrepl-connections-buffer-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "d" 'nrepl-connections-make-default) + (define-key map "g" 'nrepl-connection-browser) + (define-key map (kbd "C-k") 'nrepl-connections-close-connection) + (define-key map (kbd "RET") 'nrepl-connections-goto-connection) + map)) + +(define-derived-mode nrepl-connections-buffer-mode cider-popup-buffer-mode + "nREPL-Connections" + "nREPL Connections Buffer Mode. +\\{nrepl-connections-buffer-mode-map} +\\{cider-popup-buffer-mode-map}" + (setq-local truncate-lines t)) + +(defvar nrepl--connection-ewoc) +(defconst nrepl--connection-browser-buffer-name "*nrepl-connections*") + +(defun nrepl-connection-browser () + "Open a browser buffer for nREPL connections." + (interactive) + (let ((buffer (get-buffer nrepl--connection-browser-buffer-name))) + (if buffer + (progn + (nrepl--connections-refresh-buffer buffer) + (unless (get-buffer-window buffer) + (select-window (display-buffer buffer)))) + (nrepl--setup-connection-browser)))) + +(defun nrepl--connections-refresh () + "Refresh the connections buffer, if the buffer exists. +The connections buffer is determined by +`nrepl--connection-browser-buffer-name'" + (let ((buffer (get-buffer nrepl--connection-browser-buffer-name))) + (when buffer + (nrepl--connections-refresh-buffer buffer)))) + +(defun nrepl--connections-refresh-buffer (buffer) + "Refresh the connections BUFFER." + (nrepl--update-connections-display + (buffer-local-value 'nrepl--connection-ewoc buffer) + nrepl-connection-list)) + +(defun nrepl--setup-connection-browser () + "Create a browser buffer for nREPL connections." + (with-current-buffer (get-buffer-create nrepl--connection-browser-buffer-name) + (let ((ewoc (ewoc-create + 'nrepl--connection-pp + " Host Port Project\n"))) + (setq-local nrepl--connection-ewoc ewoc) + (nrepl--update-connections-display ewoc nrepl-connection-list) + (setq buffer-read-only t) + (nrepl-connections-buffer-mode) + (display-buffer (current-buffer))))) + +(defun nrepl--connection-pp (connection) + "Print an nREPL CONNECTION to the current buffer." + (let* ((buffer-read-only nil) + (buffer (get-buffer connection)) + (endpoint (buffer-local-value 'nrepl-endpoint buffer))) + (insert + (format "%s %-16s %5s %s" + (if (equal connection (car nrepl-connection-list)) "*" " ") + (car endpoint) + (prin1-to-string (cadr endpoint)) + (or (nrepl--project-name + (buffer-local-value 'nrepl-project-dir buffer)) + ""))))) + +(defun nrepl--project-name (path) + "Extracts a project name from PATH, possibly nil. +The project name is the final component of PATH if not nil." + (when path + (file-name-nondirectory (directory-file-name path)))) + +(defun nrepl--update-connections-display (ewoc connections) + "Update the connections EWOC to show CONNECTIONS." + (ewoc-filter ewoc (lambda (n) (member n connections))) + (let ((existing)) + (ewoc-map (lambda (n) (setq existing (cons n existing))) ewoc) + (let ((added (-difference connections existing))) + (mapc (apply-partially 'ewoc-enter-last ewoc) added) + (save-excursion (ewoc-refresh ewoc))))) + +(defun nrepl--ewoc-apply-at-point (f) + "Apply function F to the ewoc node at point. +F is a function of two arguments, the ewoc and the data at point." + (let* ((ewoc nrepl--connection-ewoc) + (node (and ewoc (ewoc-locate ewoc)))) + (when node + (funcall f ewoc (ewoc-data node))))) + +(defun nrepl-connections-make-default () + "Make default the connection at point in the connection browser." + (interactive) + (save-excursion + (nrepl--ewoc-apply-at-point #'nrepl--connections-make-default))) + +(defun nrepl--connections-make-default (ewoc data) + "Make the connection in EWOC specified by DATA default. +Refreshes EWOC." + (interactive) + (nrepl-make-repl-connection-default data) + (ewoc-refresh ewoc)) + +(defun nrepl-connections-close-connection () + "Close connection at point in the connection browser." + (interactive) + (nrepl--ewoc-apply-at-point #'nrepl--connections-close-connection)) + +(defun nrepl--connections-close-connection (ewoc data) + "Close the connection in EWOC specified by DATA." + (nrepl-close (get-buffer data)) + (nrepl--update-connections-display ewoc nrepl-connection-list)) + +(defun nrepl-connections-goto-connection () + "Goto connection at point in the connection browser." + (interactive) + (nrepl--ewoc-apply-at-point #'nrepl--connections-goto-connection)) + +(defun nrepl--connections-goto-connection (ewoc data) + "Goto the REPL for the connection in EWOC specified by DATA." + (let ((buffer (buffer-local-value 'nrepl-repl-buffer (get-buffer data)))) + (when buffer + (select-window (display-buffer buffer))))) + +;;; server messages + +(defun nrepl-current-session () + "Return the current session." + (with-current-buffer (nrepl-current-connection-buffer) + nrepl-session)) + +(defun nrepl-current-tooling-session () + "Return the current tooling session." + (with-current-buffer (nrepl-current-connection-buffer) + nrepl-tooling-session)) + +(defun nrepl-next-request-id () + "Return the next request id." + (with-current-buffer (nrepl-current-connection-buffer) + (number-to-string (incf nrepl-request-counter)))) + +(defun nrepl-send-request (request callback) + "Send REQUEST and register response handler CALLBACK." + (let* ((request-id (nrepl-next-request-id)) + (request (append (list "id" request-id) request)) + (message (nrepl-bencode request))) + (nrepl-log-event request) + (puthash request-id callback nrepl-pending-requests) + (nrepl-write-message (nrepl-current-connection-buffer) message))) + +(defun nrepl-create-client-session (callback) + "Sent a request to create a new client session. +Response will be handled by CALLBACK." + (nrepl-send-request '("op" "clone") + callback)) + +(defun nrepl-send-stdin (input callback) + "Send a stdin message with INPUT. +Register CALLBACK as the response handler." + (nrepl-send-request (list "op" "stdin" + "stdin" input + "session" (nrepl-current-session)) + callback)) + +(defun nrepl-send-interrupt (pending-request-id callback) + "Send an interrupt message for PENDING-REQUEST-ID. +Register CALLBACK as the response handler." + (nrepl-send-request (list "op" "interrupt" + "session" (nrepl-current-session) + "interrupt-id" pending-request-id) + callback)) + +(defun nrepl-eval-request (input &optional ns session) + "Send a request to eval INPUT. +If NS is non-nil, include it in the request. +Use SESSION if it is non-nil, otherwise use the current session." + (append (if ns (list "ns" ns)) + (list + "op" "eval" + "session" (or session (nrepl-current-session)) + "code" input))) + +(defun nrepl-send-string (input callback &optional ns session) + "Send the request INPUT and register the CALLBACK as the response handler. +See command `nrepl-eval-request' for details on how NS and SESSION are processed." + (nrepl-send-request (nrepl-eval-request input ns session) callback)) + +(defun nrepl-sync-request-handler (buffer) + "Make a synchronous request handler for BUFFER." + (nrepl-make-response-handler buffer + (lambda (buffer value) + (setq nrepl-sync-response + (plist-put nrepl-sync-response :value value))) + (lambda (buffer out) + (let ((so-far (plist-get nrepl-sync-response :stdout))) + (setq nrepl-sync-response + (plist-put nrepl-sync-response + :stdout (concat so-far out))))) + (lambda (buffer err) + (let ((so-far (plist-get nrepl-sync-response :stderr))) + (setq nrepl-sync-response + (plist-put nrepl-sync-response + :stderr (concat so-far err))))) + (lambda (buffer) + (setq nrepl-sync-response + (plist-put nrepl-sync-response :done t))))) + +(defun nrepl-send-request-sync (request) + "Send REQUEST to the backend synchronously (discouraged). +The result is a plist with keys :value, :stderr and :stdout." + (with-current-buffer (nrepl-current-connection-buffer) + (setq nrepl-sync-response nil) + (nrepl-send-request request (nrepl-sync-request-handler (current-buffer))) + (while (or (null nrepl-sync-response) + (null (plist-get nrepl-sync-response :done))) + (accept-process-output nil 0.005)) + nrepl-sync-response)) + +(defun nrepl-send-string-sync (input &optional ns session) + "Send the INPUT to the backend synchronously. +See command `nrepl-eval-request' for details about how NS and SESSION +are processed." + (nrepl-send-request-sync (nrepl-eval-request input ns session))) + +;;; server +(defun nrepl-server-filter (process output) + "Process nREPL server output from PROCESS contained in OUTPUT." + (with-current-buffer (process-buffer process) + (save-excursion + (goto-char (point-max)) + (insert output))) + (when (string-match "nREPL server started on port \\([0-9]+\\)" output) + (let ((port (string-to-number (match-string 1 output)))) + (message (format "nREPL server started on %s" port)) + (with-current-buffer (process-buffer process) + (let ((nrepl-process (nrepl-connect "localhost" port))) + (setq nrepl-connection-buffer + (buffer-name (process-buffer nrepl-process))) + (with-current-buffer (process-buffer nrepl-process) + (setq nrepl-server-buffer + (buffer-name (process-buffer process)) + nrepl-project-dir + (buffer-local-value + 'nrepl-project-dir (process-buffer process))))))))) + +(defun nrepl-server-sentinel (process event) + "Handle nREPL server PROCESS EVENT." + (let* ((b (process-buffer process)) + (connection-buffer (buffer-local-value 'nrepl-connection-buffer b)) + (problem (if (and b (buffer-live-p b)) + (with-current-buffer b + (buffer-substring (point-min) (point-max))) + ""))) + (when b + (kill-buffer b)) + (cond + ((string-match "^killed" event) + nil) + ((string-match "^hangup" event) + (when connection-buffer + (nrepl-close connection-buffer))) + ((string-match "Wrong number of arguments to repl task" problem) + (error "Leiningen 2.x is required by nREPL.el")) + (t (error "Could not start nREPL server: %s" problem))))) + +(defun nrepl-current-dir () + "Return the directory of the current buffer." + (let ((file-name (buffer-file-name (current-buffer)))) + (or (when file-name + (file-name-directory file-name)) + list-buffers-directory))) + +(defun nrepl-project-directory-for (dir-name) + "Return the project directory for the specified DIR-NAME." + (when dir-name + (locate-dominating-file dir-name "project.clj"))) + +(defun nrepl-check-for-repl-buffer (endpoint project-directory) + "Check whether a matching connection buffer already exists. +Looks for buffers where `nrepl-endpoint' matches ENDPOINT, +or `nrepl-project-dir' matches PROJECT-DIRECTORY. +If so ask the user for confirmation." + (if (cl-find-if + (lambda (buffer) + (let ((buffer (get-buffer buffer))) + (or (and endpoint + (equal endpoint + (buffer-local-value 'nrepl-endpoint buffer))) + (and project-directory + (equal project-directory + (buffer-local-value 'nrepl-project-dir buffer)))))) + (nrepl-connection-buffers)) + (y-or-n-p + "An nREPL connection buffer already exists. Do you really want to create a new one? ") + t)) + +(defun nrepl-close (connection-buffer) + "Close the nrepl connection for CONNECTION-BUFFER." + (interactive (list (nrepl-current-connection-buffer))) + (nrepl--close-connection-buffer connection-buffer) + (run-hooks 'nrepl-disconnected-hook) + (nrepl--connections-refresh)) + +;;; client +(defun nrepl-op-supported-p (op) + "Return t iff the given operation OP is supported by nREPL server." + (with-current-buffer (nrepl-current-connection-buffer) + (if (and nrepl-ops (assoc op nrepl-ops)) + t))) + +(defun nrepl-describe-handler (process-buffer) + "Return a handler to describe into PROCESS-BUFFER." + (lexical-let ((buffer process-buffer)) + (lambda (response) + (nrepl-dbind-response response (ops) + (cond (ops + (with-current-buffer buffer + (setq nrepl-ops ops)))))))) + +(defun nrepl-describe-session (process) + "Peform describe for the given server PROCESS." + (let ((buffer (process-buffer process))) + (nrepl-send-request (list "op" "describe") + (nrepl-describe-handler buffer)))) + +(defun nrepl-setup-default-namespaces (process) + "Setup default namespaces for PROCESS." + (let ((buffer (process-buffer process))) + (with-current-buffer buffer + (nrepl-send-string + nrepl-repl-requires-sexp + (nrepl-make-response-handler + buffer nil + (lambda (buffer out) (message out)) + (lambda (buffer err) (message err)) + nil) + nrepl-buffer-ns + nrepl-tooling-session)))) + +(defun nrepl-new-tooling-session-handler (process) + "Create a new tooling session handler for PROCESS." + (lexical-let ((process process)) + (lambda (response) + (nrepl-dbind-response response (id new-session) + (cond (new-session + (with-current-buffer (process-buffer process) + (setq nrepl-tooling-session new-session) + (remhash id nrepl-pending-requests) + (nrepl-setup-default-namespaces process)))))))) + +(defun nrepl-new-session-handler (process no-repl-p) + "Create a new session handler for PROCESS. +When NO-REPL-P is truthy, suppress creation of a REPL buffer." + (lexical-let ((process process) + (no-repl-p no-repl-p)) + (lambda (response) + (nrepl-dbind-response response (id new-session) + (remhash id nrepl-pending-requests) + (cond (new-session + (lexical-let ((connection-buffer (process-buffer process))) + (setq nrepl-session new-session + nrepl-connection-buffer connection-buffer) + (unless no-repl-p + (cider-make-repl process) + (nrepl-make-repl-connection-default connection-buffer)) + (run-hooks 'nrepl-connected-hook)))))))) + +(defun nrepl-init-client-sessions (process no-repl-p) + "Initialize client sessions for PROCESS. +When NO-REPL-P is truthy, suppress creation of a REPL buffer." + (nrepl-create-client-session (nrepl-new-session-handler process no-repl-p)) + (nrepl-create-client-session (nrepl-new-tooling-session-handler process))) + +(defun nrepl-connect (host port &optional no-repl-p) + "Connect to a running nREPL server running on HOST and PORT. +When NO-REPL-P is truthy, suppress creation of a REPL buffer." + (message "Connecting to nREPL on %s:%s..." host port) + (let* ((nrepl-endpoint `(,host ,port)) + (process (open-network-stream "nrepl" + (nrepl-make-connection-buffer) host + port))) + (set-process-filter process 'nrepl-net-filter) + (set-process-sentinel process 'nrepl-sentinel) + (set-process-coding-system process 'utf-8-unix 'utf-8-unix) + (with-current-buffer (process-buffer process) + (setq nrepl-endpoint `(,host ,port))) + (let ((nrepl-connection-dispatch (buffer-name (process-buffer process)))) + (nrepl-init-client-sessions process no-repl-p) + (nrepl-describe-session process)) + process)) + +(defun nrepl--port-from-file (file) + "Attempts to read port from a file named by FILE." + (let* ((dir (nrepl-project-directory-for (nrepl-current-dir))) + (f (expand-file-name file dir))) + (when (file-exists-p f) + (with-temp-buffer + (insert-file-contents f) + (buffer-string))))) + +(defun nrepl-default-port () + "Attempt to read port from .nrepl-port or target/repl-port. +Falls back to `nrepl-port' if not found." + (or (nrepl--port-from-file ".nrepl-port") + (nrepl--port-from-file "target/repl-port") + nrepl-port)) + +(provide 'nrepl-client) +;;; nrepl-client.el ends here diff --git a/elpa/cider-0.4.0/nrepl-client.elc b/elpa/cider-0.4.0/nrepl-client.elc new file mode 100644 index 0000000000000000000000000000000000000000..5d3ffa9e3e27a6cffbd3ed17df3184a1cfd97f57 GIT binary patch literal 34049 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 QbgR=Wxxvma#C){(Kd~zAV5LFYb zQ9K}PQrdUm8GcCjSDj$Bh2{O@=HYR@gKD|jO#F2aP%R2jw!WkCgGQ;SLmibV$@N%j z&w2=fI2B8^R@J|W{;g5uCR)qzGPc1_3en0C)n-IbwX;nvpmX5+WIOu{lK`U1rsDV3 z#_K#oqzLB1*jWw6>zIP&CN88JVgfWq_IlS@?Nqh_uumXkClv6I>f%8%Ts(g} z9FL$|45;OlaWTmw8;Bk>GMosU$NxnBEE9n+I7&5afR?%ORgkllSoMquj(gn=ViftS2j=_5mi>!P(g7@cC{eC9&OH8CLmxKF@vw Dz*Nvn literal 0 HcmV?d00001 diff --git a/elpa/concurrent-0.3.2/concurrent.el b/elpa/concurrent-0.3.2/concurrent.el new file mode 100644 index 000000000..c58000fd2 --- /dev/null +++ b/elpa/concurrent-0.3.2/concurrent.el @@ -0,0 +1,505 @@ +;;; concurrent.el --- Concurrent utility functions for emacs lisp + +;; Copyright (C) 2010, 2011, 2012 SAKURAI Masashi + +;; Author: SAKURAI Masashi +;; Version: 0.3.2 +;; X-Original-Version: 0.3.1 +;; Keywords: deferred, async, concurrent +;; Package-Requires: ((deferred "0.3.1")) +;; URL: https://github.com/kiwanami/emacs-deferred/blob/master/README-concurrent.markdown + +;; 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 . + +;;; Commentary: + +;; 'concurrent.el' is a higher level library for concurrent tasks +;; based on 'deferred.el'. This library has following features: +;; +;; - Generator +;; - Green thread +;; - Semaphore +;; - Dataflow +;; - Signal/Channel + +(eval-when-compile + (require 'cl)) + +(require 'deferred) + +(defvar cc:version nil "version number") +(setq cc:version "0.3") + +;;; Code: + + + +(defmacro cc:aif (test-form then-form &rest else-forms) + (declare (debug (form form &rest form))) + `(let ((it ,test-form)) + (if it ,then-form ,@else-forms))) +(put 'cc:aif 'lisp-indent-function 2) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Generator + +(defun cc:generator-replace-yield (tree) + "[internal] Replace `yield' symbols to calling a function in TREE." + (let (ret) + (loop for i in tree + do (cond + ((eq i 'yield) + (push 'funcall ret) + (push i ret)) + ((listp i) + (push (cc:generator-replace-yield i) ret)) + (t + (push i ret)))) + (nreverse ret))) + +(defun cc:generator-line (line) + "[internal] Return a macro expansion to execute the sexp LINE +asynchronously." + (cond + ;; function object + ((functionp line) + `(setq ,chain (deferred:nextc ,chain ,line))) + ;; while loop form + ((eq 'while (car line)) + (let ((condition (cadr line)) + (body (cddr line))) + `(setq ,chain + (deferred:nextc ,chain + (deferred:lambda (x) + (if ,condition + (deferred:nextc + (progn + ,@(cc:generator-replace-yield body)) self))))))) + ;; statement + (t + `(setq ,chain + (deferred:nextc ,chain + (deferred:lambda (x) ,(cc:generator-replace-yield line))))))) + +(defmacro cc:generator (callback &rest body) + "Create a generator object. If BODY has `yield' symbols, it +means calling callback function CALLBACK." + (let ((chain (gensym)) + (cc (gensym)) + (waiter (gensym))) + `(lexical-let* + (,chain + (,cc ,callback) + (,waiter (deferred:new)) + (yield (lambda (x) (funcall ,cc x) ,waiter))) + (setq ,chain ,waiter) + ,@(loop for i in body + collect + (cc:generator-line i)) + (lambda () (deferred:callback ,waiter))))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Thread + +(defun cc:thread-line (wait-time chain line) + "[internal] Return a macro expansion to execute the sexp LINE asynchronously. +WAIT-TIME is an interval time between tasks. +CHAIN is the previous deferred task." + (cond + ;; function object + ((functionp line) + `(setq ,chain (deferred:nextc ,chain ,line))) + ;; while loop form + ((eq 'while (car line)) + (let ((condition (cadr line)) + (body (cddr line)) + (retsym (gensym))) + `(setq ,chain + (deferred:nextc ,chain + (deferred:lambda (x) + (if ,condition + (deferred:nextc + (let ((,retsym (progn ,@body))) + (if (deferred-p ,retsym) ,retsym + (deferred:wait ,wait-time))) + self))))))) + ;; statement + (t + `(setq ,chain + (deferred:nextc ,chain + (lambda (x) ,line)))))) + +(defmacro cc:thread (wait-time-msec &rest body) + "Return a thread object." + (let ((chain (gensym)) + (dstart (gensym))) + `(lexical-let* + (,chain + (,dstart (deferred:new))) + (setq ,chain ,dstart) + ,@(loop for i in body + collect + (cc:thread-line wait-time-msec chain i)) + (deferred:callback ,dstart)))) +(put 'cc:thread 'lisp-indent-function 1) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Semaphore + +(defstruct cc:semaphore max-permits permits waiting-deferreds) + +(defun cc:semaphore-create(permits-num) + "Return a semaphore object with PERMITS-NUM permissions." + (make-cc:semaphore :max-permits permits-num :permits permits-num)) + +(defun cc:semaphore-acquire(semaphore) + "Acquire an execution permission and return deferred object to chain. +If this semaphore object has permissions, the subsequent deferred +task is executed immediately. If this semaphore object has no +permissions, the subsequent deferred task is blocked. After the +permission is returned, the task is executed." + (cond + ((< 0 (cc:semaphore-permits semaphore)) + (decf (cc:semaphore-permits semaphore)) + (deferred:succeed)) + (t + (let ((d (deferred:new))) + (push d (cc:semaphore-waiting-deferreds semaphore)) + d)))) + +(defun cc:semaphore-release(semaphore) + "Release an execution permission. The programmer is responsible to return the permissions." + (when (<= (cc:semaphore-max-permits semaphore) + (cc:semaphore-permits semaphore)) + (error "Too many calling semaphore-release. [max:%s <= permits:%s]" + (cc:semaphore-max-permits semaphore) + (cc:semaphore-permits semaphore))) + (let ((waiting-deferreds + (cc:semaphore-waiting-deferreds semaphore))) + (cond + (waiting-deferreds + (let* ((d (car (last waiting-deferreds)))) + (setf (cc:semaphore-waiting-deferreds semaphore) + (nbutlast waiting-deferreds)) + (deferred:callback-post d))) + (t + (incf (cc:semaphore-permits semaphore))))) + semaphore) + +(defun cc:semaphore-with (semaphore body-func &optional error-func) + "Execute the task BODY-FUNC asynchronously with the semaphore block." + (lexical-let ((semaphore semaphore)) + (deferred:try + (deferred:nextc (cc:semaphore-acquire semaphore) body-func) + :catch + error-func + :finally + (lambda (x) (cc:semaphore-release semaphore))))) +(put 'cc:semaphore-with 'lisp-indent-function 1) + +(defun cc:semaphore-release-all (semaphore) + "Release all permissions for resetting the semaphore object. +If the semaphore object has some blocked tasks, this function +return a list of the tasks and clear the list of the blocked +tasks in the semaphore object." + (setf (cc:semaphore-permits semaphore) + (cc:semaphore-max-permits semaphore)) + (let ((ds (cc:semaphore-waiting-deferreds semaphore))) + (when ds + (setf (cc:semaphore-waiting-deferreds semaphore) nil)) + ds)) + +(defun cc:semaphore-interrupt-all (semaphore) + "Clear the list of the blocked tasks in the semaphore and return a deferred object to chain. +This function is used for the interruption cases." + (when (cc:semaphore-waiting-deferreds semaphore) + (setf (cc:semaphore-waiting-deferreds semaphore) nil) + (setf (cc:semaphore-permits semaphore) 0)) + (cc:semaphore-acquire semaphore)) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Signal / Channel + +(defun cc:signal-channel (&optional name parent-channel) + "Create a channel. +NAME is a channel name for debug. +PARENT-CHANNEL is an upstream channel. The observers of this channel can receive the upstream signals. +In the case of using the function `cc:signal-send', the observers of the upstream channel can not receive the signals of this channel. The function `cc:signal-send-global' can send a signal to the upstream channels from the downstream channels." + (lexical-let + ((ch (cons + (or name (format "signal%s" (deferred:uid))) ; name for debug + (cons + parent-channel ; parent-channel + nil)))) ; observers + (when parent-channel + (cc:signal-connect + parent-channel + t (lambda (event) + (destructuring-bind + (event-name event-args) event + (apply 'cc:signal-send + ch event-name event-args))))) + ch)) + +(defmacro cc:signal-name (ch) + "[internal] Return signal name." + `(car ,ch)) + +(defmacro cc:signal-parent-channel (ch) + "[internal] Return parent channel object." + `(cadr ,ch)) + +(defmacro cc:signal-observers (ch) + "[internal] Return observers." + `(cddr ,ch)) + +(defun cc:signal-connect (channel event-sym &optional callback) + "Append an observer for EVENT-SYM of CHANNEL and return a deferred object. +If EVENT-SYM is `t', the observer receives all signals of the channel. +If CALLBACK function is given, the deferred object executes the +CALLBACK function asynchronously. One can connect subsequent +tasks to the returned deferred object." + (let ((d (if callback + (deferred:new callback) + (deferred:new)))) + (push (cons event-sym d) + (cc:signal-observers channel)) + d)) + +(defun cc:signal-send (channel event-sym &rest args) + "Send a signal to CHANNEL. If ARGS values are given, observers can get the values by following code: (lambda (event) (destructuring-bind (event-sym (args)) event ... )). " + (let ((observers (cc:signal-observers channel)) + (event (list event-sym args))) + (loop for i in observers + for name = (car i) + for d = (cdr i) + if (or (eq event-sym name) (eq t name)) + do (deferred:callback-post d event)))) + +(defun cc:signal-send-global (channel event-sym &rest args) + "Send a signal to the most upstream channel. " + (cc:aif (cc:signal-parent-channel channel) + (apply 'cc:signal-send-global it event-sym args) + (apply 'cc:signal-send channel event-sym args))) + + +(defun cc:signal-disconnect (channel deferred) + "Remove the observer object DEFERRED from CHANNEL and return +the removed deferred object. " + (let ((observers (cc:signal-observers channel)) deleted) + (setf + (cc:signal-observers channel) ; place + (loop for i in observers + for d = (cdr i) + unless (eq d deferred) + collect i + else + do (push i deleted))) + deleted)) + +(defun cc:signal-disconnect-all (channel) + "Remove all observers." + (setf + (cc:signal-observers channel) ; place + nil)) + + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Dataflow + +;; Dataflow variable entry +(defstruct cc:dataflow key (value 'cc:dataflow-undefine) deferred-list) + +(defun cc:dataflow-undefine-p (obj) + "[internal] If the variable entry is not bound, return `t'." + (eq 'cc:dataflow-undefine (cc:dataflow-value obj))) + +(defun cc:dataflow-environment (&optional parent-env test-func channel) + "Create a dataflow environment. +PARENT-ENV is the default environment. If this environment doesn't have the entry A and the parent one has the entry A, this environment can return the entry A. One can override the entry, setting another entry A to this environment. +TEST-FUNC is a test function that compares the entry keys. The default function is `equal'. +CHANNEL is a channel object that sends signals of variable events. Observers can receive following signals: +-get-first : the fist referrer is waiting for binding, +-get-waiting : another referrer is waiting for binding, +-set : a value is bound, +-get : returned a bound value, +-clear : cleared one entry, +-clear-all : cleared all entries. +" + (let ((this (list parent-env + (or test-func 'equal) + (or channel + (cc:signal-channel + 'dataflow + (and parent-env + (cc:dataflow-channel parent-env))))))) + (cc:dataflow-init-connect this) + this)) + +(defun cc:dataflow-init-connect (df) + "[internal] Initialize the channel object." + (lexical-let ((df df)) + (cc:dataflow-connect + df 'set + (lambda (args) + (destructuring-bind (event (key)) args + (let* ((obj (cc:dataflow-get-object-for-value df key)) + (value (and obj (cc:dataflow-value obj)))) + (when obj + (loop for i in (cc:aif (cc:dataflow-get-object-for-deferreds df key) + (cc:dataflow-deferred-list it) nil) + do (deferred:callback-post i value)) + (setf (cc:dataflow-deferred-list obj) nil)))))))) + +(defmacro cc:dataflow-parent-environment (df) + "[internal] Return the parent environment." + `(car ,df)) + +(defmacro cc:dataflow-test (df) + "[internal] Return the test function." + `(cadr ,df)) + +(defmacro cc:dataflow-channel (df) + "[internal] Return the channel object." + `(caddr ,df)) + +(defmacro cc:dataflow-list (df) + "[internal] Return the list of deferred object which are waiting for value binding." + `(cdddr ,df)) + +(defun cc:dataflow-get-object-for-value (df key) + "[internal] Return an entry object that is indicated by KEY. +If the environment DF doesn't have the entry and the parent one has the entry, this function returns the entry of the parent environment. This function doesn't affect the waiting list." + (or + (loop for i in (cc:dataflow-list df) + with test = (cc:dataflow-test df) + if (and (funcall test key (cc:dataflow-key i)) + (not (cc:dataflow-undefine-p i))) + return i) + (deferred:aand + (cc:dataflow-parent-environment df) + (cc:dataflow-get-object-for-value it key)))) + +(defun cc:dataflow-get-object-for-deferreds (df key) + "[internal] Return a list of the deferred objects those are waiting for value binding. +This function doesn't affect the waiting list and doesn't refer the parent environment." + (loop for i in (cc:dataflow-list df) + with test = (cc:dataflow-test df) + if (funcall test key (cc:dataflow-key i)) + return i)) + +(defun cc:dataflow-connect (df event-sym &optional callback) + "Append an observer for EVENT-SYM of the channel of DF and return a deferred object. +See the docstring of `cc:dataflow-environment' for details." + (cc:signal-connect (cc:dataflow-channel df) event-sym callback)) + +(defun cc:dataflow-signal (df event &optional arg) + "[internal] Send a signal to the channel of DF." + (cc:signal-send (cc:dataflow-channel df) event arg)) + +(defun cc:dataflow-get (df key) + "Return a deferred object that can refer the value which is indicated by KEY. +If DF has the entry that bound value, the subsequent deferred task is executed immediately. +If not, the task is deferred till a value is bound." + (let ((obj (cc:dataflow-get-object-for-value df key))) + (cond + ((and obj (cc:dataflow-value obj)) + (cc:dataflow-signal df 'get key) + (deferred:succeed (cc:dataflow-value obj))) + (t + (setq obj (cc:dataflow-get-object-for-deferreds df key)) + (unless obj + (setq obj (make-cc:dataflow :key key)) + (push obj (cc:dataflow-list df)) + (cc:dataflow-signal df 'get-first key)) + (let ((d (deferred:new))) + (push d (cc:dataflow-deferred-list obj)) + (cc:dataflow-signal df 'get-waiting key) + d))))) + +(defun cc:dataflow-get-sync (df key) + "Return the value which is indicated by KEY synchronously. +If the environment DF doesn't have an entry of KEY, this function returns nil." + (let ((obj (cc:dataflow-get-object-for-value df key))) + (and obj (cc:dataflow-value obj)))) + +(defun cc:dataflow-set (df key value) + "Bind the VALUE to KEY in the environment DF. +If DF already has the bound entry of KEY, this function throws an error signal. +VALUE can be nil as a value." + (let ((obj (cc:dataflow-get-object-for-deferreds df key))) + (cond + ((and obj (not (cc:dataflow-undefine-p obj))) + ;; overwrite! + (error "Can not set a dataflow value. The key [%s] has already had a value. NEW:[%s] OLD:[%s]" key value (cc:dataflow-value obj))) + (obj + (setf (cc:dataflow-value obj) value)) + (t + ;; just value arrived + (push (make-cc:dataflow :key key :value value) + (cc:dataflow-list df)))) + ;; value arrived and start deferred objects + (cc:dataflow-signal df 'set key) + value)) + +(defun cc:dataflow-clear (df key) + "Clear the entry which is indicated by KEY. +This function does nothing for the waiting deferred objects." + (cc:dataflow-signal df 'clear key) + (setf (cc:dataflow-list df) + (loop for i in (cc:dataflow-list df) + with test = (cc:dataflow-test df) + unless (funcall test key (cc:dataflow-key i)) + collect i))) + +(defun cc:dataflow-get-avalable-pairs (df) + "Return an available key-value alist in the environment DF and the parent ones." + (append + (loop for i in (cc:dataflow-list df) + for key = (cc:dataflow-key i) + for val = (cc:dataflow-value i) + unless (cc:dataflow-undefine-p i) collect (cons key val)) + (deferred:aand + (cc:dataflow-parent-environment df) + (cc:dataflow-get-avalable-pairs it)))) + +(defun cc:dataflow-get-waiting-keys (df) + "Return a list of keys which have waiting deferred objects in the environment DF and the parent ones." + (append + (loop for i in (cc:dataflow-list df) + for key = (cc:dataflow-key i) + for val = (cc:dataflow-value i) + if (cc:dataflow-undefine-p i) collect key) + (deferred:aand + (cc:dataflow-parent-environment df) + (cc:dataflow-get-waiting-keys it)))) + +(defun cc:dataflow-clear-all (df) + "Clear all entries in the environment DF. +This function does nothing for the waiting deferred objects." + (cc:dataflow-signal df 'clear-all) + (setf (cc:dataflow-list df) nil)) + + +(provide 'concurrent) +;;; concurrent.el ends here + diff --git a/elpa/concurrent-0.3.2/concurrent.elc b/elpa/concurrent-0.3.2/concurrent.elc new file mode 100644 index 0000000000000000000000000000000000000000..978f2400369e8dfa0a5943796bbee3d107791c8b GIT binary patch literal 28709 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 literal 0 HcmV?d00001 diff --git a/elpa/ctable-0.1.2/ctable-autoloads.el b/elpa/ctable-0.1.2/ctable-autoloads.el new file mode 100644 index 000000000..2261ab7e5 --- /dev/null +++ b/elpa/ctable-0.1.2/ctable-autoloads.el @@ -0,0 +1,18 @@ +;;; ctable-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads nil nil ("ctable-pkg.el" "ctable.el") (21566 24342 +;;;;;; 564218 830000)) + +;;;*** + +(provide 'ctable-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; ctable-autoloads.el ends here diff --git a/elpa/ctable-0.1.2/ctable-pkg.el b/elpa/ctable-0.1.2/ctable-pkg.el new file mode 100644 index 000000000..1e55082db --- /dev/null +++ b/elpa/ctable-0.1.2/ctable-pkg.el @@ -0,0 +1 @@ +(define-package "ctable" "0.1.2" "Table component for Emacs Lisp" (quote nil)) diff --git a/elpa/ctable-0.1.2/ctable-pkg.elc b/elpa/ctable-0.1.2/ctable-pkg.elc new file mode 100644 index 0000000000000000000000000000000000000000..1d21a8340f2202297fae2f14731477f89aa2756e GIT binary patch literal 638 zcmbtRO>e?54CUNEu&c#slV}PBG(Iky5CWHNS!K4huE)QC~VTi5nuA* z=l5*C<$Ak%==FNZa=C<+ts8Af!Ttm_hDxLVRCGjH1#&O!%4ym%kHz^WS}#hcmEaax zl909r%kUAa-(-N%6o$`>$!sy6K|UN!I{v~%P!Sa%t87i#jYcM@M(Ksh$TXPAfO|vf zP>e+W`)CfOAk)!lhV>Z^U*x=w;`v03Mc(C(I#hthfNg@V^*4qH@FMAwyGr{@AFU@3 z>cm)U3Cc-%c60a>9# z8CU2BojkGvZ$To%p1@fACvqLe1EDjT9E2(Y^YKMD+H_Z(8@M-;BzaU+Xr{D5dBBpO if3d0${m!g-?#|Z5mDG)8;sAwpSGTs>H+^7jo{}FDy1?!L literal 0 HcmV?d00001 diff --git a/elpa/ctable-0.1.2/ctable.el b/elpa/ctable-0.1.2/ctable.el new file mode 100644 index 000000000..fc636a276 --- /dev/null +++ b/elpa/ctable-0.1.2/ctable.el @@ -0,0 +1,1896 @@ +;;; ctable.el --- Table component for Emacs Lisp + +;; Copyright (C) 2011, 2012, 2013, 2014 SAKURAI Masashi + +;; Author: SAKURAI Masashi +;; URL: https://github.com/kiwanami/emacs-ctable +;; Version: 0.1.2 +;; X-Original-Version: 0.1.2 +;; Keywords: table + +;; 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 . + +;;; Commentary: + +;; This program is a table component for Emacs Lisp. +;; Other programs can use this table component for the application UI. + +;;; Installation: + +;; Place this program in your load path and add following code. + +;; (require 'ctable) + +;;; Usage: + +;; Executing the command `ctbl:open-table-buffer', switch to the table buffer. + +;; Table data which are shown in the table view, are collected +;; by the `ctbl:model' objects. See the function `ctbl:demo' for example. +;; See the README document for the details. + +;;; Code: + +(eval-when-compile (require 'cl)) + + +;;; Models and Parameters + +(defstruct ctbl:model + "Table model structure + +data : Table data as a list of rows. A row contains a list of columns. + If an instance of `ctbl:async-model' is given, the model is built up asynchronously. +column-model : A list of column models. +sort-state : The current sort order as a list of column indexes. + The index number of the first column is 1. + If the index is negative, the sort order is reversed." + data column-model sort-state) + + +(defstruct ctbl:async-model + "Asynchronous data model + +request : Data request function which receives 4 arguments (begin-num length fn(row-list) fe(errmsg)). + This function should return the next data which begins with `begin-num' and has the length + as `length', evaluating the continuation function `fn' with the data. + If the function `fn' is given `nil', it means no more data. + If the error function `fe' is evaluated with `errmsg', the message is displayed for the user. +init-num : Initial row number. (Default 20) +more-num : Increase row number. (Default 20) +reset : Reset function which is called when user executes update command. (Can be nil) +cancel : Cancel function of data requesting. (Can be nil) + +For forward compatibility, these callback functions should have a `&rest' keyword at the end of argument list. +" + request (init-num 20) (more-num 20) reset cancel) + + +(defstruct ctbl:cmodel + "Table column model structure + +title : title string. +sorter : sorting function which transforms a cell value into sort value. + It should return -1, 0 and 1. If nil, `ctbl:sort-string-lessp' is used. +align : text alignment: 'left, 'right and 'center. (default: right) +max-width : maximum width of the column. if nil, no constraint. (default: nil) +min-width : minimum width of the column. if nil, no constraint. (default: nil) +click-hooks : a list of functions for header clicking with two arguments + the `ctbl:component' object and the `ctbl:cmodel' one. + (default: '(`ctbl:cmodel-sort-action'))" + title sorter align max-width min-width + (click-hooks '(ctbl:cmodel-sort-action))) + + +(defstruct ctbl:param + "Rendering parameters + +display-header : if t, display the header row with column models. +fixed-header : if t, display the header row in the header-line area. +bg-colors : '(((row-id . col-id) . colorstr) (t . default-color) ... ) or (lambda (model row-id col-id) colorstr or nil) +vline-colors : \"#RRGGBB\" or '((0 . colorstr) (t . default-color)) or (lambda (model col-index) colorstr or nil) +hline-colors : \"#RRGGBB\" or '((0 . colorstr) (t . default-color)) or (lambda (model row-index) colorstr or nil) +draw-vlines : 'all or '(0 1 2 .. -1) or (lambda (model col-index) t or nil ) +draw-hlines : 'all or '(0 1 2 .. -1) or (lambda (model row-index) t or nil ) +vertical-line horizontal-line : | - +left-top-corner right-top-corner left-bottom-corner right-bottom-corner : + +top-junction bottom-junction left-junction right-junction cross-junction : +" + display-header fixed-header + bg-colors vline-colors hline-colors draw-vlines draw-hlines vertical-line horizontal-line + left-top-corner right-top-corner left-bottom-corner right-bottom-corner + top-junction bottom-junction left-junction right-junction cross-junction) + +(defvar ctbl:completing-read 'completing-read + "Customize for completing-read function. + +To use `ido-completing-read', put the following sexp into your +Emacs init file: + +(eval-after-load 'ido + '(progn + (setq ctbl:completing-read 'ido-completing-read)))") + + +(defvar ctbl:default-rendering-param + (make-ctbl:param + :display-header t + :fixed-header nil + :bg-colors nil + :vline-colors "DarkGray" + :hline-colors "DarkGray" + :draw-vlines 'all + :draw-hlines '(1) + :vertical-line ?| + :horizontal-line ?- + :left-top-corner ?+ + :right-top-corner ?+ + :left-bottom-corner ?+ + :right-bottom-corner ?+ + :top-junction ?+ + :bottom-junction ?+ + :left-junction ?+ + :right-junction ?+ + :cross-junction ?+ + ) + "Default rendering parameters.") + +(defvar ctbl:tooltip-method '(pos-tip popup minibuffer) + "Preferred tooltip methods in order.") + +;;; Faces + +(defface ctbl:face-row-select + '((((class color) (background light)) + :background "WhiteSmoke") + (((class color) (background dark)) + :background "Blue4")) + "Face for row selection" :group 'ctable) + +(defface ctbl:face-cell-select + '((((class color) (background light)) + :background "Mistyrose1") + (((class color) (background dark)) + :background "Blue2")) + "Face for cell selection" :group 'ctable) + +(defface ctbl:face-continue-bar + '((((class color) (background light)) + :background "OldLace") + (((class color) (background dark)) + :background "Gray26")) + "Face for continue bar" :group 'ctable) + +;;; Utilities + +(defun ctbl:define-keymap (keymap-list &optional prefix) + "[internal] Keymap utility." + (let ((map (make-sparse-keymap))) + (mapc + (lambda (i) + (define-key map + (if (stringp (car i)) + (read-kbd-macro + (if prefix + (replace-regexp-in-string "prefix" prefix (car i)) + (car i))) + (car i)) + (cdr i))) + keymap-list) + map)) + +(defun ctbl:cell-id (row-id col-id) + "[internal] Create a cell-id object" + (cons row-id col-id)) + +(defun ctbl:tp (text prop value) + "[internal] Put a text property to the entire text string." + (if (< 0 (length text)) + (put-text-property 0 (length text) prop value text)) + text) + +(defvar ctbl:uid 1) + +(defun ctbl:uid () + "[internal] Generate an unique number." + (incf ctbl:uid)) + +(defun ctbl:fill-keymap-property (begin end keymap) + "[internal] Put the given text property to the region between BEGIN and END. +If the text already has some keymap property, the text is skipped." + (save-excursion + (goto-char begin) + (loop with pos = begin with nxt = nil + until (or (null pos) (<= end pos)) + when (get-text-property pos 'keymap) do + (setq pos (next-single-property-change pos 'keymap)) + else do + (setq nxt (next-single-property-change pos 'keymap)) + (when (null nxt) (setq nxt end)) + (put-text-property pos (min nxt end) 'keymap keymap)))) + +;; Model functions + +(defun ctbl:model-column-length (model) + "[internal] Return the column number." + (length (ctbl:model-column-model model))) + +(defun ctbl:model-row-length (model) + "[internal] Return the row number." + (length (ctbl:model-data model))) + +(defun ctbl:model-modify-sort-key (model col-index) + "Modify the list of sort keys for the column headers." + (let* ((sort-keys (ctbl:model-sort-state model)) + (col-key (1+ col-index))) + (cond + ((eq (car sort-keys) col-key) + (setf (ctbl:model-sort-state model) + (cons (- col-key) (cdr sort-keys)))) + ((eq (car sort-keys) (- col-key)) + (setf (ctbl:model-sort-state model) + (cons col-key (cdr sort-keys)))) + (t + (setf (ctbl:model-sort-state model) + (cons col-key (delete (- col-key) + (delete col-key sort-keys)))))) + (ctbl:model-sort-state model))) + +(defun ctbl:cmodel-sort-action (cp col-index) + "Sorting action for click on the column headers. +If data is an instance of `ctbl:async-model', this function do nothing." + (let* ((model (ctbl:cp-get-model cp))) + (unless (ctbl:async-model-p (ctbl:model-data model)) + (ctbl:model-modify-sort-key model col-index) + (ctbl:cp-update cp)))) + + +;;; ctable framework + +;; Component + +(defstruct ctbl:component + "Component + +This structure defines attributes of the table component. +These attributes are internal use. Other programs should access +through the functions of the component interface. + +dest : an object of `ctbl:dest' +model : an object of the table model +selected : selected cell-id: (row index . col index) +param : rendering parameter object +sorted-data : sorted data to display the table view. + see `ctbl:cp-get-selected-data-row' and `ctbl:cp-get-selected-data-cell'. +update-hooks : a list of hook functions for update event +selection-change-hooks : a list of hook functions for selection change event +click-hooks : a list of hook functions for click event +states : alist of arbitrary data for internal use" + dest model param selected sorted-data + update-hooks selection-change-hooks click-hooks states) + + +;; Rendering Destination + +(defstruct ctbl:dest + "Rendering Destination + +This structure object is the abstraction of the rendering +destinations, such as buffers, regions and so on. + +type : identify symbol for destination type. (buffer, region, text) +buffer : a buffer object of rendering destination. +min-func : a function that returns upper limit of rendering destination. +max-func : a function that returns lower limit of rendering destination. +width : width of the reference size. (number, nil or full) +height : height of the reference size. (number, nil or full) +clear-func : a function that clears the rendering destination. +before-update-func : a function that is called at the beginning of rendering routine. +after-update-func : a function that is called at the end of rendering routine. +select-ol : a list of overlays for selection" + type buffer min-func max-func width height + clear-func before-update-func after-update-func select-ol) + +(eval-when-compile + (defmacro ctbl:dest-with-region (dest &rest body) + (declare (debug (form &rest form))) + (let (($dest (gensym))) + `(let ((,$dest ,dest)) + (with-current-buffer (ctbl:dest-buffer ,$dest) + (save-restriction + (narrow-to-region + (ctbl:dest-point-min ,$dest) (ctbl:dest-point-max ,$dest)) + ,@body)))))) +(put 'ctbl:dest-with-region 'lisp-indent-function 1) + +(defun ctbl:dest-point-min (c) + (funcall (ctbl:dest-min-func c))) + +(defun ctbl:dest-point-max (c) + (funcall (ctbl:dest-max-func c))) + +(defun ctbl:dest-clear (c) + (funcall (ctbl:dest-clear-func c))) + +(defun ctbl:dest-before-update (c) + (when (ctbl:dest-before-update-func c) + (funcall (ctbl:dest-before-update-func c)))) + +(defun ctbl:dest-after-update (c) + (when (ctbl:dest-after-update-func c) + (funcall (ctbl:dest-after-update-func c)))) + + +;; Buffer + +(defconst ctbl:table-buffer-name "*ctbl-table*" "[internal] Default buffer name for the table view.") + +(defun ctbl:dest-init-buffer (&optional buf width height custom-map) + "Create a buffer destination. +This destination uses an entire buffer and set up the major-mode +`ctbl:table-mode' and the key map `ctbl:table-mode-map'. BUF is +a buffer name to render the table view. If BUF is nil, the +default buffer name is used. WIDTH and HEIGHT are reference size +of the table view. If those are nil, the size of table is +calculated from the window that shows BUF or the selected window. +The component object is stored at the buffer local variable +`ctbl:component'. CUSTOM-MAP is the additional keymap that is +added to default keymap `ctbl:table-mode-map'." + (lexical-let + ((buffer (or buf (get-buffer-create (format "*Table: %d*" (ctbl:uid))))) + (window (or (and buf (get-buffer-window buf)) (selected-window))) + dest) + (setq dest + (make-ctbl:dest + :type 'buffer + :min-func 'point-min + :max-func 'point-max + :buffer buffer + :width width + :height height + :clear-func (lambda () + (with-current-buffer buffer + (erase-buffer))))) + (with-current-buffer buffer + (unless (eq major-mode 'ctbl:table-mode) + (ctbl:table-mode custom-map))) + dest)) + +;; Region + +(defun ctbl:dest-init-region (buf mark-begin mark-end &optional width height) + "Create a region destination. The table is drew between +MARK-BEGIN and MARK-END in the buffer BUF. MARK-BEGIN and +MARK-END are separated by more than one character, such as a +space. This destination is employed to be embedded in the some +application buffer. Because this destination does not set up +any modes and key maps for the buffer, the application that uses +the ctable is responsible to manage the buffer and key maps." + (lexical-let + ((mark-begin mark-begin) (mark-end mark-end) + (window (or (get-buffer-window buf) (selected-window)))) + (make-ctbl:dest + :type 'region + :min-func (lambda () (marker-position mark-begin)) + :max-func (lambda () (marker-position mark-end)) + :buffer buf + :width width + :height height + :clear-func + (lambda () + (ctbl:dest-region-clear (marker-position mark-begin) + (marker-position mark-end)))))) + +(defun ctbl:dest-region-clear (begin end) + "[internal] Clear the content text." + (when (< 2 (- end begin)) + (delete-region begin (1- end))) + (goto-char begin)) + +;; Inline text + +(defconst ctbl:dest-background-buffer " *ctbl:dest-background*") + +(defun ctbl:dest-init-inline (width height) + "Create a text destination." + (lexical-let + ((buffer (get-buffer-create ctbl:dest-background-buffer)) + (window (selected-window)) + dest) + (setq dest + (make-ctbl:dest + :type 'text + :min-func 'point-min + :max-func 'point-max + :buffer buffer + :width width + :height height + :clear-func (lambda () + (with-current-buffer buffer + (erase-buffer))))) + dest)) + +;; private functions + +(defun ctbl:dest-ol-selection-clear (dest) + "[internal] Clear the selection overlays on the current table view." + (loop for i in (ctbl:dest-select-ol dest) + do (delete-overlay i)) + (setf (ctbl:dest-select-ol dest) nil)) + +(defun ctbl:dest-ol-selection-set (dest cell-id) + "[internal] Put a selection overlay on CELL-ID. The selection overlay can be + put on some cells, calling this function many times. This + function does not manage the selections, just put the overlay." + (lexical-let (ols (row-id (car cell-id)) (col-id (cdr cell-id))) + (ctbl:dest-with-region dest + (ctbl:find-all-by-row-id + dest row-id + (lambda (tcell-id begin end) + (let ((overlay (make-overlay begin end))) + (overlay-put overlay 'face + (if (= (cdr tcell-id) col-id) + 'ctbl:face-cell-select + 'ctbl:face-row-select)) + (push overlay ols))))) + (setf (ctbl:dest-select-ol dest) ols))) + + +;; Component implementation + +(defun ctbl:cp-new (dest model param) + "[internal] Create a new component object. +DEST is a ctbl:dest object. MODEL is a model object. PARAM is a +rendering parameter object. This function is called by the +initialization functions, `ctbl:create-table-component-buffer', +`ctbl:create-table-component-region' and `ctbl:get-table-text'." + (let ((cp (make-ctbl:component + :selected '(0 . 0) + :dest dest + :model model + :param (or param ctbl:default-rendering-param)))) + (ctbl:cp-update cp) + cp)) + +(defun ctbl:cp-get-component () + "Return the component object on the current cursor position. +Firstly, getting a text property `ctbl:component' on the current +position. If no object is found in the text property, the buffer +local variable `ctbl:component' is tried to get. If no object is +found at the variable, return nil." + (let ((component (get-text-property (point) 'ctbl:component))) + (unless component + (unless (local-variable-p 'ctbl:component (current-buffer)) + (error "Not found ctbl:component attribute...")) + (setq component (buffer-local-value 'ctbl:component (current-buffer)))) + component)) + +;; Component : getters + +(defun ctbl:cp-get-selected (component) + "Return the selected cell-id of the component." + (ctbl:component-selected component)) + +(defun ctbl:cp-get-selected-data-row (component) + "Return the selected row data. If no cell is selected, return nil." + (let* ((rows (ctbl:component-sorted-data component)) + (cell-id (ctbl:component-selected component)) + (row-id (car cell-id)) (col-id (cdr cell-id))) + (if row-id (nth row-id rows) nil))) + +(defun ctbl:cp-get-selected-data-cell (component) + "Return the selected cell data. If no cell is selected, return nil." + (let* ((rows (ctbl:component-sorted-data component)) + (cell-id (ctbl:component-selected component)) + (row-id (car cell-id)) (col-id (cdr cell-id))) + (if row-id + (nth col-id (nth row-id rows)) + nil))) + +(defun ctbl:cp-get-model (component) + "Return the model object." + (ctbl:component-model component)) + +(defun ctbl:cp-set-model (component model) + "Replace the model object and update the destination." + (setf (ctbl:component-model component) model) + (ctbl:cp-update component)) + +(defun ctbl:cp-get-param (component) + "Return a rendering parameter object." + (ctbl:component-param component)) + +(defun ctbl:cp-get-buffer (component) + "Return a buffer object on which the component draws the content." + (ctbl:dest-buffer (ctbl:component-dest component))) + +;; Component : setters + +(defun ctbl:cp-move-cursor (dest cell-id) + "[internal] Just move the cursor onto the CELL-ID. +If CELL-ID is not found, return nil. This function +is called by `ctbl:cp-set-selected-cell'." + (let ((pos (ctbl:find-by-cell-id dest cell-id))) + (cond + (pos + (goto-char pos) + (unless (eql (selected-window) (get-buffer-window (current-buffer))) + (set-window-point (get-buffer-window (current-buffer)) pos)) + t) + (t nil)))) + +(defun ctbl:cp-set-selected-cell (component cell-id) + "Select the cell on the component. If the current view doesn't contain the cell, +this function updates the view to display the cell." + (let ((last (ctbl:component-selected component)) + (dest (ctbl:component-dest component)) + (model (ctbl:component-model component))) + (when (ctbl:cp-move-cursor dest cell-id) + (setf (ctbl:component-selected component) cell-id) + (ctbl:dest-before-update dest) + (ctbl:dest-ol-selection-clear dest) + (ctbl:dest-ol-selection-set dest cell-id) + (ctbl:dest-after-update dest) + (unless (equal last cell-id) + (ctbl:cp-fire-selection-change-hooks component))))) + +;; Hook + +(defun ctbl:cp-add-update-hook (component hook) + "Add the update hook function to the component. +HOOK is a function that has no argument." + (push hook (ctbl:component-update-hooks component))) + +(defun ctbl:cp-add-selection-change-hook (component hook) + "Add the selection change hook function to the component. +HOOK is a function that has no argument." + (push hook (ctbl:component-selection-change-hooks component))) + +(defun ctbl:cp-add-click-hook (component hook) + "Add the click hook function to the component. +HOOK is a function that has no argument." + (push hook (ctbl:component-click-hooks component))) + +;; update + +(defun ctbl:cp-update (component) + "Clear and re-draw the component content." + (let* ((buf (ctbl:cp-get-buffer component)) + (dest (ctbl:component-dest component))) + (with-current-buffer buf + (ctbl:dest-before-update dest) + (ctbl:dest-ol-selection-clear dest) + (let (buffer-read-only) + (ctbl:dest-with-region dest + (ctbl:dest-clear dest) + (cond + ;; asynchronous model + ((ctbl:async-model-p + (ctbl:model-data (ctbl:component-model component))) + (lexical-let ((cp component)) + (ctbl:async-state-on-update cp) + (ctbl:render-async-main + dest + (ctbl:component-model component) + (ctbl:component-param component) + (lambda (rows &optional astate) + (setf (ctbl:component-sorted-data cp) rows) + (when astate + (ctbl:cp-states-set cp 'async-state astate)))))) + ;; synchronous model + (t + (setf (ctbl:component-sorted-data component) + (ctbl:render-main + dest + (ctbl:component-model component) + (ctbl:component-param component))))))) + (ctbl:cp-set-selected-cell + component (ctbl:component-selected component)) + (ctbl:dest-after-update dest) + (ctbl:cp-fire-update-hooks component)))) + +;; Component : privates + +(defun ctbl:cp-states-get (component key) + "[internal] Get a value from COMPONENT with KEY." + (cdr (assq key (ctbl:component-states component)))) + +(defun ctbl:cp-states-set (component key value) + "[internal] Set a value with KEY." + (let ((pair (assq key (ctbl:component-states component)))) + (cond + ((null pair) + (push (cons key value) (ctbl:component-states component))) + (t + (setf (cdr pair) value))))) + +(defun ctbl:cp-fire-click-hooks (component) + "[internal] Call click hook functions of the component with no arguments." + (loop for f in (ctbl:component-click-hooks component) + do (condition-case err + (funcall f) + (error (message "CTable: Click / Hook error %S [%s]" f err))))) + +(defun ctbl:cp-fire-selection-change-hooks (component) + "[internal] Call selection change hook functions of the component with no arguments." + (loop for f in (ctbl:component-selection-change-hooks component) + do (condition-case err + (funcall f) + (error (message "CTable: Selection change / Hook error %S [%s]" f err))))) + +(defun ctbl:cp-fire-update-hooks (component) + "[internal] Call update hook functions of the component with no arguments." + (loop for f in (ctbl:component-update-hooks component) + do (condition-case err + (funcall f) + (error (message "Ctable: Update / Hook error %S [%s]" f err))))) + +(defun ctbl:find-position-fast (dest cell-id) + "[internal] Find the cell-id position using bi-section search." + (let* ((row-id (car cell-id)) + (row-id-lim (max (- row-id 10) 0)) + (min (ctbl:dest-point-min dest)) + (max (ctbl:dest-point-max dest)) + (mid (/ (+ min max) 2))) + (save-excursion + (loop for next = (next-single-property-change mid 'ctbl:cell-id nil max) + for cur-row-id = (and next (car (ctbl:cursor-to-cell next))) + do + (cond + ((>= next max) (return (point))) + ((null cur-row-id) (setq mid next)) + ((= cur-row-id row-id) + (goto-char mid) (beginning-of-line) + (return (point))) + ((and (< row-id-lim cur-row-id) (< cur-row-id row-id)) + (goto-char mid) (beginning-of-line) (forward-line) + (return (point))) + ((< cur-row-id row-id) + (setq min mid) + (setq mid (/ (+ min max) 2))) + ((< row-id cur-row-id) + (setq max mid) + (setq mid (/ (+ min max) 2)))))))) + +(defun ctbl:find-by-cell-id (dest cell-id) + "[internal] Return a point where the text property `ctbl:cell-id' +is equal to cell-id in the current table view. If CELL-ID is not +found in the current view, return nil." + (loop with pos = (ctbl:find-position-fast dest cell-id) + with end = (ctbl:dest-point-max dest) + for next = (next-single-property-change pos 'ctbl:cell-id nil end) + for text-cell = (and next (ctbl:cursor-to-cell next)) + while (and next (< next end)) do + (if (and text-cell (equal cell-id text-cell)) + (return next)) + (setq pos next))) + +(defun ctbl:find-all-by-cell-id (dest cell-id func) + "[internal] Call the function FUNC in each regions where the +text-property `ctbl:cell-id' is equal to CELL-ID. The argument function FUNC +receives two arguments, begin position and end one. This function is +mainly used at functions for putting overlays." + (loop with pos = (ctbl:find-position-fast dest cell-id) + with end = (ctbl:dest-point-max dest) + for next = (next-single-property-change pos 'ctbl:cell-id nil end) + for text-id = (and next (ctbl:cursor-to-cell next)) + while (and next (< next end)) do + (if (and text-id (equal cell-id text-id)) + (let ((cend (next-single-property-change + next 'ctbl:cell-id nil end))) + (return (funcall func next cend)))) + (setq pos next))) + +(defun ctbl:find-all-by-row-id (dest row-id func) + "[internal] Call the function FUNC in each regions where the +row-id of the text-property `ctbl:cell-id' is equal to +ROW-ID. The argument function FUNC receives three arguments, +cell-id, begin position and end one. This function is mainly used +at functions for putting overlays." + (loop with pos = (ctbl:find-position-fast dest (cons row-id nil)) + with end = (ctbl:dest-point-max dest) + for next = (next-single-property-change pos 'ctbl:cell-id nil end) + for text-id = (and next (ctbl:cursor-to-cell next)) + while (and next (< next end)) do + (when text-id + (cond + ((equal row-id (car text-id)) + (let ((cend (next-single-property-change + next 'ctbl:cell-id nil end))) + (funcall func text-id next cend))) + ((< row-id (car text-id)) + (return nil)))) + (setq pos next))) + +(defun ctbl:find-first-cell (dest) + "[internal] Return the first cell in the current buffer." + (let ((pos (next-single-property-change + (ctbl:dest-point-min dest) 'ctbl:cell-id))) + (and pos (ctbl:cursor-to-cell pos)))) + +(defun ctbl:find-last-cell (dest) + "[internal] Return the last cell in the current buffer." + (let ((pos (previous-single-property-change + (ctbl:dest-point-max dest) 'ctbl:cell-id))) + (and pos (ctbl:cursor-to-cell (1- pos))))) + +(defun ctbl:cursor-to-cell (&optional pos) + "[internal] Return the cell-id at the cursor. If the text does not +have the text-property `ctbl:cell-id', return nil." + (get-text-property (or pos (point)) 'ctbl:cell-id)) + +(defun ctbl:cursor-to-nearest-cell () + "Return the cell-id at the cursor. If the point of cursor does +not have the cell-id, search the cell-id around the cursor +position. If the current buffer is not table view (it may be +bug), this function may return nil." + (or (ctbl:cursor-to-cell) + (let* ((r (lambda () (when (not (eolp)) (forward-char)))) + (l (lambda () (when (not (bolp)) (backward-char)))) + (u (lambda () (when (not (bobp)) (line-move 1)))) + (d (lambda () (when (not (eobp)) (line-move -1)))) + (dest (ctbl:component-dest (ctbl:cp-get-component))) + get) + (setq get (lambda (cmds) + (save-excursion + (if (null cmds) (ctbl:cursor-to-cell) + (ignore-errors + (funcall (car cmds)) (funcall get (cdr cmds))))))) + (or (loop for i in `((,d) (,r) (,u) (,l) + (,d ,r) (,d ,l) (,u ,r) (,u ,l) + (,d ,d) (,r ,r) (,u ,u) (,l ,l)) + for id = (funcall get i) + if id return id) + (cond + ((> (/ (point-max) 2) (point)) + (ctbl:find-first-cell dest)) + (t (ctbl:find-last-cell dest))))))) + + +;; Commands + +(defun ctbl:navi-move-gen (drow dcol) + "[internal] Move to the cell with the abstract position." + (let* ((cp (ctbl:cp-get-component)) + (cell-id (ctbl:cursor-to-nearest-cell)) + (row-id (car cell-id)) (col-id (cdr cell-id))) + (when (and cp cell-id) + (ctbl:navi-goto-cell (ctbl:cell-id (+ drow row-id) + (+ dcol col-id)))))) + +(defun ctbl:navi-move-up (&optional num) + "Move to the up neighbor cell." + (interactive "p") + (unless num (setq num 1)) + (ctbl:navi-move-gen (- num) 0)) + +(defun ctbl:navi-move-down (&optional num) + "Move to the down neighbor cell." + (interactive "p") + (unless num (setq num 1)) + (ctbl:navi-move-gen num 0)) + +(defun ctbl:navi-move-right (&optional num) + "Move to the right neighbor cell." + (interactive "p") + (unless num (setq num 1)) + (ctbl:navi-move-gen 0 num)) + +(defun ctbl:navi-move-left (&optional num) + "Move to the left neighbor cell." + (interactive "p") + (unless num (setq num 1)) + (ctbl:navi-move-gen 0 (- num))) + +(defun ctbl:navi-move-left-most () + "Move to the left most cell." + (interactive) + (let* ((cp (ctbl:cp-get-component)) + (cell-id (ctbl:cursor-to-nearest-cell)) + (row-id (car cell-id))) + (when (and cp cell-id) + (ctbl:navi-goto-cell (ctbl:cell-id row-id 0))))) + +(defun ctbl:navi-move-right-most () + "Move to the right most cell." + (interactive) + (let* ((cp (ctbl:cp-get-component)) + (cell-id (ctbl:cursor-to-nearest-cell)) + (row-id (car cell-id)) + (model (ctbl:cp-get-model cp)) + (cols (ctbl:model-column-length model))) + (when (and cp cell-id) + (ctbl:navi-goto-cell (ctbl:cell-id row-id (1- cols)))))) + +(defun ctbl:navi-goto-cell (cell-id) + "Move the cursor to CELL-ID and put selection." + (let ((cp (ctbl:cp-get-component))) + (when cp + (ctbl:cp-set-selected-cell cp cell-id)))) + +(defun ctbl:navi-on-click () + "Action handler on the cells." + (interactive) + (let ((cp (ctbl:cp-get-component)) + (cell-id (ctbl:cursor-to-nearest-cell))) + (when (and cp cell-id) + (ctbl:cp-set-selected-cell cp cell-id) + (ctbl:cp-fire-click-hooks cp)))) + +(defun ctbl:navi-jump-to-column () + "Jump to a specified column of the current row." + (interactive) + (let* ((cp (ctbl:cp-get-component)) + (cell-id (ctbl:cursor-to-nearest-cell)) + (row-id (car cell-id)) + (model (ctbl:cp-get-model cp)) + (cols (ctbl:model-column-length model)) + (col-names (mapcar 'ctbl:cmodel-title + (ctbl:model-column-model model))) + (completion-ignore-case t) + (col-name (funcall ctbl:completing-read "Column name: " col-names))) + (when (and cp cell-id) + (ctbl:navi-goto-cell + (ctbl:cell-id + row-id + (position col-name col-names :test 'equal)))))) + +(defun ctbl:action-update-buffer () + "Update action for the latest table model." + (interactive) + (let ((cp (ctbl:cp-get-component))) + (when cp + (ctbl:cp-update cp)))) + +(defun ctbl:action-column-header () + "Action handler on the header columns. (for normal key events)" + (interactive) + (ctbl:fire-column-header-action + (ctbl:cp-get-component) + (get-text-property (point) 'ctbl:col-id))) + +(defun ctbl:fire-column-header-action (cp col-id) + "[internal] Execute action handlers on the header columns." + (when (and cp col-id) + (loop with cmodel = (nth col-id (ctbl:model-column-model (ctbl:cp-get-model cp))) + for f in (ctbl:cmodel-click-hooks cmodel) + do (condition-case err + (funcall f cp col-id) + (error (message "Ctable: Header Click / Hook error %S [%s]" + f err)))))) + +(defun ctbl:render-column-header-keymap (col-id) + "[internal] Generate action handler on the header columns. (for header-line-format)" + (lexical-let ((col-id col-id)) + (let ((keymap (copy-keymap ctbl:column-header-keymap))) + (define-key keymap [header-line mouse-1] + (lambda () + (interactive) + (ctbl:fire-column-header-action (ctbl:cp-get-component) col-id))) + keymap))) + +(defvar ctbl:column-header-keymap + (ctbl:define-keymap + '(([mouse-1] . ctbl:action-column-header) + ("C-m" . ctbl:action-column-header) + ("RET" . ctbl:action-column-header) + )) + "Keymap for the header columns.") + +(defvar ctbl:table-mode-map + (ctbl:define-keymap + '( + ("k" . ctbl:navi-move-up) + ("j" . ctbl:navi-move-down) + ("h" . ctbl:navi-move-left) + ("l" . ctbl:navi-move-right) + + ("p" . ctbl:navi-move-up) + ("n" . ctbl:navi-move-down) + ("b" . ctbl:navi-move-left) + ("f" . ctbl:navi-move-right) + + ("c" . ctbl:navi-jump-to-column) + + ("e" . ctbl:navi-move-right-most) + ("a" . ctbl:navi-move-left-most) + + ("g" . ctbl:action-update-buffer) + + ([mouse-1] . ctbl:navi-on-click) + ("C-m" . ctbl:navi-on-click) + ("RET" . ctbl:navi-on-click) + + )) "Keymap for the table-mode buffer.") + +(defun ctbl:table-mode-map (&optional custom-map) + "[internal] Return a keymap object for the table buffer." + (cond + (custom-map + (set-keymap-parent custom-map ctbl:table-mode-map) + custom-map) + (t ctbl:table-mode-map))) + +(defvar ctbl:table-mode-hook nil + "This hook is called at end of setting up major mode `ctbl:table-mode'.") + +(defun ctbl:table-mode (&optional custom-map) + "Set up major mode `ctbl:table-mode'. + +\\{ctbl:table-mode-map}" + (kill-all-local-variables) + (setq truncate-lines t) + (use-local-map (ctbl:table-mode-map custom-map)) + (setq major-mode 'ctbl:table-mode + mode-name "Table Mode") + (setq buffer-undo-list t + buffer-read-only t) + (add-hook 'post-command-hook 'ctbl:start-tooltip-timer nil t) + (run-hooks 'ctbl:table-mode-hook)) + + +;; Rendering + +(defun ctbl:render-check-cell-width (rows cmodels column-widths) + "[internal] Return a list of rows. This function makes side effects: +cell widths are stored at COLUMN-WIDTHS, longer cell strings are truncated by +maximum width of the column models." + (loop for row in rows collect + (loop for c in row + for cm in cmodels + for cwmax = (ctbl:cmodel-max-width cm) + for i from 0 + for cw = (nth i column-widths) + for val = (format "%s" c) + collect + (progn + (when (and cwmax (< cwmax (string-width val))) + (setq val (truncate-string-to-width val cwmax))) + (when (< cw (string-width val)) + (setf (nth i column-widths) (string-width val))) + val)))) + +(defun ctbl:render-adjust-cell-width (cmodels column-widths total-width) + "[internal] Adjust column widths and return a list of column widths. +If TOTAL-WIDTH is nil, this function just returns COLUMN-WIDTHS. +If TOTAL-WIDTHS is shorter than sum of COLUMN-WIDTHS, this +function expands columns. The residual width is distributed over +the columns. If TOTAL-WIDTHS is longer than sum of +COLUMN-WIDTHS, this function shrinks columns to reduce the +surplus width." + (let ((init-total (loop for i in column-widths sum i))) + (cond + ((or (null total-width) + (= total-width init-total)) column-widths) + ((< total-width init-total) + (ctbl:render-adjust-cell-width-shrink + cmodels column-widths total-width init-total)) + (t + (ctbl:render-adjust-cell-width-expand + cmodels column-widths total-width init-total))))) + +(defun ctbl:render-adjust-cell-width-shrink (cmodels column-widths total-width init-total ) + "[internal] shrink column widths." + (let* ((column-widths (copy-sequence column-widths)) + (column-indexes (loop for i from 0 below (length cmodels) collect i)) + (residual (- init-total total-width))) + (loop for cnum = (length column-indexes) + until (or (= 0 cnum) (= 0 residual)) + do + (loop with ave-shrink = (max 1 (/ residual cnum)) + for idx in column-indexes + for cmodel = (nth idx cmodels) + for cwidth = (nth idx column-widths) + for min-width = (or (ctbl:cmodel-min-width cmodel) 1) + do + (cond + ((<= residual 0) (return)) ; complete + ((<= cwidth min-width) ; reject + (setq column-indexes (delete idx column-indexes))) + (t ; reduce + (let ((next-width (max 1 (- cwidth ave-shrink)))) + (incf residual (- next-width cwidth)) + (setf (nth idx column-widths) next-width)))))) + column-widths)) + +(defun ctbl:render-adjust-cell-width-expand (cmodels column-widths total-width init-total ) + "[internal] expand column widths." + (let* ((column-widths (copy-sequence column-widths)) + (column-indexes (loop for i from 0 below (length cmodels) collect i)) + (residual (- total-width init-total))) + (loop for cnum = (length column-indexes) + until (or (= 0 cnum) (= 0 residual)) + do + (loop with ave-expand = (max 1 (/ residual cnum)) + for idx in column-indexes + for cmodel = (nth idx cmodels) + for cwidth = (nth idx column-widths) + for max-width = (or (ctbl:cmodel-max-width cmodel) total-width) + do + (cond + ((<= residual 0) (return)) ; complete + ((<= max-width cwidth) ; reject + (setq column-indexes (delete idx column-indexes))) + (t ; expand + (let ((next-width (min max-width (+ cwidth ave-expand)))) + (incf residual (- cwidth next-width)) + (setf (nth idx column-widths) next-width)))))) + column-widths)) + +(defun ctbl:render-get-formats (cmodels column-widths) + "[internal] Return a list of the format functions." + (loop for cw in column-widths + for cm in cmodels + for al = (ctbl:cmodel-align cm) + collect + (lexical-let ((cw cw)) + (cond + ((eq al 'left) + (lambda (s) (ctbl:format-left cw s))) + ((eq al 'center) + (lambda (s) (ctbl:format-center cw s))) + (t + (lambda (s) (ctbl:format-right cw s))))))) + +(defun ctbl:render-choose-color (model param index) + "[internal] Choose rendering color." + (cond + ((null param) nil) + ((stringp param) param) + ((functionp param) + (funcall param model index)) + (t (let ((val (or (assq index param) + (assq t param)))) + (if val (cdr val) nil))))) + +(defun ctbl:render-bg-color (str row-id col-id model param) + "[internal] Return nil or the color string at the cell (row-id . cell-id)." + (let ((bgc-param (ctbl:param-bg-colors param))) + (cond + ((null bgc-param) nil) + ((functionp bgc-param) + (funcall bgc-param model row-id col-id str)) + (t + (let ((pair (or (assoc (cons row-id col-id) bgc-param) + (assoc t bgc-param)))) + (if pair (cdr pair) nil)))))) + +(defun ctbl:render-bg-color-put (str row-id col-id model param) + "[internal] Return the string with the background face." + (let ((bgcolor (ctbl:render-bg-color str row-id col-id model param))) + (if bgcolor + (let ((org-face (get-text-property 0 'face str))) + (propertize + (copy-sequence str) + 'face (if org-face + (append org-face (list ':background bgcolor)) + (list ':background bgcolor)))) + str))) + +(defun ctbl:render-line-color (str model param index) + "[internal] Return the propertize string." + (propertize (copy-sequence str) + 'face (list + ':foreground + (ctbl:render-choose-color model param index)))) + +(defun ctbl:render-vline-color (str model param index) + "[internal] Return the propertize string for vertical lines." + (ctbl:render-line-color str model (ctbl:param-vline-colors param) index)) + +(defun ctbl:render-hline-color (str model param index) + "[internal] Return the propertize string for horizontal lines." + (ctbl:render-line-color str model (ctbl:param-hline-colors param) index)) + +(defun ctbl:render-draw-vline-p (model param index) + "[internal] If a vertical line is needed at the column index, return t." + (cond + ((null param) nil) + ((eq 'all param) t) + ((functionp param) (funcall param model index)) + (t (and (consp param) (memq index param))))) + +(defun ctbl:render-draw-hline-p (model param index) + "[internal] If a horizontal line is needed at the row index, return t." + (cond + ((null param) nil) + ((eq 'all param) t) + ((functionp param) (funcall param model index)) + (t (memq index param)))) + +(defun ctbl:render-make-hline (column-widths model param index) + "[internal] " + (let ((vparam (ctbl:param-draw-vlines param)) + (hline (ctbl:param-horizontal-line param)) + left joint right) + (if (not (ctbl:render-draw-hline-p + model (ctbl:param-draw-hlines param) index)) + "" + (cond + ((eq 0 index) + (setq left (char-to-string (ctbl:param-left-top-corner param)) + joint (char-to-string (ctbl:param-top-junction param)) + right (char-to-string (ctbl:param-right-top-corner param)))) + ((eq -1 index) + (setq left (char-to-string (ctbl:param-left-bottom-corner param)) + joint (char-to-string (ctbl:param-bottom-junction param)) + right (char-to-string (ctbl:param-right-bottom-corner param)))) + (t + (setq left (char-to-string (ctbl:param-left-junction param)) + joint (char-to-string (ctbl:param-cross-junction param)) + right (char-to-string (ctbl:param-right-junction param))))) + (ctbl:render-hline-color + (concat + (if (ctbl:render-draw-vline-p model vparam 0) left) + (loop with ret = nil with endi = (length column-widths) + for cw in column-widths + for ci from 1 + for endp = (equal ci endi) + do + (push (make-string cw hline) ret) + (when (and (ctbl:render-draw-vline-p model vparam ci) + (not endp)) + (push joint ret)) + finally return (apply 'concat (reverse ret))) + (if (ctbl:render-draw-vline-p model vparam -1) right) + "\n") + model param index)))) + +(defun ctbl:render-join-columns (columns model param) + "[internal] Join a list of column strings with vertical lines." + (let (ret (V (char-to-string (ctbl:param-vertical-line param)))) + ;; left border line + (setq ret (if (ctbl:render-draw-vline-p + model (ctbl:param-draw-vlines param) 0) + (list (ctbl:render-vline-color V model param 0)) + nil)) + ;; content line + (loop with param-vl = (ctbl:param-draw-vlines param) + with param-vc = (ctbl:param-vline-colors param) + with endi = (length columns) + for i from 1 for endp = (equal i endi) + for cv in columns + for color = (ctbl:render-choose-color model param-vc i) + do + (push cv ret) + (when (and (ctbl:render-draw-vline-p + model (ctbl:param-draw-vlines param) i) + (not endp)) + (push (ctbl:render-vline-color V model param i) ret))) + ;; right border line + (when (ctbl:render-draw-vline-p + model (ctbl:param-draw-vlines param) -1) + (push (ctbl:render-vline-color V model param -1) ret)) + ;; join them + (mapconcat 'identity (reverse ret) ""))) + +(defun ctbl:render-sum-vline-widths (cmodels model param) + "[internal] Return a sum of the widths of vertical lines." + (let ((sum 0)) + ;; left border line + (when (ctbl:render-draw-vline-p model (ctbl:param-draw-vlines param) 0) + (incf sum)) + ;; content line + (loop with param-vl = (ctbl:param-draw-vlines param) + with endi = (length cmodels) + for i from 1 upto (length cmodels) + for endp = (equal i endi) do + (when (and (ctbl:render-draw-vline-p + model (ctbl:param-draw-vlines param) i) + (not endp)) + (incf sum))) + ;; right border line + (when (ctbl:render-draw-vline-p + model (ctbl:param-draw-vlines param) -1) + (incf sum)) + sum)) + +(defun ctbl:dest-width-get (dest) + "[internal] Return the column number to draw the table view. +Return nil, if the width is not given. Then, the renderer draws freely." + (let ((dwidth (ctbl:dest-width dest)) + (dwin (get-buffer-window))) + (cond + ((numberp dwidth) dwidth) + ((eq 'full dwidth) (window-width dwin)) + (t nil)))) + +(defun ctbl:dest-height-get (dest) + "[internal] Return the row number to draw the table view. +Return nil, if the height is not given. Then, the renderer draws freely." + (let ((dheight (ctbl:dest-height dest)) + (dwin (get-buffer-window))) + (cond + ((numberp dheight) dheight) + ((eq 'full dheight) (1- (window-height dwin))) + (t nil)))) + +(defun ctbl:render-main (dest model param) + "[internal] Rendering the table view. +This function assumes that the current buffer is the destination buffer." + (let* ((EOL "\n") drows + (cmodels (ctbl:model-column-model model)) + (rows (ctbl:sort + (copy-sequence (ctbl:model-data model)) cmodels + (ctbl:model-sort-state model))) + (column-widths + (loop for c in cmodels + for title = (ctbl:cmodel-title c) + collect (max (or (ctbl:cmodel-min-width c) 0) + (or (and title (length title)) 0)))) + column-formats) + ;; check cell widths + (setq drows (ctbl:render-check-cell-width rows cmodels column-widths)) + ;; adjust cell widths for ctbl:dest width + (when (ctbl:dest-width-get dest) + (setq column-widths + (ctbl:render-adjust-cell-width + cmodels column-widths + (- (ctbl:dest-width-get dest) + (ctbl:render-sum-vline-widths + cmodels model param))))) + (setq column-formats (ctbl:render-get-formats cmodels column-widths)) + (catch 'ctbl:insert-break + (when (ctbl:param-display-header param) + (ctbl:render-main-header dest model param + cmodels column-widths)) + (ctbl:render-main-content dest model param + cmodels drows column-widths column-formats)) + ;; return the sorted list + rows)) + +(defun ctbl:render-main-header (dest model param cmodels column-widths) + "[internal] Render the table header." + (let ((EOL "\n") + (header-string + (ctbl:render-join-columns + (loop for cm in cmodels + for i from 0 + for cw in column-widths + collect + (propertize + (ctbl:format-center cw (ctbl:cmodel-title cm)) + 'ctbl:col-id i + 'local-map (ctbl:render-column-header-keymap i) + 'mouse-face 'highlight)) + model param))) + (cond + ((and (eq 'buffer (ctbl:dest-type dest)) + (ctbl:param-fixed-header param)) + ;; buffer header-line + (let* ((fcol (/ (car (window-fringes)) + (frame-char-width))) + (header-text (concat (make-string fcol ? ) header-string))) + (setq header-line-format header-text) + ;; save header-text for hscroll updating + (set (make-local-variable 'ctbl:header-text) header-text))) + (t + ;; content area + (insert ; border line + (ctbl:render-make-hline column-widths model param 0)) + (insert header-string EOL) ; header columns + )))) + +(defun ctbl:render-main-content (dest model param cmodels rows + column-widths column-formats + &optional begin-index) + "[internal] Render the table content." + (unless begin-index + (setq begin-index 0)) + (let ((EOL "\n") (row-num (length rows))) + (loop for cols in rows + for row-index from begin-index + do + (insert + (ctbl:render-make-hline + column-widths model param (1+ row-index))) + (insert + (ctbl:render-join-columns + (loop for i in cols + for s = (if (stringp i) i (format "%s" i)) + for fmt in column-formats + for cw in column-widths + for col-index from 0 + for str = (ctbl:render-bg-color-put + (funcall fmt s) row-index col-index + model param) + collect + (propertize str + 'ctbl:cell-id (cons row-index col-index) + 'ctbl:cell-width cw)) + model param) EOL)) + ;; bottom border line + (insert + (ctbl:render-make-hline column-widths model param -1)))) + + +;; async data model + +(defvar ctbl:continue-button-keymap + (ctbl:define-keymap + '(([mouse-1] . ctbl:action-continue-async-clicked) + ("C-m" . ctbl:action-continue-async-clicked) + ("RET" . ctbl:action-continue-async-clicked) + )) + "Keymap for the continue button.") + +;; async data / internal state + +(defstruct ctbl:async-state + "Rendering State [internal] + +status : symbol -> + normal : data still remains. this is the start state. + requested : requested data and waiting for response. + done : no data remains. this is the final state. +actual-width : actual width +column-widths : width of each columns +column-formats : format of each columns +next-index : row index number for next request +panel-begin : begin mark object for status panel +panel-end : end mark object for status panel +" + status actual-width column-widths column-formats + next-index panel-begin panel-end) + +(defun ctbl:async-state-on-update (component) + "[internal] Reset async data model." + (let* ((cp component) + (amodel (ctbl:model-data (ctbl:cp-get-model cp))) + (astate (ctbl:cp-states-get cp 'async-state))) + (when (and astate (ctbl:async-model-reset amodel)) + (funcall (ctbl:async-model-reset amodel))))) + +(defun ctbl:async-state-on-click-panel (component) + "[internal] This function is called when the user clicks the status panel." + (let* ((cp component) + (amodel (ctbl:model-data (ctbl:cp-get-model cp))) + (astate (ctbl:cp-states-get cp 'async-state))) + (when cp + (case (ctbl:async-state-status astate) + ('normal + (ctbl:render-async-continue cp)) + ('requested + (when (ctbl:async-model-cancel amodel) + (funcall (ctbl:async-model-cancel amodel)) + (ctbl:async-state-update-status (ctbl:component-dest cp) 'normal))))))) + +(defun ctbl:async-state-update-status (component next-status) + "[internal] Update internal status of async-state and update the status panel." + (let* ((cp component) + (dest (ctbl:component-dest cp)) + (amodel (ctbl:model-data (ctbl:cp-get-model cp))) + (astate (ctbl:cp-states-get cp 'async-state))) + (with-current-buffer (ctbl:dest-buffer dest) + (setf (ctbl:async-state-status astate) next-status) + (ctbl:async-state-update-status-panel dest astate amodel)))) + +(defun ctbl:async-state-update-status-panel (dest astate amodel) + "[internal] Rendering data model status panel with current state." + (let ((begin (ctbl:async-state-panel-begin astate)) + (end (ctbl:async-state-panel-end astate)) + (width (ctbl:async-state-actual-width astate))) + (save-excursion + (let (buffer-read-only) + (when (< 2 (- end begin)) + (delete-region begin (1- end))) + (goto-char begin) + (insert + (propertize + (case (ctbl:async-state-status astate) + ('done + (ctbl:format-center width "No more data.")) + ('requested + (cond + ((ctbl:async-model-cancel amodel) + (ctbl:format-center width "(Waiting for data. [Click to Cancel])")) + (t + (ctbl:format-center width "(Waiting for data...)")))) + ('normal + (ctbl:format-center width "[Click to retrieve more data.]")) + (t + (ctbl:format-center + width (format "(Error : %s)" (ctbl:async-state-status astate))))) + 'keymap ctbl:continue-button-keymap + 'face 'ctbl:face-continue-bar + 'mouse-face 'highlight) + "\n"))))) + +(defun ctbl:async-state-on-post-command-hook (component) + "[internal] Try auto requesting for asynchronous data." + (let* ((astate (ctbl:cp-states-get component 'async-state)) + (panel-begin-pos (marker-position + (ctbl:async-state-panel-begin astate)))) + (when (and (eq 'normal (ctbl:async-state-status astate)) + (< panel-begin-pos (window-end))) + (ctbl:action-continue-async-clicked)))) + +;; rendering async data + +(defun ctbl:render-async-main (dest model param rows-setter) + "[internal] Rendering the table view for async data model. +This function assumes that the current buffer is the destination buffer." + (lexical-let* + ((dest dest) (model model) (param param) (rows-setter rows-setter) + (amodel (ctbl:model-data model)) (buf (current-buffer)) + (cmodels (ctbl:model-column-model model))) + (funcall + (ctbl:async-model-request amodel) + 0 (ctbl:async-model-init-num amodel) + (lambda (rows) ; >> request succeeded + (with-current-buffer buf + (let (buffer-read-only drows column-formats + (column-widths + (loop for c in cmodels + for title = (ctbl:cmodel-title c) + collect (max (or (ctbl:cmodel-min-width c) 0) + (or (and title (length title)) 0)))) + (EOL "\n")) + ;; check cell widths + (setq drows (ctbl:render-check-cell-width rows cmodels column-widths)) + ;; adjust cell widths for ctbl:dest width + (when (ctbl:dest-width-get dest) + (setq column-widths + (ctbl:render-adjust-cell-width + cmodels column-widths + (- (ctbl:dest-width-get dest) + (ctbl:render-sum-vline-widths + cmodels model param))))) + (setq column-formats (ctbl:render-get-formats cmodels column-widths)) + (ctbl:render-main-header dest model param cmodels column-widths) + (ctbl:render-main-content dest model param cmodels drows column-widths column-formats) + (add-hook 'post-command-hook 'ctbl:post-command-hook-for-auto-request t t) + (let (mark-panel-begin mark-panel-end astate) + (setq mark-panel-begin (point-marker)) + (insert "\n") + (setq mark-panel-end (point-marker)) + (setq astate + (make-ctbl:async-state + :status 'normal + :actual-width (+ (ctbl:render-sum-vline-widths cmodels model param) + (loop for i in column-widths sum i)) + :column-widths column-widths :column-formats column-formats + :next-index (length rows) + :panel-begin mark-panel-begin :panel-end mark-panel-end)) + (ctbl:async-state-update-status-panel dest astate amodel) + (funcall rows-setter rows astate)) + (goto-char (ctbl:dest-point-min dest))))) + (lambda (errsym) ; >> request failed + (message "ctable : error -> %S" errsym))))) + +(defun ctbl:render-async-continue (component) + "[internal] Rendering subsequent data asynchronously." + (lexical-let* + ((cp component) (dest (ctbl:component-dest cp)) (buf (current-buffer)) + (model (ctbl:cp-get-model cp)) + (amodel (ctbl:model-data model)) + (astate (ctbl:cp-states-get cp 'async-state)) + (begin-index (ctbl:async-state-next-index astate))) + ;; status update + (ctbl:async-state-update-status cp 'requested) + (condition-case err + (funcall ; request async data + (ctbl:async-model-request amodel) + begin-index (ctbl:async-model-more-num amodel) + (lambda (rows) ; >> request succeeded + (with-current-buffer buf + (save-excursion + (let (buffer-read-only) + (cond + ((null rows) + ;; no more data + (ctbl:async-state-update-status cp 'done)) + (t + ;; continue data + (goto-char (1- (marker-position (ctbl:async-state-panel-begin astate)))) + (insert "\n") + (ctbl:render-main-content + dest model (ctbl:cp-get-param cp) (ctbl:model-column-model model) + rows (ctbl:async-state-column-widths astate) + (ctbl:async-state-column-formats astate) begin-index) + (delete-backward-char 1) + (ctbl:async-state-update-status cp 'normal) + ;; append row data (side effect!) + (setf (ctbl:component-sorted-data cp) + (append (ctbl:component-sorted-data cp) rows)) + (setf (ctbl:async-state-next-index astate) + (+ (length rows) begin-index)))))))) + (lambda (errsym) ; >> request failed + (ctbl:async-state-update-status cp errsym))) + (error ; >> request synchronously failed + (ctbl:async-state-update-status cp (cadr err)) + (message "ctable : error -> %S" err))))) + +;; async data actions + +(defun ctbl:action-continue-async-clicked () + "Action for clicking the continue button." + (interactive) + (let ((cp (ctbl:cp-get-component))) + (when cp + (ctbl:async-state-on-click-panel cp)))) + +(defun ctbl:post-command-hook-for-auto-request () + "[internal] This hook watches the buffer position of displayed window +to urge async data model to request next data chunk." + (let ((cp (ctbl:cp-get-component))) + (when (and cp (not (window-minibuffer-p))) + (ctbl:async-state-on-post-command-hook cp)))) + +(defun ctbl:async-model-wrapper (rows &optional init-num more-num) + "This function wraps a list of row data in an asynchronous data +model so as to avoid Emacs freezing with a large number of rows." + (lexical-let ((rows rows) (rest-rows rows) + (init-num (or init-num 100)) + (more-num (or more-num 100))) + (make-ctbl:async-model + :request + (lambda (row-num len responsef errorf &rest ignored) + (funcall + responsef + (cond + ((null rest-rows) nil) + (t + (nreverse + (loop with pos = rest-rows + with ret = nil + for i from 0 below len + do + (push (car pos) ret) + (setq pos (cdr pos)) + (unless pos (return ret)) + finally return ret))))) + (when rest-rows + (setq rest-rows (nthcdr len rest-rows)))) + :reset + (lambda (&rest ignored) (setq rest-rows rows)) + :init-num init-num :more-num more-num))) + + +;; tooltip + +(defun ctbl:pop-tooltip (string) + "[internal] Show STRING in tooltip." + (cond + ((and (memq 'pos-tip ctbl:tooltip-method) window-system (featurep 'pos-tip)) + (pos-tip-show (ctbl:string-fill-paragraph string) + 'popup-tip-face nil nil 0)) + ((and (memq 'popup ctbl:tooltip-method) (featurep 'popup)) + (popup-tip string)) + ((memq 'minibuffer ctbl:tooltip-method) + (let ((message-log-max nil)) + (message string))))) + +(defun ctbl:show-cell-in-tooltip (&optional unless-visible) + "Show cell at point in tooltip. +When UNLESS-VISIBLE is non-nil, show tooltip only when data in +cell is truncated." + (interactive) + (let* ((cp (ctbl:cp-get-component)) + (data (when cp (ctbl:cp-get-selected-data-cell cp)))) + (when data + (let ((string (if (stringp data) data (format "%S" data))) + (width (get-text-property (point) 'ctbl:cell-width))) + (when (or (not unless-visible) + (and (integerp width) (>= (length string) width))) + (ctbl:pop-tooltip string)))))) + +(defvar ctbl:tooltip-delay 1) + +(defvar ctbl:tooltip-timer nil) + +(defun ctbl:start-tooltip-timer () + (unless ctbl:tooltip-timer + (setq ctbl:tooltip-timer + (run-with-idle-timer ctbl:tooltip-delay nil + (lambda () + (ctbl:show-cell-in-tooltip t) + (setq ctbl:tooltip-timer nil)))))) + + +;; Rendering utilities + +(defun ctbl:format-truncate (org limit-width &optional ellipsis) + "[internal] Truncate a string ORG with LIMIT-WIDTH, like `truncate-string-to-width'." + (setq org (replace-regexp-in-string "\n" " " org)) + (if (< limit-width (string-width org)) + (let ((str (truncate-string-to-width + (substring org 0) limit-width 0 nil ellipsis))) + (when (< limit-width (string-width str)) + (setq str (truncate-string-to-width (substring org 0) + limit-width))) + (setq str (propertize str 'mouse-face 'highlight)) + (unless (get-text-property 0 'help-echo str) + (setq str (propertize str 'help-echo org))) + str) + org)) + +(defun ctbl:format-right (width string &optional padding) + "[internal] Format STRING, padding on the left with the character PADDING." + (let* ((padding (or padding ?\ )) + (cnt (or (and string + (ctbl:format-truncate string width t)) + "")) + (len (string-width cnt)) + (margin (max 0 (- width len)))) + (concat (make-string margin padding) cnt))) + +(defun ctbl:format-center (width string &optional padding) + "[internal] Format STRING in the center, padding on the both +sides with the character PADDING." + (let* ((padding (or padding ?\ )) + (cnt (or (and string + (ctbl:format-truncate string width t)) + "")) + (len (string-width cnt)) + (margin (max 0 (/ (- width len) 2)))) + (concat + (make-string margin padding) cnt + (make-string (max 0 (- width len margin)) padding)))) + +(defun ctbl:format-left (width string &optional padding) + "[internal] Format STRING, padding on the right with the character PADDING." + (let* ((padding (or padding ?\ )) + (cnt (or (and string + (ctbl:format-truncate string width t)) + "")) + (len (string-width cnt)) + (margin (max 0 (- width len)))) + (concat cnt (make-string margin padding)))) + +(defun ctbl:sort-string-lessp (i j) + "[internal] String comparator." + (cond + ((string= i j) 0) + ((string< i j) -1) + (t 1))) + +(defun ctbl:sort-number-lessp (i j) + "[internal] Number comparator." + (cond + ((= i j) 0) + ((< i j) -1) + (t 1))) + +(defun ctbl:sort (rows cmodels orders) + "[internal] Sort rows according to order indexes and column models." + (let* + ((comparator + (lambda (ref) + (lexical-let + ((ref ref) + (f (or (ctbl:cmodel-sorter (nth ref cmodels)) + 'ctbl:sort-string-lessp))) + (lambda (i j) + (funcall f (nth ref i) (nth ref j)))))) + (negative-comparator + (lambda (ref) + (lexical-let ((cp (funcall comparator ref))) + (lambda (i j) (- (funcall cp i j)))))) + (to-bool + (lambda (f) + (lexical-let ((f f)) + (lambda (i j) + (< (funcall f i j) 0))))) + (chain + (lambda (fs) + (lexical-let ((fs fs)) + (lambda (i j) + (loop for f in fs + for v = (funcall f i j) + unless (eq 0 v) + return v + finally return 0)))))) + (sort rows + (loop with fs = nil + for o in (reverse (copy-sequence orders)) + for gen = (if (< 0 o) comparator negative-comparator) + for f = (funcall gen (1- (abs o))) + do (push f fs) + finally return (funcall to-bool (funcall chain fs)))))) + +(defun ctbl:string-fill-paragraph (string &optional justify) + "[internal] `fill-paragraph' against STRING." + (with-temp-buffer + (erase-buffer) + (insert string) + (goto-char (point-min)) + (fill-paragraph justify) + (buffer-string))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; CTable API + +;; buffer + +(defun* ctbl:open-table-buffer(&key buffer width height custom-map model param) + "Open a table buffer simply. +This function uses the function +`ctbl:create-table-component-buffer' internally." + (let ((cp (ctbl:create-table-component-buffer + :buffer buffer :width width :height height + :custom-map custom-map :model model :param param))) + (switch-to-buffer (ctbl:cp-get-buffer cp)))) + +(defun* ctbl:create-table-component-buffer(&key buffer width height custom-map model param) + "Return a table buffer with some customize parameters. + +This function binds the component object at the +buffer local variable `ctbl:component'. + +The size of table is calculated from the window that shows BUFFER or the selected window. +BUFFER is the buffer to be rendered. If BUFFER is nil, this function creates a new buffer. +CUSTOM-MAP is the additional keymap that is added to default keymap `ctbl:table-mode-map'." + (let* ((dest (ctbl:dest-init-buffer buffer width height custom-map)) + (cp (ctbl:cp-new dest model param))) + (setf (ctbl:dest-after-update-func dest) + (lambda () + (ctbl:dest-buffer-update-header))) + (with-current-buffer (ctbl:dest-buffer dest) + (set (make-local-variable 'ctbl:component) cp)) + cp)) + +(defun ctbl:dest-buffer-update-header () + "[internal] After auto hscrolling, update the horizontal position of the header line." + (run-at-time 0.01 nil 'ctbl:dest-buffer-update-header--deferred)) + +(defun ctbl:dest-buffer-update-header--deferred () + "[internal] Adjust header line position." + (when (boundp 'ctbl:header-text) + (let* ((left (window-hscroll)) + (text (substring ctbl:header-text left))) + (setq header-line-format text)) + (force-window-update (current-buffer)))) + + +(defun ctbl:popup-table-buffer-easy (rows &optional header-row) + "Popup a table buffer from a list of rows." + (pop-to-buffer (ctbl:create-table-buffer-easy rows header-row))) + +(defun ctbl:open-table-buffer-easy (rows &optional header-row) + "Open a table buffer from a list of rows." + (switch-to-buffer (ctbl:create-table-buffer-easy rows header-row))) + +(defun ctbl:create-table-buffer-easy (rows &optional header-row) + "Return a table buffer from a list of rows." + (ctbl:cp-get-buffer + (ctbl:create-table-component-buffer + :model (ctbl:make-model-from-list rows header-row)))) + +(defun ctbl:make-model-from-list (rows &optional header-row) + "Make a `ctbl:model' instance from a list of rows." + (let* ((col-num (or (and header-row (length header-row)) + (and (car rows) (length (car rows))))) + (column-models + (if header-row + (loop for i in header-row + collect (make-ctbl:cmodel :title (format "%s" i) :min-width 5)) + (loop for i from 0 below col-num + for ch = (char-to-string (+ ?A i)) + collect (make-ctbl:cmodel :title ch :min-width 5))))) + (make-ctbl:model + :column-model column-models :data rows))) + +;; region + +(defun* ctbl:create-table-component-region(&key width height keymap model param) + "Insert markers of the rendering destination at current point and display the table view. + +This function returns a component object and stores it at the text property `ctbl:component'. + +WIDTH and HEIGHT are reference size of the table view. If those are nil, the size is calculated from the selected window. +KEYMAP is the keymap that is put to the text property `keymap'. If KEYMAP is nil, `ctbl:table-mode-map' is used." + (let (mark-begin mark-end) + (setq mark-begin (point-marker)) + (insert " ") + (setq mark-end (point-marker)) + (save-excursion + (let* ((dest (ctbl:dest-init-region (current-buffer) mark-begin mark-end width height)) + (cp (ctbl:cp-new dest model param)) + (after-update-func + (lexical-let ((keymap keymap) (cp cp)) + (lambda () + (ctbl:dest-with-region (ctbl:component-dest cp) + (let (buffer-read-only) + (put-text-property (point-min) (1- (point-max)) + 'ctbl:component cp) + (ctbl:fill-keymap-property + (point-min) (1- (point-max)) + (or keymap ctbl:table-mode-map)))))))) + (setf (ctbl:dest-after-update-func dest) after-update-func) + (funcall after-update-func) + cp)))) + + +;; inline + +(defun* ctbl:get-table-text(&key width height model param) + "Return a text that is drew the table view. + +In this case, the rendering destination object is disposable. So, +one can not modify the obtained text with `ctbl:xxx' functions. + +WIDTH and HEIGHT are reference size of the table view." + (let* ((dest (ctbl:dest-init-inline width height)) + (cp (ctbl:cp-new dest model param)) + text) + (setq text + (with-current-buffer (ctbl:cp-get-buffer cp) + (buffer-substring (point-min) (point-max)))) + (kill-buffer (ctbl:cp-get-buffer cp)) + text)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Demo + +(defun ctbl:demo () + "Sample code for implementation for the table model." + (interactive) + (let ((param (copy-ctbl:param ctbl:default-rendering-param))) + ;; rendering parameters + ;;(setf (ctbl:param-display-header param) nil) + (setf (ctbl:param-fixed-header param) t) + (setf (ctbl:param-hline-colors param) + '((0 . "#00000") (1 . "#909090") (-1 . "#ff0000") (t . "#00ff00"))) + (setf (ctbl:param-draw-hlines param) + (lambda (model row-index) + (cond ((memq row-index '(0 1 -1)) t) + (t (= 0 (% (1- row-index) 5)))))) + (setf (ctbl:param-bg-colors param) + (lambda (model row-id col-id str) + (cond ((string-match "CoCo" str) "LightPink") + ((= 0 (% (1- row-index) 2)) "Darkseagreen1") + (t nil)))) + (let ((cp + (ctbl:create-table-component-buffer + :width nil :height nil + :model + (make-ctbl:model + :column-model + (list (make-ctbl:cmodel + :title "A" :sorter 'ctbl:sort-number-lessp + :min-width 5 :align 'right) + (make-ctbl:cmodel + :title "Title" :align 'center + :sorter (lambda (a b) (ctbl:sort-number-lessp (length a) (length b)))) + (make-ctbl:cmodel + :title "Comment" :align 'left)) + :data + '((1 "Bon Tanaka" "8 Year Curry." 'a) + (2 "Bon Tanaka" "Nan-ban Curry." 'b) + (3 "Bon Tanaka" "Half Curry." 'c) + (4 "Bon Tanaka" "Katsu Curry." 'd) + (5 "Bon Tanaka" "Gyu-don." 'e) + (6 "CoCo Ichi" "Beaf Curry." 'f) + (7 "CoCo Ichi" "Poke Curry." 'g) + (8 "CoCo Ichi" "Yasai Curry." 'h) + (9 "Berkley" "Hamburger Curry." 'i) + (10 "Berkley" "Lunch set." 'j) + (11 "Berkley" "Coffee." k)) + :sort-state + '(2 1) + ) + :param param))) + (ctbl:cp-add-click-hook + cp (lambda () (message "CTable : Click Hook [%S]" + (ctbl:cp-get-selected-data-row cp)))) + (ctbl:cp-add-selection-change-hook cp (lambda () (message "CTable : Select Hook"))) + (ctbl:cp-add-update-hook cp (lambda () (message "CTable : Update Hook"))) + (switch-to-buffer (ctbl:cp-get-buffer cp))))) + +;; (progn (eval-current-buffer) (ctbl:demo)) + +(provide 'ctable) +;;; ctable.el ends here diff --git a/elpa/ctable-0.1.2/ctable.elc b/elpa/ctable-0.1.2/ctable.elc new file mode 100644 index 0000000000000000000000000000000000000000..8371cfd690edb9e46c4fe60fb1ddac01024cb933 GIT binary patch literal 148944 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 RP*UE(J)a47IgAU_{|jo6Za4q{ literal 0 HcmV?d00001 diff --git a/elpa/deferred-0.3.2/deferred-autoloads.el b/elpa/deferred-0.3.2/deferred-autoloads.el new file mode 100644 index 000000000..9b3da053e --- /dev/null +++ b/elpa/deferred-0.3.2/deferred-autoloads.el @@ -0,0 +1,18 @@ +;;; deferred-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads nil nil ("deferred-pkg.el" "deferred.el") (21566 +;;;;;; 24343 236023 287000)) + +;;;*** + +(provide 'deferred-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; deferred-autoloads.el ends here diff --git a/elpa/deferred-0.3.2/deferred-pkg.el b/elpa/deferred-0.3.2/deferred-pkg.el new file mode 100644 index 000000000..241577ed8 --- /dev/null +++ b/elpa/deferred-0.3.2/deferred-pkg.el @@ -0,0 +1 @@ +(define-package "deferred" "0.3.2" "Simple asynchronous functions for emacs lisp" (quote nil)) diff --git a/elpa/deferred-0.3.2/deferred-pkg.elc b/elpa/deferred-0.3.2/deferred-pkg.elc new file mode 100644 index 0000000000000000000000000000000000000000..601741846fe8a0d408ff0ad368c103d8ba68c2ce GIT binary patch literal 658 zcmbtRO;5ux4BfeZfUC6=NNc)vLu~8-8EozU{0d18+NMF*O$BtDz6nO`>qap}x#}=DFJ6R3B9xtWn$} zYf{>`;2B<|`cWsCUBdM0da=Boub`aH76X431XPIv6pe4GIMOH-wWy;q1-T9jLluQU zCZDRgD*v9{wpQc@O3QG!FM)Ro(Mkj5VvikiA2v0B&VlceZS5x}0YsGz$>+w#Loa=# z2xiCFS`EhQn1baxP9z&*0yIWu`qi1ORJl6hFkU#=C(xb~3b;>IzLX!%Z=W{z_n;dL zsAY|DGRPwvh#oXDyb(B$|3tori9i^fr2wfBU^zeNid84YzJXIC%d&H^$1>#|>Mhm; s;~%@mFdht(^U1cI*o|?=x(S|rFH7%P4^BYk0}O_Pv#}ckTX&It0h=<(i2wiq literal 0 HcmV?d00001 diff --git a/elpa/deferred-0.3.2/deferred.el b/elpa/deferred-0.3.2/deferred.el new file mode 100644 index 000000000..877f88a5f --- /dev/null +++ b/elpa/deferred-0.3.2/deferred.el @@ -0,0 +1,953 @@ +;;; deferred.el --- Simple asynchronous functions for emacs lisp + +;; Copyright (C) 2010, 2011, 2012 SAKURAI Masashi + +;; Author: SAKURAI Masashi +;; Version: 0.3.2 +;; X-Original-Version: 0.3.2 +;; Keywords: deferred, async +;; URL: https://github.com/kiwanami/emacs-deferred + +;; 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 . + +;;; Commentary: + +;; 'deferred.el' is a simple library for asynchronous tasks. +;; [https://github.com/kiwanami/emacs-deferred] + +;; The API is almost the same as JSDeferred written by cho45. See the +;; JSDeferred and Mochikit.Async web sites for further documentations. +;; [https://github.com/cho45/jsdeferred] +;; [http://mochikit.com/doc/html/MochiKit/Async.html] + +;; A good introduction document (JavaScript) +;; [http://cho45.stfuawsc.com/jsdeferred/doc/intro.en.html] + +;;; Samples: + +;; ** HTTP Access + +;; (require 'url) +;; (deferred:$ +;; (deferred:url-retrieve "http://www.gnu.org") +;; (deferred:nextc it +;; (lambda (buf) +;; (insert (with-current-buffer buf (buffer-string))) +;; (kill-buffer buf)))) + +;; ** Invoking command tasks + +;; (deferred:$ +;; (deferred:process "wget" "-O" "a.jpg" "http://www.gnu.org/software/emacs/tour/images/splash.png") +;; (deferred:nextc it +;; (lambda (x) (deferred:process "convert" "a.jpg" "-resize" "100x100" "jpg:b.jpg"))) +;; (deferred:nextc it +;; (lambda (x) +;; (insert-image (create-image (expand-file-name "b.jpg") 'jpeg nil))))) + +;; See the readme for further API documentation. + +;; ** Applications + +;; *Inertial scrolling for Emacs +;; [https://github.com/kiwanami/emacs-inertial-scroll] + +;; This program makes simple multi-thread function, using +;; deferred.el. + +(eval-when-compile + (require 'cl)) + +(defvar deferred:version nil "deferred.el version") +(setq deferred:version "0.3.2") + +;;; Code: + +(defmacro deferred:aand (test &rest rest) + "[internal] Anaphoric AND." + (declare (debug ("test" form &rest form))) + `(let ((it ,test)) + (if it ,(if rest `(deferred:aand ,@rest) 'it)))) + +(defmacro deferred:$ (&rest elements) + "Anaphoric function chain macro for deferred chains." + (declare (debug (&rest form))) + `(let (it) + ,@(loop for i in elements + with it = nil + collect + `(setq it ,i)) + it)) + +(defmacro deferred:lambda (args &rest body) + "Anaphoric lambda macro for self recursion." + (declare (debug ("args" form &rest form))) + (let ((argsyms (loop for i in args collect (gensym)))) + `(lambda (,@argsyms) + (lexical-let (self) + (setq self (lambda( ,@args ) ,@body)) + (funcall self ,@argsyms))))) + +(defun deferred:setTimeout (f msec) + "[internal] Timer function that emulates the `setTimeout' function in JS." + (run-at-time (/ msec 1000.0) nil f)) + +(defun deferred:cancelTimeout (id) + "[internal] Timer cancellation function that emulates the `cancelTimeout' function in JS." + (cancel-timer id)) + +(defun deferred:run-with-idle-timer (sec f) + "[internal] Wrapper function for run-with-idle-timer." + (run-with-idle-timer sec nil f)) + +(defun deferred:call-lambda (f &optional arg) + "[internal] Call a function with one or zero argument safely. +The lambda function can define with zero and one argument." + (condition-case err + (funcall f arg) + ('wrong-number-of-arguments + (display-warning 'deferred "\ +Callback that takes no argument may be specified. +Passing callback with no argument is deprecated. +Callback must take one argument. +Or, this error is coming from somewhere inside of the callback: %S" err) + (condition-case err2 + (funcall f) + ('wrong-number-of-arguments + (signal 'wrong-number-of-arguments (cdr err))))))) ; return the first error + +;; debug + +(eval-and-compile + (defvar deferred:debug nil "Debug output switch.")) +(defvar deferred:debug-count 0 "[internal] Debug output counter.") + +(defmacro deferred:message (&rest args) + "[internal] Debug log function." + (when deferred:debug + `(progn + (with-current-buffer (get-buffer-create "*deferred:debug*") + (save-excursion + (goto-char (point-max)) + (insert (format "%5i %s\n" deferred:debug-count (format ,@args))))) + (incf deferred:debug-count)))) + +(defun deferred:message-mark () + "[internal] Debug log function." + (interactive) + (deferred:message "==================== mark ==== %s" + (format-time-string "%H:%M:%S" (current-time)))) + +(defun deferred:pp (d) + (require 'pp) + (deferred:$ + (deferred:nextc d + (lambda (x) + (pp-display-expression x "*deferred:pp*"))) + (deferred:error it + (lambda (e) + (pp-display-expression e "*deferred:pp*"))) + (deferred:nextc it + (lambda (x) (pop-to-buffer "*deferred:pp*"))))) + +(defvar deferred:debug-on-signal nil +"If non nil, the value `debug-on-signal' is substituted this +value in the `condition-case' form in deferred +implementations. Then, Emacs debugger can catch an error occurred +in the asynchronous tasks.") + +(defmacro deferred:condition-case (var protected-form &rest handlers) + "[internal] Custom condition-case. See the comment for +`deferred:debug-on-signal'." + (declare (debug (symbolp form &rest form))) + `(cond + ((null deferred:debug-on-signal) + (condition-case ,var ,protected-form ,@handlers)) + (t + (let ((deferred:debug-on-signal-backup debug-on-signal)) + (setq debug-on-signal deferred:debug-on-signal) + (unwind-protect + (condition-case ,var ,protected-form ,@handlers) + (setq debug-on-signal deferred:debug-on-signal-backup)))))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Back end functions of deferred tasks + +(defvar deferred:tick-time 0.001 + "Waiting time between asynchronous tasks (second). +The shorter waiting time increases the load of Emacs. The end +user can tune this paramter. However, applications should not +modify it because the applications run on various environments.") + +(defvar deferred:queue nil + "[internal] The execution queue of deferred objects. +See the functions `deferred:post-task' and `deferred:worker'.") + +(defmacro deferred:pack (a b c) + `(cons ,a (cons ,b ,c))) + +(defun deferred:schedule-worker () + "[internal] Schedule consuming a deferred task in the execution queue." + (run-at-time deferred:tick-time nil 'deferred:worker)) + +(defun deferred:post-task (d which &optional arg) + "[internal] Add a deferred object to the execution queue +`deferred:queue' and schedule to execute. +D is a deferred object. WHICH is a symbol, `ok' or `ng'. ARG is +an argument value for execution of the deferred task." + (push (deferred:pack d which arg) deferred:queue) + (deferred:message "QUEUE-POST [%s]: %s" + (length deferred:queue) (deferred:pack d which arg)) + (deferred:schedule-worker) + d) + +(defun deferred:clear-queue () + "Clear the execution queue. For test and debugging." + (interactive) + (deferred:message "QUEUE-CLEAR [%s -> 0]" (length deferred:queue)) + (setq deferred:queue nil)) + +(defun deferred:esc-msg (msg) + "[internal] Escaping the character '%'." + (replace-regexp-in-string + "\\([^%]\\|^\\)%\\([^%]\\)" "\\1%%\\2" msg)) + +(defun deferred:worker () + "[internal] Consume a deferred task. +Mainly this function is called by timer asynchronously." + (when deferred:queue + (let* ((pack (car (last deferred:queue))) + (d (car pack)) + (which (cadr pack)) + (arg (cddr pack)) value) + (setq deferred:queue (nbutlast deferred:queue)) + (condition-case err + (setq value (deferred:exec-task d which arg)) + (error + (deferred:message "ERROR : %s" err) + (message "deferred error : %s" err))) + value))) + +(defun deferred:flush-queue! () + "Call all deferred tasks synchronously. For test and debugging." + (let (value) + (while deferred:queue + (setq value (deferred:worker))) + value)) + +(defun deferred:sync! (d) + "Wait for the given deferred task. For test and debugging." + (progn + (lexical-let ((last-value 'deferred:undefined*)) + (deferred:nextc d + (lambda (x) (setq last-value x))) + (while (eq 'deferred:undefined* last-value) + (sit-for 0.05) + (sleep-for 0.05)) + last-value))) + + + +;; Struct: deferred +;; +;; callback : a callback function (default `deferred:default-callback') +;; errorback : an errorback function (default `deferred:default-errorback') +;; cancel : a canceling function (default `deferred:default-cancel') +;; next : a next chained deferred object (default nil) +;; status : if 'ok or 'ng, this deferred has a result (error) value. (default nil) +;; value : saved value (default nil) +;; +(defstruct deferred + (callback 'deferred:default-callback) + (errorback 'deferred:default-errorback) + (cancel 'deferred:default-cancel) + next status value) + +(defun deferred:default-callback (i) + "[internal] Default callback function." + (identity i)) + +(defun deferred:default-errorback (error-msg) + "[internal] Default errorback function." + (error (deferred:esc-msg + (cond + ((stringp error-msg) error-msg) + ((listp error-msg) (cadr error-msg)) + (t (format "%S" error-msg)))))) + +(defun deferred:default-cancel (d) + "[internal] Default canceling function." + (deferred:message "CANCEL : %s" d) + (setf (deferred-callback d) 'deferred:default-callback) + (setf (deferred-errorback d) 'deferred:default-errorback) + (setf (deferred-next d) nil) + d) + +(defun deferred:exec-task (d which &optional arg) + "[internal] Executing deferred task. If the deferred object has +next deferred task or the return value is a deferred object, this +function adds the task to the execution queue. +D is a deferred object. WHICH is a symbol, `ok' or `ng'. ARG is +an argument value for execution of the deferred task." + (deferred:message "EXEC : %s / %s / %s" d which arg) + (when (null d) (error "deferred:exec-task was given a nil.")) + (let ((callback (if (eq which 'ok) + (deferred-callback d) + (deferred-errorback d)))) + (cond + (callback + (let (value (next-deferred (deferred-next d))) + (deferred:condition-case err + (progn + (setq value + (deferred:call-lambda callback arg)) + (cond + ((deferred-p value) + (deferred:message "WAIT NEST : %s" value) + (if next-deferred + (deferred:set-next value next-deferred) + value)) + (t + (if next-deferred + (deferred:post-task next-deferred 'ok value) + (setf (deferred-status d) 'ok) + (setf (deferred-value d) value) + value)))) + (error + (cond + (next-deferred + (deferred:post-task next-deferred 'ng (error-message-string err))) + (deferred:onerror + (deferred:call-lambda deferred:onerror err)) + (t + (deferred:message "ERROR : %s" err) + (message "deferred error : %s" err) + (setf (deferred-status d) 'ng) + (setf (deferred-value d) (error-message-string err)) + (deferred:esc-msg (error-message-string err)))))))) + (t ; <= (null callback) + (let ((next-deferred (deferred-next d))) + (cond + (next-deferred + (deferred:exec-task next-deferred which arg)) + ((eq which 'ok) arg) + (t (error (deferred:esc-msg arg))))))))) + +(defun deferred:set-next (prev next) + "[internal] Connect deferred objects." + (setf (deferred-next prev) next) + (cond + ((eq 'ok (deferred-status prev)) + (setf (deferred-status prev) nil) + (let ((ret (deferred:exec-task + next 'ok (deferred-value prev)))) + (if (deferred-p ret) ret + next))) + ((eq 'ng (deferred-status prev)) + (setf (deferred-status prev) nil) + (let ((ret (deferred:exec-task next 'ng (deferred-value prev)))) + (if (deferred-p ret) ret + next))) + (t + next))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Basic functions for deferred objects + +(defun deferred:new (&optional callback) + "Create a deferred object." + (if callback + (make-deferred :callback callback) + (make-deferred))) + +(defun deferred:callback (d &optional arg) + "Start deferred chain with a callback message." + (deferred:exec-task d 'ok arg)) + +(defun deferred:errorback (d &optional arg) + "Start deferred chain with an errorback message." + (deferred:exec-task d 'ng arg)) + +(defun deferred:callback-post (d &optional arg) + "Add the deferred object to the execution queue." + (deferred:post-task d 'ok arg)) + +(defun deferred:errorback-post (d &optional arg) + "Add the deferred object to the execution queue." + (deferred:post-task d 'ng arg)) + +(defun deferred:cancel (d) + "Cancel all callbacks and deferred chain in the deferred object." + (deferred:message "CANCEL : %s" d) + (funcall (deferred-cancel d) d) + d) + +(defun deferred:status (d) + "Return a current status of the deferred object. The returned value means following: +`ok': the callback was called and waiting for next deferred. +`ng': the errorback was called and waiting for next deferred. + nil: The neither callback nor errorback was not called." + (deferred-status d)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Basic utility functions + +(defvar deferred:onerror nil + "Default error handler. This value is nil or a function that + have one argument for the error message.") + +(defun deferred:succeed (&optional arg) + "Create a synchronous deferred object." + (let ((d (deferred:new))) + (deferred:exec-task d 'ok arg) + d)) + +(defun deferred:fail (&optional arg) + "Create a synchronous deferred object." + (let ((d (deferred:new))) + (deferred:exec-task d 'ng arg) + d)) + +(defun deferred:next (&optional callback arg) + "Create a deferred object and schedule executing. This function +is a short cut of following code: + (deferred:callback-post (deferred:new callback))." + (let ((d (if callback + (make-deferred :callback callback) + (make-deferred)))) + (deferred:callback-post d arg) + d)) + +(defun deferred:nextc (d callback) + "Create a deferred object with OK callback and connect it to the given deferred object." + (let ((nd (make-deferred :callback callback))) + (deferred:set-next d nd))) + +(defun deferred:error (d callback) + "Create a deferred object with errorback and connect it to the given deferred object." + (let ((nd (make-deferred :errorback callback))) + (deferred:set-next d nd))) + +(defun deferred:watch (d callback) + "Create a deferred object with watch task and connect it to the given deferred object. +The watch task CALLBACK can not affect deferred chains with +return values. This function is used in following purposes, +simulation of try-finally block in asynchronous tasks, progress +monitoring of tasks." + (lexical-let* + ((callback callback) + (normal (lambda (x) (ignore-errors (deferred:call-lambda callback x)) x)) + (err (lambda (e) (ignore-errors (deferred:call-lambda callback e)) (error e)))) + (let ((nd (make-deferred :callback normal :errorback err))) + (deferred:set-next d nd)))) + +(defun deferred:wait (msec) + "Return a deferred object scheduled at MSEC millisecond later." + (lexical-let + ((d (deferred:new)) (start-time (float-time)) timer) + (deferred:message "WAIT : %s" msec) + (setq timer (deferred:setTimeout + (lambda () + (deferred:exec-task d 'ok + (* 1000.0 (- (float-time) start-time))) + nil) msec)) + (setf (deferred-cancel d) + (lambda (x) + (deferred:cancelTimeout timer) + (deferred:default-cancel x))) + d)) + +(defun deferred:wait-idle (msec) + "Return a deferred object which will run when Emacs has been +idle for MSEC millisecond." + (lexical-let + ((d (deferred:new)) (start-time (float-time)) timer) + (deferred:message "WAIT-IDLE : %s" msec) + (setq timer + (deferred:run-with-idle-timer + (/ msec 1000.0) + (lambda () + (deferred:exec-task d 'ok + (* 1000.0 (- (float-time) start-time))) + nil))) + (setf (deferred-cancel d) + (lambda (x) + (deferred:cancelTimeout timer) + (deferred:default-cancel x))) + d)) + +(defun deferred:call (f &rest args) + "Call the given function asynchronously." + (lexical-let ((f f) (args args)) + (deferred:next + (lambda (x) + (apply f args))))) + +(defun deferred:apply (f &optional args) + "Call the given function asynchronously." + (lexical-let ((f f) (args args)) + (deferred:next + (lambda (x) + (apply f args))))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Utility functions + +(defun deferred:empty-p (times-or-list) + "[internal] Return non-nil if TIMES-OR-LIST is the number zero or nil." + (or (and (numberp times-or-list) (<= times-or-list 0)) + (and (listp times-or-list) (null times-or-list)))) + +(defun deferred:loop (times-or-list func) + "Return a iteration deferred object." + (deferred:message "LOOP : %s" times-or-list) + (if (deferred:empty-p times-or-list) (deferred:next) + (lexical-let* + (items (rd + (cond + ((numberp times-or-list) + (loop for i from 0 below times-or-list + with ld = (deferred:next) + do + (push ld items) + (setq ld + (lexical-let ((i i) (func func)) + (deferred:nextc ld (lambda (x) (deferred:call-lambda func i))))) + finally return ld)) + ((listp times-or-list) + (loop for i in times-or-list + with ld = (deferred:next) + do + (push ld items) + (setq ld + (lexical-let ((i i) (func func)) + (deferred:nextc ld (lambda (x) (deferred:call-lambda func i))))) + finally return ld))))) + (setf (deferred-cancel rd) + (lambda (x) (deferred:default-cancel x) + (loop for i in items + do (deferred:cancel i)))) + rd))) + +(defun deferred:trans-multi-args (args self-func list-func main-func) + "[internal] Check the argument values and dispatch to methods." + (cond + ((and (= 1 (length args)) (consp (car args)) (not (functionp (car args)))) + (let ((lst (car args))) + (cond + ((or (null lst) (null (car lst))) + (deferred:next)) + ((deferred:aand lst (car it) (or (functionp it) (deferred-p it))) + ;; a list of deferred objects + (funcall list-func lst)) + ((deferred:aand lst (consp it)) + ;; an alist of deferred objects + (funcall main-func lst)) + (t (error "Wrong argument type. %s" args))))) + (t (funcall self-func args)))) + +(defun deferred:parallel-array-to-alist (lst) + "[internal] Translation array to alist." + (loop for d in lst + for i from 0 below (length lst) + collect (cons i d))) + +(defun deferred:parallel-alist-to-array (alst) + "[internal] Translation alist to array." + (loop for pair in + (sort alst (lambda (x y) + (< (car x) (car y)))) + collect (cdr pair))) + +(defun deferred:parallel-func-to-deferred (alst) + "[internal] Normalization for parallel and earlier arguments." + (loop for pair in alst + for d = (cdr pair) + collect + (progn + (unless (deferred-p d) + (setf (cdr pair) (deferred:next d))) + pair))) + +(defun deferred:parallel-main (alst) + "[internal] Deferred alist implementation for `deferred:parallel'. " + (deferred:message "PARALLEL" ) + (lexical-let ((nd (deferred:new)) + (len (length alst)) + values) + (loop for pair in + (deferred:parallel-func-to-deferred alst) + with cd ; current child deferred + do + (lexical-let ((name (car pair))) + (setq cd + (deferred:nextc (cdr pair) + (lambda (x) + (push (cons name x) values) + (deferred:message "PARALLEL VALUE [%s/%s] %s" + (length values) len (cons name x)) + (when (= len (length values)) + (deferred:message "PARALLEL COLLECTED") + (deferred:post-task nd 'ok (nreverse values))) + nil))) + (deferred:error cd + (lambda (e) + (push (cons name e) values) + (deferred:message "PARALLEL ERROR [%s/%s] %s" + (length values) len (cons name e)) + (when (= (length values) len) + (deferred:message "PARALLEL COLLECTED") + (deferred:post-task nd 'ok (nreverse values))) + nil)))) + nd)) + +(defun deferred:parallel-list (lst) + "[internal] Deferred list implementation for `deferred:parallel'. " + (deferred:message "PARALLEL" ) + (lexical-let* + ((pd (deferred:parallel-main (deferred:parallel-array-to-alist lst))) + (rd (deferred:nextc pd 'deferred:parallel-alist-to-array))) + (setf (deferred-cancel rd) + (lambda (x) (deferred:default-cancel x) + (deferred:cancel pd))) + rd)) + +(defun deferred:parallel (&rest args) + "Return a deferred object that calls given deferred objects or +functions in parallel and wait for all callbacks. The following +deferred task will be called with an array of the return +values. ARGS can be a list or an alist of deferred objects or +functions." + (deferred:message "PARALLEL : %s" args) + (deferred:trans-multi-args args + 'deferred:parallel 'deferred:parallel-list 'deferred:parallel-main)) + +(defun deferred:earlier-main (alst) + "[internal] Deferred alist implementation for `deferred:earlier'. " + (deferred:message "EARLIER" ) + (lexical-let ((nd (deferred:new)) + (len (length alst)) + value results) + (loop for pair in + (deferred:parallel-func-to-deferred alst) + with cd ; current child deferred + do + (lexical-let ((name (car pair))) + (setq cd + (deferred:nextc (cdr pair) + (lambda (x) + (push (cons name x) results) + (cond + ((null value) + (setq value (cons name x)) + (deferred:message "EARLIER VALUE %s" (cons name value)) + (deferred:post-task nd 'ok value)) + (t + (deferred:message "EARLIER MISS [%s/%s] %s" (length results) len (cons name value)) + (when (eql (length results) len) + (deferred:message "EARLIER COLLECTED")))) + nil))) + (deferred:error cd + (lambda (e) + (push (cons name e) results) + (deferred:message "EARLIER ERROR [%s/%s] %s" (length results) len (cons name e)) + (when (and (eql (length results) len) (null value)) + (deferred:message "EARLIER FAILED") + (deferred:post-task nd 'ok nil)) + nil)))) + nd)) + +(defun deferred:earlier-list (lst) + "[internal] Deferred list implementation for `deferred:earlier'. " + (deferred:message "EARLIER" ) + (lexical-let* + ((pd (deferred:earlier-main (deferred:parallel-array-to-alist lst))) + (rd (deferred:nextc pd (lambda (x) (cdr x))))) + (setf (deferred-cancel rd) + (lambda (x) (deferred:default-cancel x) + (deferred:cancel pd))) + rd)) + + +(defun deferred:earlier (&rest args) + "Return a deferred object that calls given deferred objects or +functions in parallel and wait for the first callback. The +following deferred task will be called with the first return +value. ARGS can be a list or an alist of deferred objects or +functions." + (deferred:message "EARLIER : %s" args) + (deferred:trans-multi-args args + 'deferred:earlier 'deferred:earlier-list 'deferred:earlier-main)) + +(defmacro deferred:timeout (timeout-msec timeout-form d) + "Time out macro on a deferred task D. If the deferred task D +does not complete within TIMEOUT-MSEC, this macro cancels the +deferred task and return the TIMEOUT-FORM." + `(deferred:earlier + (deferred:nextc (deferred:wait ,timeout-msec) + (lambda (x) ,timeout-form)) + ,d)) + +(defmacro* deferred:try (d &key catch finally) + "Try-catch-finally macro. This macro simulates the +try-catch-finally block asynchronously. CATCH and FINALLY can be +nil. Because of asynchrony, this macro does not ensure that the +task FINALLY should be called." + (let ((chain + (if catch `((deferred:error it ,catch))))) + (when finally + (setq chain (append chain `((deferred:watch it ,finally))))) + `(deferred:$ ,d ,@chain))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Application functions + +(defvar deferred:uid 0 "[internal] Sequence number for some utilities. See the function `deferred:uid'.") + +(defun deferred:uid () + "[internal] Generate a sequence number." + (incf deferred:uid)) + +(defun deferred:buffer-string (strformat buf) + "[internal] Return a string in the buffer with the given format." + (format strformat + (with-current-buffer buf (buffer-string)))) + +(defun deferred:process (command &rest args) + "A deferred wrapper of `start-process'. Return a deferred +object. The process name and buffer name of the argument of the +`start-process' are generated by this function automatically. +The next deferred object receives stdout string from the command +process." + (deferred:process-gen 'start-process command args)) + +(defun deferred:process-shell (command &rest args) + "A deferred wrapper of `start-process-shell-command'. Return a deferred +object. The process name and buffer name of the argument of the +`start-process-shell-command' are generated by this function automatically. +The next deferred object receives stdout string from the command +process." + (deferred:process-gen 'start-process-shell-command command args)) + +(defun deferred:process-buffer (command &rest args) + "A deferred wrapper of `start-process'. Return a deferred +object. The process name and buffer name of the argument of the +`start-process' are generated by this function automatically. +The next deferred object receives stdout buffer from the command +process." + (deferred:process-buffer-gen 'start-process command args)) + +(defun deferred:process-shell-buffer (command &rest args) + "A deferred wrapper of `start-process-shell-command'. Return a deferred +object. The process name and buffer name of the argument of the +`start-process-shell-command' are generated by this function automatically. +The next deferred object receives stdout buffer from the command +process." + (deferred:process-buffer-gen 'start-process-shell-command command args)) + +(defun deferred:process-gen (f command args) + "[internal]" + (lexical-let + ((pd (deferred:process-buffer-gen f command args)) d) + (setq d (deferred:nextc pd + (lambda (buf) + (prog1 + (with-current-buffer buf (buffer-string)) + (kill-buffer buf))))) + (setf (deferred-cancel d) + (lambda (x) + (deferred:default-cancel d) + (deferred:default-cancel pd))) + d)) + +(defun deferred:process-buffer-gen (f command args) + "[internal]" + (let ((d (deferred:next)) (uid (deferred:uid))) + (lexical-let + ((f f) (command command) (args args) + (proc-name (format "*deferred:*%s*:%s" command uid)) + (buf-name (format " *deferred:*%s*:%s" command uid)) + (pwd default-directory) + (nd (deferred:new)) proc-buf proc) + (deferred:nextc d + (lambda (x) + (setq proc-buf (get-buffer-create buf-name)) + (condition-case err + (let ((default-directory pwd)) + (setq proc + (if (null (car args)) + (apply f proc-name buf-name command nil) + (apply f proc-name buf-name command args))) + (set-process-sentinel + proc + (lambda (proc event) + (cond + ((string-match "exited abnormally" event) + (let ((msg (if (buffer-live-p proc-buf) + (deferred:buffer-string + (format "Process [%s] exited abnormally : %%s" + command) proc-buf) + (concat "Process exited abnormally: " proc-name)))) + (kill-buffer proc-buf) + (deferred:post-task nd 'ng msg))) + ((equal event "finished\n") + (deferred:post-task nd 'ok proc-buf))))) + (setf (deferred-cancel nd) + (lambda (x) (deferred:default-cancel x) + (when proc + (kill-process proc) + (kill-buffer proc-buf))))) + (error (deferred:post-task nd 'ng (error-message-string err)))) + nil)) + nd))) + +(defmacro deferred:processc (d command &rest args) + "Process chain of `deferred:process'." + `(deferred:nextc ,d + (lambda (,(gensym)) (deferred:process ,command ,@args)))) + +(defmacro deferred:process-bufferc (d command &rest args) + "Process chain of `deferred:process-buffer'." + `(deferred:nextc ,d + (lambda (,(gensym)) (deferred:process-buffer ,command ,@args)))) + +(defmacro deferred:process-shellc (d command &rest args) + "Process chain of `deferred:process'." + `(deferred:nextc ,d + (lambda (,(gensym)) (deferred:process-shell ,command ,@args)))) + +(defmacro deferred:process-shell-bufferc (d command &rest args) + "Process chain of `deferred:process-buffer'." + `(deferred:nextc ,d + (lambda (,(gensym)) (deferred:process-shell-buffer ,command ,@args)))) + +(eval-after-load "url" + ;; for url package + ;; TODO: proxy, charaset + '(progn + + (defun deferred:url-retrieve (url &optional cbargs) + "A wrapper function for url-retrieve. The next deferred +object receives the buffer object that URL will load +into. Currently dynamic binding variables are not supported." + (lexical-let ((nd (deferred:new)) (url url) (cbargs cbargs) buf) + (deferred:next + (lambda (x) + (condition-case err + (setq buf + (url-retrieve + url (lambda (xx) (deferred:post-task nd 'ok buf)) + cbargs)) + (error (deferred:post-task nd 'ng err))) + nil)) + (setf (deferred-cancel nd) + (lambda (x) + (when (buffer-live-p buf) + (kill-buffer buf)))) + nd)) + + (defun deferred:url-delete-header (buf) + (with-current-buffer buf + (let ((pos (url-http-symbol-value-in-buffer + 'url-http-end-of-headers buf))) + (when pos + (delete-region (point-min) (1+ pos))))) + buf) + + (defun deferred:url-delete-buffer (buf) + (when (and buf (buffer-live-p buf)) + (kill-buffer buf)) + nil) + + (defun deferred:url-get (url &optional params) + "Perform a HTTP GET method with `url-retrieve'. PARAMS is +a parameter list of (key . value) or key. The next deferred +object receives the buffer object that URL will load into." + (when params + (setq url + (concat url "?" (deferred:url-param-serialize params)))) + (let ((d (deferred:$ + (deferred:url-retrieve url) + (deferred:nextc it 'deferred:url-delete-header)))) + (deferred:set-next + d (deferred:new 'deferred:url-delete-buffer)) + d)) + + (defun deferred:url-post (url &optional params) + "Perform a HTTP POST method with `url-retrieve'. PARAMS is +a parameter list of (key . value) or key. The next deferred +object receives the buffer object that URL will load into." + (lexical-let ((nd (deferred:new)) + (url url) (params params) + buf) + (deferred:next + (lambda (x) + (let ((url-request-method "POST") + (url-request-extra-headers + '(("Content-Type" . "application/x-www-form-urlencoded"))) + (url-request-data + (deferred:url-param-serialize params))) + (condition-case err + (setq buf + (url-retrieve + url + (lambda (&rest args) + (deferred:post-task nd 'ok buf)))) + (error (deferred:post-task nd 'ng err)))) + nil)) + (setf (deferred-cancel nd) + (lambda (x) + (when (buffer-live-p buf) + (kill-buffer buf)))) + (let ((d (deferred:nextc nd 'deferred:url-delete-header))) + (deferred:set-next + d (deferred:new 'deferred:url-delete-buffer)) + d))) + + (defun deferred:url-escape (val) + "[internal] Return a new string that is VAL URI-encoded." + (unless (stringp val) + (setq val (format "%s" val))) + (url-hexify-string + (encode-coding-string val 'utf-8))) + + (defun deferred:url-param-serialize (params) + "[internal] Serialize a list of (key . value) cons cells +into a query string." + (when params + (mapconcat + 'identity + (loop for p in params + collect + (cond + ((consp p) + (concat + (deferred:url-escape (car p)) "=" + (deferred:url-escape (cdr p)))) + (t + (deferred:url-escape p)))) + "&"))) + )) + + +(provide 'deferred) +;;; deferred.el ends here diff --git a/elpa/deferred-0.3.2/deferred.elc b/elpa/deferred-0.3.2/deferred.elc new file mode 100644 index 0000000000000000000000000000000000000000..4b7a1a81df0e327de67298fc84f5f0f5023b27a3 GIT binary patch literal 44867 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 literal 0 HcmV?d00001 diff --git a/elpa/epc-0.1.1/epc-autoloads.el b/elpa/epc-0.1.1/epc-autoloads.el new file mode 100644 index 000000000..d0be61447 --- /dev/null +++ b/elpa/epc-0.1.1/epc-autoloads.el @@ -0,0 +1,18 @@ +;;; epc-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads nil nil ("epc-pkg.el" "epc.el") (21566 24344 7339 +;;;;;; 154000)) + +;;;*** + +(provide 'epc-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; epc-autoloads.el ends here diff --git a/elpa/epc-0.1.1/epc-pkg.el b/elpa/epc-0.1.1/epc-pkg.el new file mode 100644 index 000000000..60682e18c --- /dev/null +++ b/elpa/epc-0.1.1/epc-pkg.el @@ -0,0 +1 @@ +(define-package "epc" "0.1.1" "A RPC stack for the Emacs Lisp" (quote ((concurrent "0.3.1") (ctable "0.1.1")))) diff --git a/elpa/epc-0.1.1/epc-pkg.elc b/elpa/epc-0.1.1/epc-pkg.elc new file mode 100644 index 0000000000000000000000000000000000000000..b4caf9e6e7fc9d6bc302501143aa6fee72a4293f GIT binary patch literal 666 zcmbtSO-sW-5bZgC!0V8UEi{`ZZLuF0rSwn`6cs$mba#?0Cc9yGqv)@9k`_Tcb}u{Z zd-L9W>~?>@yBdu~(RRCqoo!lOlY-+HG#Dz4{!P&*$|{h%HLhGHoiTIKN22qhbXp11 zp^+q{ZNM6MOn{w*!M*EAm=sP<_j?w`G9@uPyyC8*f!`!e`8>R7tsK|RN9{^=sbB) zUj`d3L0Rd8)28%OMx76UN^vK@KG|C2>wg-`vWBq%q%{GV+=U`p@rz0Bo_B`>$O;`w z9-f~L_GlD%3la?+32KXfOwP@CAau1R2ccqOK0o>Lf-X9J0hgXAipGixZ769`zGF!c z^O9nShc)qi2TzYX@PSb%Y~KQ%S9Py_8^iT@%)^qMb7VrFHWyhufw2sD +;; Version: 0.1.1 +;; Keywords: lisp, rpc +;; Package-Requires: ((concurrent "0.3.1") (ctable "0.1.1")) +;; URL: https://github.com/kiwanami/emacs-epc + +;; 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 . + +;;; Commentary: + +;; This program is an asynchronous RPC stack for Emacs. Using this +;; RPC stack, the Emacs can communicate with the peer process. +;; Because the protocol is S-expression encoding and consists of +;; asynchronous communications, the RPC response is fairly good. +;; +;; Current implementations for the EPC are followings: +;; - epcs.el : Emacs Lisp implementation +;; - RPC::EPC::Service : Perl implementation + +;;; Code: + +(eval-when-compile (require 'cl)) +(require 'concurrent) +(require 'ctable) + + +;;================================================== +;; Utility + +(defvar epc:debug-out nil) +(defvar epc:debug-buffer "*epc log*") + +;;(setq epc:debug-out t) +;;(setq epc:debug-out nil) + +(defun epc:log-init () + (when (get-buffer epc:debug-buffer) + (kill-buffer epc:debug-buffer))) + +(defun epc:log (&rest args) + (when epc:debug-out + (with-current-buffer + (get-buffer-create epc:debug-buffer) + (buffer-disable-undo) + (goto-char (point-max)) + (insert (apply 'format args) "\n")))) + +(defun epc:make-procbuf (name) + "[internal] Make a process buffer." + (let ((buf (get-buffer-create name))) + (with-current-buffer buf + (set (make-local-variable 'kill-buffer-query-functions) nil) + (erase-buffer) (buffer-disable-undo)) + buf)) + + +;;================================================== +;; Low Level Interface + +(defvar epc:uid 1) + +(defun epc:uid () + (incf epc:uid)) + +(defvar epc:accept-process-timeout 100 "[internal] msec") + +;; [epc:connection structure] +;; +;; name : Connection name. This name is used for process and buffer names. +;; process : Connection process object. +;; buffer : Working buffer for the incoming data. +;; channel : Event channels for incoming messages. + +(defstruct epc:connection name process buffer channel) + +(defun epc:connect (host port) + "[internal] Connect the server, initialize the process and +return epc:connection object." + (epc:log ">> Connection start: %s:%s" host port) + (lexical-let* ((connection-id (epc:uid)) + (connection-name (format "epc con %s" connection-id)) + (connection-buf (epc:make-procbuf (format "*%s*" connection-name))) + (connection-process + (open-network-stream connection-name connection-buf host port)) + (channel (cc:signal-channel connection-name)) + (connection (make-epc:connection + :name connection-name + :process connection-process + :buffer connection-buf + :channel channel))) + (epc:log ">> Connection establish") + (set-process-coding-system connection-process 'binary 'binary) + (set-process-filter connection-process + (lambda (p m) + (epc:process-filter connection p m))) + (set-process-sentinel connection-process + (lambda (p e) + (epc:process-sentinel connection p e))) + connection)) + +(defun epc:connection-reset (connection) + "[internal] Reset the connection for restarting the process." + (cc:signal-disconnect-all (epc:connection-channel connection)) + connection) + +(defun epc:process-sentinel (connection process msg) + (epc:log "!! Process Sentinel [%s] : %S : %S" + (epc:connection-name connection) process msg) + (epc:disconnect connection)) + +(defun epc:net-send (connection sexp) + (let* ((msg (encode-coding-string + (concat (epc:prin1-to-string sexp) "\n") 'utf-8-unix)) + (string (concat (epc:net-encode-length (length msg)) msg)) + (proc (epc:connection-process connection))) + (epc:log ">> SEND : [%S]" string) + (process-send-string proc string))) + +(defun epc:disconnect (connection) + (lexical-let + ((process (epc:connection-process connection)) + (buf (epc:connection-buffer connection)) + (name (epc:connection-name connection))) + (epc:log "!! Disconnect [%s]" name) + (when process + (set-process-sentinel process nil) + (delete-process process) + (when (get-buffer buf) (kill-buffer buf))) + (epc:log "!! Disconnected finished [%s]" name))) + +(defun epc:process-filter (connection process message) + (epc:log "INCOMING: [%s] [%S]" (epc:connection-name connection) message) + (with-current-buffer (epc:connection-buffer connection) + (goto-char (point-max)) + (insert message) + (epc:process-available-input connection process))) + +(defun epc:process-available-input (connection process) + "Process all complete messages that have arrived from Lisp." + (with-current-buffer (process-buffer process) + (while (epc:net-have-input-p) + (let ((event (epc:net-read-or-lose process)) + (ok nil)) + (epc:log "<< RECV [%S]" event) + (unwind-protect + (condition-case err + (progn + (apply 'cc:signal-send + (cons (epc:connection-channel connection) event)) + (setq ok t)) + ('error (epc:log "MsgError: %S / <= %S" err event))) + (unless ok + (epc:run-when-idle 'epc:process-available-input connection process))))))) + +(defun epc:net-have-input-p () + "Return true if a complete message is available." + (goto-char (point-min)) + (and (>= (buffer-size) 6) + (>= (- (buffer-size) 6) (epc:net-decode-length)))) + +(defun epc:run-when-idle (function &rest args) + "Call FUNCTION as soon as Emacs is idle." + (apply #'run-at-time + (if (featurep 'xemacs) itimer-short-interval 0) + nil function args)) + +(defun epc:net-read-or-lose (process) + (condition-case error + (epc:net-read) + (error + (debug 'error error) + (error "net-read error: %S" error)))) + +(defun epc:net-read () + "Read a message from the network buffer." + (goto-char (point-min)) + (let* ((length (epc:net-decode-length)) + (start (+ 6 (point))) + (end (+ start length)) content) + (assert (plusp length)) + (prog1 (save-restriction + (narrow-to-region start end) + (read (decode-coding-string + (buffer-string) 'utf-8-unix))) + (delete-region (point-min) end)))) + +(defun epc:net-decode-length () + "Read a 24-bit hex-encoded integer from buffer." + (string-to-number (buffer-substring-no-properties (point) (+ (point) 6)) 16)) + +(defun epc:net-encode-length (n) + "Encode an integer into a 24-bit hex string." + (format "%06x" n)) + +(defun epc:prin1-to-string (sexp) + "Like `prin1-to-string' but don't octal-escape non-ascii characters. +This is more compatible with the CL reader." + (with-temp-buffer + (let (print-escape-nonascii + print-escape-newlines + print-length + print-level) + (prin1 sexp (current-buffer)) + (buffer-string)))) + + +;;================================================== +;; High Level Interface + +;; [epc:manager] +;; +;; title : instance name for displaying on the `epc:controller' UI +;; server-process : process object for the peer +;; commands : a list of (prog . args) +;; port : port number +;; connection : epc:connection instance +;; methods : alist of method (name . function) +;; sessions : alist of session (id . deferred) +;; exit-hook : functions for after shutdown EPC connection +(defstruct epc:manager title server-process commands port connection methods sessions exit-hooks) + +;; [epc:method] +;; +;; name : method name (symbol) ex: 'test +;; task : method function (function with one argument) +;; arg-specs : arg-specs (one string) ex: "(A B C D)" +;; docstring : docstring (one string) ex: "A test function. Return sum of A,B,C and D" +(defstruct epc:method name task docstring arg-specs) + +(defvar epc:live-connections nil + "[internal] A list of `epc:manager' objects those currently connect to the epc peer. +This variable is for debug purpose.") + +(defun epc:live-connections-add (mngr) + "[internal] Add the EPC manager object." + (push mngr epc:live-connections)) + +(defun epc:live-connections-delete (mngr) + "[internal] Remove the EPC manager object." + (setq epc:live-connections (delete mngr epc:live-connections))) + + +(defun epc:start-epc (server-prog server-args) + "Start the epc server program and return an epc:manager object. + +Start server program SERVER-PROG with command line arguments +SERVER-ARGS. The server program must print out the port it is +using at the first line of its stdout. If the server prints out +non-numeric value in the first line or does not print out the +port number in three seconds, it is regarded as start-up +failure." + (let ((mngr (epc:start-server server-prog server-args))) + (epc:init-epc-layer mngr) + mngr)) + +(defun epc:start-server (server-prog server-args) + "[internal] Start a peer server and return an epc:manager instance which is set up partially." + (let* ((process-name (format "epc:server:%s" (epc:uid))) + (process-buffer (get-buffer-create (format " *%s*" process-name))) + (process (apply 'start-process + process-name process-buffer + server-prog server-args)) + (cont 1) port) + (while cont + (accept-process-output process 0 epc:accept-process-timeout t) + (let ((port-str (with-current-buffer process-buffer + (buffer-string)))) + (cond + ((string-match "^[0-9]+$" port-str) + (setq port (string-to-number port-str) + cont nil)) + ((< 0 (length port-str)) + (error "Server may raise an error : %s" port-str)) + ((not (eq 'run (process-status process))) + (setq cont nil)) + (t + (incf cont) + (when (< 30 cont) ; timeout 3 seconds + (error "Timeout server response.")))))) + (make-epc:manager :server-process process + :commands (cons server-prog server-args) + :title (mapconcat 'identity (cons server-prog server-args) " ") + :port port + :connection (epc:connect "localhost" port)))) + +(defun epc:stop-epc (mngr) + "Disconnect the connection for the server." + (let* ((proc (epc:manager-server-process mngr)) + (buf (and proc (process-buffer proc)))) + (epc:disconnect (epc:manager-connection mngr)) + (when proc + (accept-process-output proc 0 epc:accept-process-timeout t)) + (when (and proc (equal 'run (process-status proc))) + (kill-process proc)) + (when buf (kill-buffer buf)) + (condition-case err + (epc:manager-fire-exit-hook mngr) + (error (epc:log "Error on exit-hooks : %S / " err mngr))) + (epc:live-connections-delete mngr))) + +(defun epc:start-epc-debug (port) + "[internal] Return an epc:manager instance which is set up partially." + (epc:init-epc-layer + (make-epc:manager :server-process nil + :commands (cons "[DEBUG]" nil) + :port port + :connection (epc:connect "localhost" port)))) + +(defun epc:args (args) + "[internal] If ARGS is an atom, return it. If list, return the cadr of it." + (cond + ((atom args) args) + (t (cadr args)))) + +(defun epc:init-epc-layer (mngr) + "[internal] Connect to the server program and return an epc:connection instance." + (lexical-let* + ((mngr mngr) + (conn (epc:manager-connection mngr)) + (channel (epc:connection-channel conn))) + ;; dispatch incoming messages with the lexical scope + (loop for (method . body) in + `((call + . (lambda (args) + (epc:log "SIG CALL: %S" args) + (apply 'epc:handler-called-method ,mngr (epc:args args)))) + (return + . (lambda (args) + (epc:log "SIG RET: %S" args) + (apply 'epc:handler-return ,mngr (epc:args args)))) + (return-error + . (lambda (args) + (epc:log "SIG RET-ERROR: %S" args) + (apply 'epc:handler-return-error ,mngr (epc:args args)))) + (epc-error + . (lambda (args) + (epc:log "SIG EPC-ERROR: %S" args) + (apply 'epc:handler-epc-error ,mngr (epc:args args)))) + (methods + . (lambda (args) + (epc:log "SIG METHODS: %S" args) + (epc:handler-methods ,mngr (caadr args)))) + ) do + (cc:signal-connect channel method body)) + (epc:live-connections-add mngr) + mngr)) + + + +(defun epc:manager-add-exit-hook (mngr hook-function) + "Register the HOOK-FUNCTION which is called after the EPC connection closed by the EPC controller UI. +HOOK-FUNCTION is a function with no argument." + (let* ((hooks (epc:manager-exit-hooks mngr))) + (setf (epc:manager-exit-hooks mngr) (cons hook-function hooks)) + mngr)) + +(defun epc:manager-fire-exit-hook (mngr) + "[internal] Call exit-hooks functions of MNGR. After calling hooks, this functions clears the hook slot so as not to call doubly." + (let* ((hooks (epc:manager-exit-hooks mngr))) + (run-hooks hooks) + (setf (epc:manager-exit-hooks mngr) nil) + mngr)) + +(defun epc:manager-status-server-process (mngr) + "[internal] Return the status of the process object for the peer process. If the process is nil, return nil." + (and mngr + (epc:manager-server-process mngr) + (process-status (epc:manager-server-process mngr)))) + +(defun epc:manager-status-connection-process (mngr) + "[internal] Return the status of the process object for the connection process." + (and (epc:manager-connection mngr) + (process-status (epc:connection-process + (epc:manager-connection mngr))))) + +(defun epc:manager-restart-process (mngr) + "[internal] Restart the process and reconnect." + (cond + ((null (epc:manager-server-process mngr)) + (error "Cannot restart this EPC process!")) + (t + (epc:stop-epc mngr) + (let* ((cmds (epc:manager-commands mngr)) + (new-mngr (epc:start-server (car cmds) (cdr cmds)))) + (setf (epc:manager-server-process mngr) + (epc:manager-server-process new-mngr)) + (setf (epc:manager-port mngr) + (epc:manager-port new-mngr)) + (setf (epc:manager-connection mngr) + (epc:manager-connection new-mngr)) + (setf (epc:manager-methods mngr) + (epc:manager-methods new-mngr)) + (setf (epc:manager-sessions mngr) + (epc:manager-sessions new-mngr)) + (epc:connection-reset (epc:manager-connection mngr)) + (epc:init-epc-layer mngr) + (epc:live-connections-delete new-mngr) + (epc:live-connections-add mngr) + mngr)))) + +(defun epc:manager-send (mngr method &rest messages) + "[internal] low-level message sending." + (let* ((conn (epc:manager-connection mngr))) + (epc:net-send conn (cons method messages)))) + +(defun epc:manager-get-method (mngr method-name) + "[internal] Return a method object. If not found, return nil." + (loop for i in (epc:manager-methods mngr) + if (eq method-name (epc:method-name i)) + do (return i))) + +(defun epc:handler-methods (mngr uid) + "[internal] Return a list of information for registered methods." + (let ((info + (loop for i in (epc:manager-methods mngr) + collect + (list + (epc:method-name i) + (or (epc:method-arg-specs i) "") + (or (epc:method-docstring i) ""))))) + (epc:manager-send mngr 'return uid info))) + +(defun epc:handler-called-method (mngr uid name args) + "[internal] low-level message handler for peer's calling." + (lexical-let ((mngr mngr) (uid uid)) + (let* ((methods (epc:manager-methods mngr)) + (method (epc:manager-get-method mngr name))) + (cond + ((null method) + (epc:log "ERR: No such method : %s" name) + (epc:manager-send mngr 'epc-error uid (format "EPC-ERROR: No such method : %s" name))) + (t + (condition-case err + (let* ((f (epc:method-task method)) + (ret (apply f args))) + (cond + ((deferred-p ret) + (deferred:nextc ret + (lambda (xx) (epc:manager-send mngr 'return uid xx)))) + (t (epc:manager-send mngr 'return uid ret)))) + (error + (epc:log "ERROR : %S" err) + (epc:manager-send mngr 'return-error uid err)))))))) + +(defun epc:manager-remove-session (mngr uid) + "[internal] Remove a session from the epc manager object." + (loop with ret = nil + for pair in (epc:manager-sessions mngr) + unless (eq uid (car pair)) + do (push pair ret) + finally + do (setf (epc:manager-sessions mngr) ret))) + +(defun epc:handler-return (mngr uid args) + "[internal] low-level message handler for normal returns." + (let ((pair (assq uid (epc:manager-sessions mngr)))) + (cond + (pair + (epc:log "RET: id:%s [%S]" uid args) + (epc:manager-remove-session mngr uid) + (deferred:callback (cdr pair) args)) + (t ; error + (epc:log "RET: NOT FOUND: id:%s [%S]" uid args))))) + +(defun epc:handler-return-error (mngr uid args) + "[internal] low-level message handler for application errors." + (let ((pair (assq uid (epc:manager-sessions mngr)))) + (cond + (pair + (epc:log "RET-ERR: id:%s [%S]" uid args) + (epc:manager-remove-session mngr uid) + (deferred:errorback (cdr pair) (format "%S" args))) + (t ; error + (epc:log "RET-ERR: NOT FOUND: id:%s [%S]" uid args))))) + +(defun epc:handler-epc-error (mngr uid args) + "[internal] low-level message handler for epc errors." + (let ((pair (assq uid (epc:manager-sessions mngr)))) + (cond + (pair + (epc:log "RET-EPC-ERR: id:%s [%S]" uid args) + (epc:manager-remove-session mngr uid) + (deferred:errorback (cdr pair) (list 'epc-error args))) + (t ; error + (epc:log "RET-EPC-ERR: NOT FOUND: id:%s [%S]" uid args))))) + + + +(defun epc:call-deferred (mngr method-name args) + "Call peer's method with args asynchronously. Return a deferred +object which is called with the result." + (let ((uid (epc:uid)) + (sessions (epc:manager-sessions mngr)) + (d (deferred:new))) + (push (cons uid d) sessions) + (setf (epc:manager-sessions mngr) sessions) + (epc:manager-send mngr 'call uid method-name args) + d)) + +(defun epc:define-method (mngr method-name task &optional arg-specs docstring) + "Define a method and return a deferred object which is called by the peer." + (let* ((method (make-epc:method + :name method-name :task task + :arg-specs arg-specs :docstring docstring)) + (methods (cons method (epc:manager-methods mngr)))) + (setf (epc:manager-methods mngr) methods) + method)) + +(defun epc:query-methods-deferred (mngr) + "Return a list of information for the peer's methods. +The list is consisted of lists of strings: + (name arg-specs docstring)." + (let ((uid (epc:uid)) + (sessions (epc:manager-sessions mngr)) + (d (deferred:new))) + (push (cons uid d) sessions) + (setf (epc:manager-sessions mngr) sessions) + (epc:manager-send mngr 'methods uid) + d)) + +(defun epc:sync (mngr d) + "Wrap deferred methods with synchronous waiting, and return the result. +If an exception is occurred, this function throws the error." + (lexical-let ((result 'epc:nothing)) + (deferred:$ d + (deferred:nextc it + (lambda (x) (setq result x))) + (deferred:error it + (lambda (er) (setq result (cons 'error er))))) + (while (eq result 'epc:nothing) + (save-current-buffer + (accept-process-output + (epc:connection-process (epc:manager-connection mngr)) + 0 epc:accept-process-timeout t))) + (if (and (consp result) (eq 'error (car result))) + (error (cdr result)) result))) + +(defun epc:call-sync (mngr method-name args) + "Call peer's method with args synchronously and return the result. +If an exception is occurred, this function throws the error." + (epc:sync mngr (epc:call-deferred mngr method-name args))) + + + +;;================================================== +;; Management Interface + +(defun epc:controller () + "Display the management interface for EPC processes and connections. +Process list. +Session status, statistics and uptime. +Peer's method list. +Display process buffer. +Kill sessions and connections. +Restart process." + (interactive) + (let* ((buf-name "*EPC Controller*") + (buf (get-buffer buf-name))) + (unless (buffer-live-p buf) + (setq buf (get-buffer-create buf-name))) + (epc:controller-update-buffer buf) + (pop-to-buffer buf))) + +(defun epc:controller-update-buffer (buf) + "[internal] Update buffer for the current epc processes." + (let* + ((data (loop + for mngr in epc:live-connections collect + (list + (epc:manager-server-process mngr) + (epc:manager-status-server-process mngr) + (epc:manager-status-connection-process mngr) + (epc:manager-title mngr) + (epc:manager-commands mngr) + (epc:manager-port mngr) + (length (epc:manager-methods mngr)) + (length (epc:manager-sessions mngr)) + mngr))) + (param (copy-ctbl:param ctbl:default-rendering-param)) + (cp + (ctbl:create-table-component-buffer + :buffer buf :width nil + :model + (make-ctbl:model + :column-model + (list (make-ctbl:cmodel :title "" :align 'left) + (make-ctbl:cmodel :title "" :align 'center) + (make-ctbl:cmodel :title "" :align 'center) + (make-ctbl:cmodel :title " Title " :align 'left :max-width 30) + (make-ctbl:cmodel :title " Command " :align 'left :max-width 30) + (make-ctbl:cmodel :title " Port " :align 'right) + (make-ctbl:cmodel :title " Methods " :align 'right) + (make-ctbl:cmodel :title " Live sessions " :align 'right)) + :data data) + :custom-map epc:controller-keymap + :param param))) + (pop-to-buffer (ctbl:cp-get-buffer cp)))) + +(eval-when-compile ; introduce anaphoric variable `cp' and `mngr'. + (defmacro epc:controller-with-cp (&rest body) + `(let ((cp (ctbl:cp-get-component))) + (when cp + (let ((mngr (car (last (ctbl:cp-get-selected-data-row cp))))) + ,@body))))) + +(defun epc:controller-update-command () + (interactive) + (epc:controller-with-cp + (epc:controller-update-buffer (current-buffer)))) + +(defun epc:controller-connection-restart-command () + (interactive) + (epc:controller-with-cp + (let* ((proc (epc:manager-server-process mngr)) + (msg (format "Restart the EPC process [%s] ? " proc))) + (when (and proc (y-or-n-p msg)) + (epc:manager-restart-process mngr) + (epc:controller-update-buffer (current-buffer)))))) + +(defun epc:controller-connection-kill-command () + (interactive) + (epc:controller-with-cp + (let* ((proc (epc:manager-server-process mngr)) + (msg (format "Kill the EPC process [%s] ? " proc))) + (when (and proc (y-or-n-p msg)) + (epc:stop-epc mngr) + (epc:controller-update-buffer (current-buffer)))))) + +(defun epc:controller-connection-buffer-command () + (interactive) + (epc:controller-with-cp + (switch-to-buffer + (epc:connection-buffer (epc:manager-connection mngr))))) + +(defun epc:controller-methods-show-command () + (interactive) + (epc:controller-with-cp + (epc:controller-methods mngr))) + +(defun epc:controller-methods (mngr) + "Display a list of methods for the MNGR process." + (let* ((buf-name "*EPC Controller/Methods*") + (buf (get-buffer buf-name))) + (unless (buffer-live-p buf) + (setq buf (get-buffer-create buf-name)) + (with-current-buffer buf + (setq buffer-read-only t))) + (lexical-let ((buf buf) (mngr mngr)) + (deferred:$ + (epc:query-methods-deferred mngr) + (deferred:nextc it + (lambda (methods) + (epc:controller-methods-update-buffer buf mngr methods) + (pop-to-buffer buf))))))) + +(defface epc:face-title + '((((class color) (background light)) + :foreground "Slategray4" :background "Gray90" :weight bold) + (((class color) (background dark)) + :foreground "maroon2" :weight bold)) + "Face for titles" :group 'epc) + +(defun epc:controller-methods-update-buffer (buf mngr methods) + "[internal] Update methods list buffer for the epc process." + (with-current-buffer buf + (let* ((data + (loop for m in methods collect + (list + (car m) + (or (nth 1 m) "") + (or (nth 2 m) "")))) + (param (copy-ctbl:param ctbl:default-rendering-param)) + cp buffer-read-only) + (erase-buffer) + (insert + (propertize + (format "EPC Process : %s\n" + (mapconcat 'identity (epc:manager-commands mngr) " ")) + 'face 'epc:face-title) "\n") + (setq cp (ctbl:create-table-component-region + :model + (make-ctbl:model + :column-model + (list (make-ctbl:cmodel :title "Method Name" :align 'left) + (make-ctbl:cmodel :title "Arguments" :align 'left) + (make-ctbl:cmodel :title "Document" :align 'left)) + :data data) + :keymap epc:controller-methods-keymap + :param param)) + (set (make-local-variable 'epc:mngr) mngr) + (ctbl:cp-set-selected-cell cp '(0 . 0)) + (ctbl:cp-get-buffer cp)))) + +(defun epc:controller-methods-eval-command () + (interactive) + (let ((cp (ctbl:cp-get-component))) + (when cp + (let* ((method-name (car (ctbl:cp-get-selected-data-row cp))) + (args (eval-minibuffer + (format "Arguments for calling [%s] : " method-name)))) + (deferred:$ + (epc:call-deferred epc:mngr method-name args) + (deferred:nextc it + (lambda (ret) (message "Result : %S" ret))) + (deferred:error it + (lambda (err) (message "Error : %S" ret)))))))) + +(defun epc:define-keymap (keymap-list &optional prefix) + "[internal] Keymap utility." + (let ((map (make-sparse-keymap))) + (mapc + (lambda (i) + (define-key map + (if (stringp (car i)) + (read-kbd-macro + (if prefix + (replace-regexp-in-string "prefix" prefix (car i)) + (car i))) + (car i)) + (cdr i))) + keymap-list) + map)) + +(defun epc:add-keymap (keymap keymap-list &optional prefix) + (loop with nkeymap = (copy-keymap keymap) + for i in keymap-list + do + (define-key nkeymap + (if (stringp (car i)) + (read-kbd-macro + (if prefix + (replace-regexp-in-string "prefix" prefix (car i)) + (car i))) + (car i)) + (cdr i)) + finally return nkeymap)) + +(defvar epc:controller-keymap + (epc:define-keymap + '( + ("g" . epc:controller-update-command) + ("R" . epc:controller-connection-restart-command) + ("D" . epc:controller-connection-kill-command) + ("K" . epc:controller-connection-kill-command) + ("m" . epc:controller-methods-show-command) + ("C-m" . epc:controller-methods-show-command) + ("B" . epc:controller-connection-buffer-command) + )) "Keymap for the controller buffer.") + +(defvar epc:controller-methods-keymap + (epc:add-keymap + ctbl:table-mode-map + '( + ("q" . bury-buffer) + ("e" . epc:controller-methods-eval-command) + )) "Keymap for the controller methods list buffer.") + +(provide 'epc) +;;; epc.el ends here diff --git a/elpa/epc-0.1.1/epc.elc b/elpa/epc-0.1.1/epc.elc new file mode 100644 index 0000000000000000000000000000000000000000..740c4bdd1fc5e405351ff1173fc21dce532a9cab GIT binary patch literal 50618 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 +;; Copyright (C) 2013, 2014 Free Software Foundation, Inc. +;; +;; Author: Sebastian Wiesner +;; URL: https://flycheck.readthedocs.org +;; Keywords: convenience languages tools +;; Version: 0.20 +;; Package-Requires: ((dash "2.4.0") (pkg-info "0.4") (cl-lib "0.3") (emacs "24.1")) + +;; This file is not part of GNU Emacs. + +;; 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 . + +;;; Commentary: + +;; Modern on-the-fly syntax checking for GNU Emacs. + +;; Provide `flycheck-mode' which enables on-the-fly syntax checking for a large +;; number of different modes and languages (see `flycheck-checkers' for a +;; complete list). +;; +;; Support for new modes and languages can be added by defining a new syntax +;; checker (see `flycheck-define-checker'). + +;;; Code: + +(eval-when-compile + (require 'cl-lib) ; `cl-defstruct' + (require 'compile) ; Compile Mode integration + (require 'package) ; Tell Emacs about package-user-dir + (require 'sh-script) ; `sh-shell' for sh checker predicates + (require 'jka-compr) ; For JKA workarounds in `flycheck-temp-file-system' + ) + +(require 'dash) + +(require 'subr-x nil 'no-error) ; Additional utilities, Emacs 24.4 and upwards +(require 'pcase) ; Pattern matching for Emacs Lisp +(require 'tabulated-list) ; To list errors +(require 'easymenu) ; Flycheck Mode menu definition +(require 'rx) ; Regexp fanciness in `flycheck-define-checker' +(require 'help-mode) ; `define-button-type' +(require 'find-func) ; `find-function-regexp-alist' + +;; Tell the byte compiler about autoloaded functions from packages +(declare-function pkg-info-version-info "pkg-info" (package)) + + +;;; Compatibility +(eval-and-compile + ;; `defvar-local' Emacs 24.2 and below + (unless (fboundp 'defvar-local) + (defmacro defvar-local (var val &optional docstring) + "Define VAR as a buffer-local variable with default value VAL. +Like `defvar' but additionally marks the variable as being automatically +buffer-local wherever it is set." + (declare (debug defvar) (doc-string 3)) + `(progn + (defvar ,var ,val ,docstring) + (make-variable-buffer-local ',var)))) + + (unless (fboundp 'setq-local) + ;; `setq-local' for Emacs 24.2 and below + (defmacro setq-local (var val) + "Set variable VAR to value VAL in current buffer." + `(set (make-local-variable ',var) ,val))) + + (unless (fboundp 'user-error) + ;; `user-error' for Emacs 24.2 and below + (defalias 'user-error 'error) + + (add-to-list 'debug-ignored-errors + (rx string-start "No more Flycheck errors" string-end)) + (add-to-list 'debug-ignored-errors + (rx string-start "Flycheck mode disabled" string-end)) + (add-to-list 'debug-ignored-errors + (rx string-start "Configured syntax checker " + symbol-start (one-or-more not-newline) symbol-end + " cannot be used" string-end))) + + (unless (fboundp 'string-suffix-p) + ;; `string-suffix-p' for Emacs 24.3 and below + (defun string-suffix-p (suffix string &optional ignore-case) + "Return non-nil if SUFFIX is a suffix of STRING. +If IGNORE-CASE is non-nil, the comparison is done without paying +attention to case differences." + (let ((start-pos (- (length string) (length suffix)))) + (and (>= start-pos 0) + (eq t (compare-strings suffix nil nil + string start-pos nil ignore-case)))))) + + (unless (featurep 'subr-x) + ;; `subr-x' function for Emacs 24.3 and below + (defsubst string-join (strings &optional separator) + "Join all STRINGS using SEPARATOR." + (mapconcat 'identity strings separator)) + + (defsubst string-trim-left (string) + "Remove leading whitespace from STRING." + (if (string-match "\\`[ \t\n\r]+" string) + (replace-match "" t t string) + string)) + + (defsubst string-trim-right (string) + "Remove trailing whitespace from STRING." + (if (string-match "[ \t\n\r]+\\'" string) + (replace-match "" t t string) + string)) + + (defsubst string-trim (string) + "Remove leading and trailing whitespace from STRING." + (string-trim-left (string-trim-right string))) + + (defsubst string-empty-p (string) + "Check whether STRING is empty." + (string= string "")))) + +(when (and (not (get 'exclamation-mark 'fringe)) + (fboundp 'define-fringe-bitmap)) + ;; Provide `exclamation-mark' bitmap for Emacs 24.2 and below. We also check, + ;; whether `define-fringe-bitmap' is defined, because this function is not + ;; available if Emacs is built without GUI support. See + ;; https://github.com/flycheck/flycheck/issues/57 + (define-fringe-bitmap 'exclamation-mark + [24 60 60 24 24 0 0 24 24] nil nil 'center)) + + +;;; Customization +(defgroup flycheck nil + "Modern on-the-fly syntax checking for GNU Emacs." + :prefix "flycheck-" + :group 'tools + :link '(url-link :tag "Online manual" "http://flycheck.readthedocs.org") + :link '(url-link :tag "Github" "https://github.com/flycheck/flycheck") + :link '(custom-manual "(flycheck)Top") + :link '(info-link "(flycheck)Usage")) + +(defgroup flycheck-config-files nil + "Configuration files for on-the-fly syntax checkers." + :prefix "flycheck-" + :group 'flycheck + :link '(custom-manual "(flycheck)Syntax checker configuration files")) + +(defgroup flycheck-options nil + "Options for on-the-fly syntax checkers." + :prefix "flycheck-" + :group 'flycheck + :link '(custom-manual "(flycheck)Syntax checker options")) + +(defgroup flycheck-executables nil + "Executables of syntax checkers." + :prefix "flycheck-" + :group 'flycheck + :link '(custom-manual "(flycheck)Syntax checker executables")) + +(defgroup flycheck-faces nil + "Faces used by on-the-fly syntax checking." + :prefix "flycheck-" + :group 'flycheck + :link '(info-link "(flycheck)Error reporting")) + +(defcustom flycheck-checkers + '(ada-gnat + asciidoc + c/c++-clang + c/c++-gcc + c/c++-cppcheck + cfengine + chef-foodcritic + coffee + coffee-coffeelint + css-csslint + d-dmd + elixir + emacs-lisp + emacs-lisp-checkdoc + erlang + eruby-erubis + fortran-gfortran + go-gofmt + go-golint + go-vet + go-build + go-test + go-errcheck + haml + handlebars + haskell-ghc + haskell-hlint + html-tidy + javascript-jshint + javascript-eslint + javascript-gjslint + json-jsonlint + less + lua + make + perl + perl-perlcritic + php + php-phpmd + php-phpcs + puppet-parser + puppet-lint + python-flake8 + python-pylint + racket + rst + rst-sphinx + ruby-rubocop + ruby-rubylint + ruby + ruby-jruby + rust + sass + scala + scala-scalastyle + scss + sh-bash + sh-posix-dash + sh-posix-bash + sh-zsh + sh-shellcheck + slim + tex-chktex + tex-lacheck + texinfo + verilog-verilator + xml-xmlstarlet + xml-xmllint + yaml-jsyaml + yaml-ruby) + "Syntax checkers available for automatic selection. + +A list of Flycheck syntax checkers to choose from when syntax +checking a buffer. Flycheck will automatically select a suitable +syntax checker from this list, unless `flycheck-checker' is set, +either directly or with `flycheck-select-checker'. + +You should not need to change this variable normally. In order +to disable syntax checkers, please use +`flycheck-disabled-checkers'. This variable is intended for 3rd +party extensions to tell Flycheck about new syntax checkers. + +Syntax checkers in this list must be defined with +`flycheck-define-checker'." + :group 'flycheck + :type '(repeat (symbol :tag "Checker")) + :risky t) + +(defcustom flycheck-disabled-checkers nil + "Syntax checkers excluded from automatic selection. + +A list of Flycheck syntax checkers to exclude from automatic +selection. Flycheck will never automatically select a syntax +checker in this list, regardless of the value of +`flycheck-checkers'. + +However, syntax checkers in this list are still available for +manual selection with `flycheck-select-checker'. + +Use this variable to disable syntax checkers, instead of removing +the syntax checkers from `flycheck-checkers'. You may also use +this option as a file or directory local variable to disable +specific checkers in individual files and directories +respectively." + :group 'flycheck + :type '(repeat (symbol :tag "Checker")) + :package-version '(flycheck . "0.16") + :safe #'flycheck-symbol-list-p) +(make-variable-buffer-local 'flycheck-disabled-checkers) + +(defvar-local flycheck-checker nil + "Syntax checker to use for the current buffer. + +If unset or nil, automatically select a suitable syntax checker +from `flycheck-checkers' on every syntax check. + +If set to a syntax checker only use this syntax checker and never +select one from `flycheck-checkers' automatically. The syntax +checker is used regardless of whether it is contained in +`flycheck-checkers' or `flycheck-disabled-checkers'. If the +syntax checker is unusable in the current buffer an error is +signaled. + +A syntax checker assigned to this variable must be defined with +`flycheck-define-checker'. + +Use the command `flycheck-select-checker' to select a syntax +checker for the current buffer, or set this variable as file +local variable to always use a specific syntax checker for a +file. See Info Node `(emacs)Specifying File Variables' for more +information about file variables.") +(put 'flycheck-checker 'safe-local-variable 'flycheck-registered-checker-p) + +(defcustom flycheck-locate-config-file-functions + '(flycheck-locate-config-file-absolute-path + flycheck-locate-config-file-projectile + flycheck-locate-config-file-ancestor-directories + flycheck-locate-config-file-home) + "Functions to locate syntax checker configuration files. + +Each function in this hook must accept two arguments: The value +of the configuration file variable, and the syntax checker +symbol. It must return either a string with an absolute path to +the configuration file, or nil, if it cannot locate the +configuration file. + +The functions in this hook are called in order of appearance, until a +function returns non-nil. The configuration file returned by that +function is then given to the syntax checker if it exists. + +This variable is an abnormal hook. See Info +node `(elisp)Hooks'." + :group 'flycheck + :type 'hook + :risky t) + +(defcustom flycheck-process-error-functions '(flycheck-add-overlay) + "Functions to process errors. + +Each function in this hook must accept a single argument: A +Flycheck error to process. + +All functions in this hook are called in order of appearance, +until a function returns non-nil. Thus, a function in this hook +may return nil, to allow for further processing of the error, or +any non-nil value, to indicate that the error was fully processed +and inhibit any further processing. + +The functions are called for each newly parsed error immediately +after the corresponding syntax checker finished. At this stage, +the overlays from the previous syntax checks are still present, +and there may be further syntax checkers in the chain. + +This variable is an abnormal hook. See Info +node `(elisp)Hooks'." + :group 'flycheck + :type 'hook + :package-version '(flycheck . "0.13") + :risky t) + +(defcustom flycheck-display-errors-delay 0.9 + "Delay in seconds before displaying errors at point. + +Use floating point numbers to express fractions of seconds." + :group 'flycheck + :type 'number + :package-version '(flycheck . "0.15") + :safe #'numberp) + +(defcustom flycheck-display-errors-function #'flycheck-display-error-messages + "Function to display error messages. + +If set to a function, call the function with the list of errors +to display as single argument. Each error is an instance of the +`flycheck-error' struct. + +If set to nil, do not display errors at all." + :group 'flycheck + :type '(choice (const :tag "Display error messages" + flycheck-display-error-messages) + (function :tag "Error display function")) + :package-version '(flycheck . "0.13") + :risky t) + +(defcustom flycheck-indication-mode 'left-fringe + "The indication mode for Flycheck errors and warnings. + +This variable controls how Flycheck indicates errors in buffers. +May either be `left-fringe', `right-fringe', or nil. + +If set to `left-fringe' or `right-fringe', indicate errors and +warnings via icons in the left and right fringe respectively. + +If set to nil, do not indicate errors and warnings, but just +highlight them according to `flycheck-highlighting-mode'." + :group 'flycheck + :type '(choice (const :tag "Indicate in the left fringe" left-fringe) + (const :tag "Indicate in the right fringe" right-fringe) + (const :tag "Do not indicate" nil)) + :safe #'symbolp) + +(defcustom flycheck-highlighting-mode 'symbols + "The highlighting mode for Flycheck errors and warnings. + +The highlighting mode controls how Flycheck highlights errors in +buffers. The following modes are known: + +`columns' + Highlight the error column. If the error does not have a column, + highlight the whole line. + +`symbols' + Highlight the symbol at the error column, if there is any, + otherwise behave like `columns'. This is the default. + +`sexps' + Highlight the expression at the error column, if there is + any, otherwise behave like `columns'. Note that this mode + can be *very* slow in some major modes. + +`lines' + Highlight the whole line. + +nil + Do not highlight errors at all. However, errors will still + be reported in the mode line and in error message popups, + and indicated according to `flycheck-indication-mode'." + :group 'flycheck + :type '(choice (const :tag "Highlight columns only" columns) + (const :tag "Highlight symbols" symbols) + (const :tag "Highlight expressions" sexps) + (const :tag "Highlight whole lines" lines) + (const :tag "Do not highlight errors" nil)) + :package-version '(flycheck . "0.14") + :safe #'symbolp) + +(defcustom flycheck-check-syntax-automatically '(save + idle-change + new-line + mode-enabled) + "When Flycheck should check syntax automatically. + +This variable is a list of events that may trigger syntax checks. +The following events are known: + +`save' + Check syntax immediately after the buffer was saved. + +`idle-change' + Check syntax a short time (see `flycheck-idle-change-delay') + after the last change to the buffer. + +`new-line' + Check syntax immediately after a new line was inserted into + the buffer. + +`mode-enabled' + Check syntax immediately when `flycheck-mode' is enabled. + +Flycheck performs a syntax checks only on evens, which are +contained in this list. For instance, if the value of this +variable is `(mode-enabled save)', Flycheck will only check if +the mode is enabled or the buffer was saved, but never after +changes to the buffer contents. + +If nil, never check syntax automatically. In this case, use +`flycheck-buffer' to start a syntax check manually." + :group 'flycheck + :type '(set (const :tag "After the buffer was saved" save) + (const :tag "After the buffer was changed and idle" idle-change) + (const :tag "After a new line was inserted" new-line) + (const :tag "After `flycheck-mode' was enabled" mode-enabled)) + :package-version '(flycheck . "0.12") + :safe #'symbolp) + +(defcustom flycheck-idle-change-delay 0.5 + "How many seconds to wait before checking syntax automatically. + +After the buffer was changed, Flycheck will wait as many seconds +as the value of this variable before starting a syntax check. If +the buffer is modified during this time, Flycheck will wait +again. + +This variable has no effect, if `idle-change' is not contained in +`flycheck-check-syntax-automatically'." + :group 'flycheck + :type 'number + :package-version '(flycheck . "0.13") + :safe #'numberp) + +(defcustom flycheck-google-max-messages 5 + "How many messages to google at once. + +If set to an integer, `flycheck-google-messages' will signal an +error if there are more Flycheck messages at point than the value +of this variable. + +If set to nil, `flycheck-google-messages' will always google *all* +messages at point. This setting is *not* recommended." + :group 'flycheck + :type '(choice (const :tag "Always google all messages" nil) + (integer :tag "Maximum messages to google")) + :package-version '(flycheck . "0.10") + :safe #'numberp) + +(defcustom flycheck-standard-error-navigation t + "Whether to support error navigation with `next-error'. + +If non-nil, enable navigation of Flycheck errors with +`next-error', `previous-error' and `first-error'. Otherwise, +these functions just navigate errors from compilation modes. + +Flycheck error navigation with `flycheck-next-error', +`flycheck-previous-error' and `flycheck-first-error' is always +enabled, regardless of the value of this variable. + +Note that this setting only takes effect when `flycheck-mode' is +enabled. Changing it will not affect buffers which already have +`flycheck-mode' enabled." + :group 'flycheck + :type 'boolean + :package-version '(flycheck . "0.15") + :safe #'booleanp) + +(defcustom flycheck-completion-system nil + "The completion system to use. + +`ido' + Use IDO. + + IDO is a built-in alternative completion system, without + good flex matching and a powerful UI. You may want to + install flx-ido (see URL `https://github.com/lewang/flx') to + improve the flex matching in IDO. + +`grizzl' + Use Grizzl. + + Grizzl is an alternative completion system with powerful + flex matching, but a very limited UI. See URL + `https://github.com/d11wtq/grizzl'. + +nil + Use the standard unfancy `completing-read'. + + `completing-read' has a very simple and primitive UI, and + does not offer flex matching. This is the default setting, + though, to match Emacs' defaults. With this system, you may + want enable option `icomplete-mode' to improve the display + of completion candidates at least." + :group 'flycheck + :type '(choice (const :tag "IDO" ido) + (const :tag "Grizzl" grizzl) + (const :tag "Completing read" nil)) + :package-version '(flycheck . "0.17")) + +(defcustom flycheck-temp-prefix "flycheck" + "Prefix for temporary files created by Flycheck." + :group 'flycheck + :type 'string + :package-version '(flycheck . "0.19") + :risky t) + +(defcustom flycheck-mode-hook nil + "Hooks to run after `flycheck-mode'." + :group 'flycheck + :type 'hook + :risky t) + +(defcustom flycheck-after-syntax-check-hook nil + "Functions to run after each syntax check. + +This hook is run after a syntax check was finished. + +At this point, *all* chained checkers were run, and all errors +were parsed, highlighted and reported. The variable +`flycheck-current-errors' contains all errors from all syntax +checkers run during the syntax check, so you can apply any error +analysis functions. + +Note that this hook does *not* run after each individual syntax +checker in the syntax checker chain, but only after the *last +checker*. + +This variable is a normal hook. See Info node `(elisp)Hooks'." + :group 'flycheck + :type 'hook + :risky t) + +(defcustom flycheck-before-syntax-check-hook nil + "Functions to run before each syntax check. + +This hook is run right before a syntax check starts. + +Error information from the previous syntax check is *not* +cleared before this hook runs. + +Note that this hook does *not* run before each individual syntax +checker in the syntax checker chain, but only before the *first +checker*. + +This variable is a normal hook. See Info node `(elisp)Hooks'." + :group 'flycheck + :type 'hook + :risky t) + +(defcustom flycheck-syntax-check-failed-hook nil + "Functions to run if a syntax check failed. + +This hook is run whenever an error occurs during Flycheck's +internal processing. No information about the error is given to +this hook. + +You should use this hook to conduct additional cleanup actions +when Flycheck failed. + +This variable is a normal hook. See Info node `(elisp)Hooks'." + :group 'flycheck + :type 'hook + :risky t) + +(defcustom flycheck-status-changed-functions nil + "Functions to run if the Flycheck status changed. + +This hook is run whenever the status of Flycheck changes. Each +hook function takes the status symbol as sinlge argument, as +given to `flycheck-report-status', which see. + +This variable is a abnormal hook. See Info +node `(elisp)Hooks'." + :group 'flycheck + :type 'hook + :risky t + :package-version '(flycheck . "0.20")) + +(defface flycheck-error + '((((supports :underline (:style wave))) + :underline (:style wave :color "Red1")) + (t + :underline t :inherit error)) + "Flycheck face for errors." + :package-version '(flycheck . "0.13") + :group 'flycheck-faces) + +(defface flycheck-warning + '((((supports :underline (:style wave))) + :underline (:style wave :color "DarkOrange")) + (t + :underline t :inherit warning)) + "Flycheck face for warnings." + :package-version '(flycheck . "0.13") + :group 'flycheck-faces) + +(defface flycheck-info + '((((supports :underline (:style wave))) + :underline (:style wave :color "ForestGreen")) + (t + :underline t :inherit success)) + "Flycheck face for informational messages." + :package-version '(flycheck . "0.15") + :group 'flycheck-faces) + +(defface flycheck-fringe-error + '((t :inherit error)) + "Flycheck face for fringe error indicators." + :package-version '(flycheck . "0.13") + :group 'flycheck-faces) + +(defface flycheck-fringe-warning + '((t :inherit warning)) + "Flycheck face for fringe warning indicators." + :package-version '(flycheck . "0.13") + :group 'flycheck-faces) + +(defface flycheck-fringe-info + ;; Semantically `success' is probably not the right face, but it looks nice as + ;; a base face + '((t :inherit success)) + "Flycheck face for fringe info indicators." + :package-version '(flycheck . "0.15") + :group 'flycheck-faces) + +(defface flycheck-error-list-error + '((t :inherit error)) + "Flycheck face for error messages in the error list." + :package-version '(flycheck . "0.16") + :group 'flycheck-faces) + +(defface flycheck-error-list-warning + '((t :inherit warning)) + "Flycheck face for warning messages in the error list." + :package-version '(flycheck . "0.16") + :group 'flycheck-faces) + +(defface flycheck-error-list-info + '((t :inherit success)) + "Flycheck face for info messages in the error list." + :package-version '(flycheck . "0.16") + :group 'flycheck-faces) + +;; The base faces for the following two faces are inspired by Compilation Mode +(defface flycheck-error-list-line-number + '((t :inherit font-lock-keyword-face)) + "Face for line numbers in the error list." + :group 'flycheck-faces + :version '(flycheck . "0.16")) + +(defface flycheck-error-list-column-number + '((t :inherit font-lock-doc-face)) + "Face for line numbers in the error list." + :group 'flycheck-faces + :version '(flycheck . "0.16")) + +(defface flycheck-error-list-highlight + '((t :inherit highlight)) + "Flycheck face to highlight errors in the error list." + :package-version '(flycheck . "0.15") + :group 'flycheck-faces) + +(defface flycheck-error-list-highlight-at-point + '((t :inherit lazy-highlight)) + "Flycheck face to highlight error at point in the error list." + :package-version '(flycheck . "0.15") + :group 'flycheck-faces) + +(defvar flycheck-command-map + (let ((map (make-sparse-keymap))) + (define-key map "c" 'flycheck-buffer) + (define-key map "C" 'flycheck-clear) + (define-key map (kbd "C-c") 'flycheck-compile) + (define-key map "n" 'flycheck-next-error) + (define-key map "p" 'flycheck-previous-error) + (define-key map "l" 'flycheck-list-errors) + (define-key map (kbd "C-w") 'flycheck-copy-messages-as-kill) + (define-key map "/" 'flycheck-google-messages) + (define-key map "s" 'flycheck-select-checker) + (define-key map "e" 'flycheck-set-checker-executable) + (define-key map "?" 'flycheck-describe-checker) + (define-key map "i" 'flycheck-info) + (define-key map "V" 'flycheck-version) + map) + "Keymap of Flycheck interactive commands.") + +(defcustom flycheck-keymap-prefix (kbd "C-c !") + "Prefix for key bindings of Flycheck. + +Changing this variable outside Customize does not have any +effect. To change the keymap prefix from Lisp, you need to +explicitly re-define the prefix key: + + (define-key flycheck-mode-map flycheck-keymap-prefix nil) + (setq flycheck-keymap-prefix (kbd \"C-c f\")) + (define-key flycheck-mode-map flycheck-keymap-prefix + flycheck-command-map) + +Please note that Flycheck's manual documents the default +keybindings. Changing this variable is at your own risk." + :group 'flycheck + :package-version '(flycheck . "0.19") + :type 'string + :risky t + :set + (lambda (variable key) + (when (and (boundp variable) (boundp 'flycheck-mode-map)) + (define-key flycheck-mode-map (symbol-value variable) nil) + (define-key flycheck-mode-map key flycheck-command-map)) + (set-default variable key))) + +(defcustom flycheck-mode-line '(:eval (flycheck-mode-line-status-text)) + "Mode line lighter for Flycheck. + +The value of this variable is a mode line template as in +`mode-line-format'. See Info Node `(elisp)Mode Line Format' for +more information. Note that it should contain a _single_ mode +line construct only. + +Customize this variable to change how Flycheck reports its status +in the mode line. You may use `flycheck-mode-line-status-text' +to obtain a human-readable status text, including an +error/warning count. + +You may also assemble your own status text. The current status +of Flycheck is available in `flycheck-last-status-change'. The +errors in the current buffer are stored in +`flycheck-current-errors', and the function +`flycheck-count-errors' may be used to obtain the number of +errors grouped by error level. + +Set this variable to nil to disable the mode line completely." + :group 'flycheck + :type 'sexp + :risky t + :package-version '(flycheck . "0.20")) + +(defcustom flycheck-error-list-mode-line + `(,(propertized-buffer-identification "%12b") + " for buffer " + (:eval (flycheck-error-list-propertized-source-name))) + "Mode line construct for Flycheck error list. + +The value of this variable is a mode line template as in +`mode-line-format', to be used as +`mode-line-buffer-identification' in `flycheck-error-list-mode'. +See Info Node `(elisp)Mode Line Format' for more information. + +Customize this variable to change how the error list appears in +the mode line. The default shows the name of the buffer and the +name of the source buffer, i.e. the buffer whose errors are +currently listed." + :group 'flycheck + :type 'sexp + :risky t + :package-version '(flycheck . "0.20")) + + +;;; Minor mode definition +(defvar flycheck-mode-menu-map + (easy-menu-create-menu + "Syntax Checking" + '(["Enable on-the-fly syntax checking" flycheck-mode + :style toggle :selected flycheck-mode + ;; Don't let users toggle the mode if there is no syntax checker for this + ;; buffer + :enable (flycheck-get-checker-for-buffer)] + ["Check current buffer" flycheck-buffer flycheck-mode] + ["Clear errors in buffer" flycheck-clear t] + "---" + ["Go to next error" flycheck-next-error flycheck-mode] + ["Go to previous error" flycheck-previous-error flycheck-mode] + ["Show all errors" flycheck-list-errors flycheck-mode] + "---" + ["Copy messages at point" flycheck-copy-messages-as-kill + (flycheck-overlays-at (point))] + ["Google messages at point" flycheck-google-messages + (flycheck-overlays-at (point))] + "---" + ["Select syntax checker" flycheck-select-checker flycheck-mode] + ["Set executable of syntax checker" flycheck-set-checker-executable + flycheck-mode] + "---" + ["Describe syntax checker" flycheck-describe-checker t] + ["Show Flycheck version" flycheck-version t] + ["Read the Flycheck manual" flycheck-info t])) + "Menu of `flycheck-mode'.") + +(defvar flycheck-mode-map + (let ((map (make-sparse-keymap))) + (define-key map flycheck-keymap-prefix flycheck-command-map) + ;; We place the menu under a custom menu key. Since this menu key is not + ;; present in the menu of the global map, no top-level menu entry is added + ;; to the global menu bar. However, it still appears on the mode line + ;; lighter. + (define-key map [menu-bar flycheck] flycheck-mode-menu-map) + map) + "Keymap of `flycheck-mode'.") + +(easy-menu-add-item nil '("Tools") flycheck-mode-menu-map "Spell Checking") + +(defun flycheck-teardown () + "Teardown Flycheck in the current buffer.. + +Completely clear the whole Flycheck state. Remove overlays, kill +running checks, and empty all variables used by Flycheck." + (flycheck-safe-delete-temporaries) + (flycheck-stop-checker) + (flycheck-clean-deferred-check) + (flycheck-clear) + (flycheck-cancel-error-display-error-at-point-timer) + (flycheck-clear-checker)) + +(defvar-local flycheck-old-next-error-function nil + "Remember the old `next-error-function'.") + +(defconst flycheck-hooks-alist + '( + ;; Handle events that may start automatic syntax checks + (after-save-hook . flycheck-handle-save) + (after-change-functions . flycheck-handle-change) + ;; Handle events that may triggered pending deferred checks + (window-configuration-change-hook . flycheck-perform-deferred-syntax-check) + (post-command-hook . flycheck-perform-deferred-syntax-check) + ;; Teardown Flycheck whenever the buffer state is about to get lost, to + ;; clean up temporary files and directories. + (kill-buffer-hook . flycheck-teardown) + (change-major-mode-hook . flycheck-teardown) + (before-revert-hook . flycheck-teardown) + ;; Update the error list if necessary + (post-command-hook . flycheck-error-list-update-source) + (post-command-hook . flycheck-error-list-highlight-errors) + ;; Show or hide error popups after commands + (post-command-hook . flycheck-display-error-at-point-soon) + (post-command-hook . flycheck-hide-error-buffer) + ;; Immediately show error popups when navigating to an error + (next-error-hook . flycheck-display-error-at-point)) + "Hooks which Flycheck needs to hook in. + +The `car' of each pair is a hook variable, the `cdr' a function +to be added or removed from the hook variable if Flycheck mode is +enabled and disabled respectively.") + +;;;###autoload +(define-minor-mode flycheck-mode + "Minor mode for on-the-fly syntax checking. + +When called interactively, toggle `flycheck-mode'. With prefix +ARG, enable `flycheck-mode' if ARG is positive, otherwise disable +it. + +When called from Lisp, enable `flycheck-mode' if ARG is omitted, +nil or positive. If ARG is `toggle', toggle `flycheck-mode'. +Otherwise behave as if called interactively. + +In `flycheck-mode' the buffer is automatically syntax-checked +using the first suitable syntax checker from `flycheck-checkers'. +Use `flycheck-select-checker' to select a checker for the current +buffer manually. + +\\{flycheck-mode-map}" + :init-value nil + :keymap flycheck-mode-map + :lighter flycheck-mode-line + :group 'flycheck + :require 'flycheck + :after-hook (flycheck-buffer-automatically 'mode-enabled 'force-deferred) + (cond + (flycheck-mode + (flycheck-clear) + + (pcase-dolist (`(,hook . ,fn) flycheck-hooks-alist) + (add-hook hook fn nil 'local)) + + (setq flycheck-old-next-error-function (if flycheck-standard-error-navigation + next-error-function + :unset)) + (when flycheck-standard-error-navigation + (setq next-error-function #'flycheck-next-error-function))) + (t + (unless (eq flycheck-old-next-error-function :unset) + (setq next-error-function flycheck-old-next-error-function)) + + (pcase-dolist (`(,hook . ,fn) flycheck-hooks-alist) + (remove-hook hook fn 'local)) + + (flycheck-teardown)))) + +(defun flycheck-global-teardown () + "Teardown Flycheck in all buffers. + +Completely clear the whole Flycheck state in all buffers, stop +all running checks, remove all temporary files, and empty all +variables of Flycheck." + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when flycheck-mode + (flycheck-teardown))))) + +;; Clean up the entire state of Flycheck when Emacs is killed, to get rid of any +;; pending temporary files. +(add-hook 'kill-emacs-hook #'flycheck-global-teardown) + +(defun flycheck-unload-function () + "Unload function for Flycheck." + (global-flycheck-mode -1) + (easy-menu-remove-item nil '("Tools") (cadr flycheck-mode-menu-map)) + (remove-hook 'kill-emacs-hook #'flycheck-global-teardown) + (setq find-function-regexp-alist + (assq-delete-all 'flycheck-checker find-function-regexp-alist))) + + +;;; Version information +(defun flycheck-version (&optional show-version) + "Get the Flycheck version as string. + +If called interactively or if SHOW-VERSION is non-nil, show the +version in the echo area and the messages buffer. + +The returned string includes both, the version from package.el +and the library version, if both a present and different. + +If the version number could not be determined, signal an error, +if called interactively, or if SHOW-VERSION is non-nil, otherwise +just return nil." + (interactive (list t)) + (let ((version (pkg-info-version-info 'flycheck))) + (when show-version + (message "Flycheck version: %s" version)) + version)) + + +;;; Global syntax checking +(defun flycheck-may-enable-mode () + "Determine whether Flycheck mode may be enabled. + +Flycheck mode is not enabled for + +- ephemeral buffers (see `flycheck-ephemeral-buffer-p'), +- encrypted buffers (see `flycheck-encrypted-buffer-p'), +- remote files (see `file-remote-p'), +- or if no suitable syntax checker exists. + +Return t if Flycheck mode may be enabled, and nil otherwise." + (and (not (flycheck-ephemeral-buffer-p)) + (not (flycheck-encrypted-buffer-p)) + (not (and (buffer-file-name) (file-remote-p (buffer-file-name) 'method))) + (flycheck-get-checker-for-buffer))) + +(defun flycheck-mode-on-safe () + "Enable `flycheck-mode' if it is safe to do so. + +`flycheck-mode' is only enabled if `flycheck-may-enable-mode' +returns t." + (when (flycheck-may-enable-mode) + (flycheck-mode))) + +;;;###autoload +(define-globalized-minor-mode global-flycheck-mode flycheck-mode + flycheck-mode-on-safe + :init-value nil + :group 'flycheck + :require 'flycheck) + + +;;; Manual syntax checking +(defun flycheck-clear () + "Clear all errors in the current buffer." + (interactive) + (flycheck-delete-all-overlays) + (flycheck-clear-errors) + (flycheck-error-list-refresh) + (flycheck-hide-error-buffer)) + +(defun flycheck-buffer () + "Check syntax in the current buffer." + (interactive) + (flycheck-clean-deferred-check) + (if flycheck-mode + (unless (flycheck-running-p) + ;; Clear error list and mark all overlays for deletion. We do not + ;; delete all overlays immediately to avoid excessive re-displays and + ;; flickering, if the same errors gets highlighted again after the check + ;; completed. + (run-hooks 'flycheck-before-syntax-check-hook) + (flycheck-clear-errors) + (flycheck-mark-all-overlays-for-deletion) + (condition-case err + (let ((checker (flycheck-get-checker-for-buffer))) + (if checker + (flycheck-start-checker checker) + (flycheck-clear) + (flycheck-report-status 'no-checker))) + (error + (flycheck-report-error) + (signal (car err) (cdr err))))) + (user-error "Flycheck mode disabled"))) + + +;;; Deferred syntax checking +(defvar-local flycheck-deferred-syntax-check nil + "If non-nil, a deferred syntax check is pending.") + +(defun flycheck-must-defer-check () + "Determine whether the syntax check has to be deferred. + +A check has to be deferred if the buffer is not visible, or if the buffer is +currently being reverted. + +Return t if the check is to be deferred, or nil otherwise." + (or (not (get-buffer-window)) + ;; We defer the syntax check if Flycheck is already running, to + ;; immediately start a new syntax check after the current one finished, + ;; because the result of the current check will most likely be outdated by + ;; the time it is finished. + (flycheck-running-p) + ;; We must defer checks while a buffer is being reverted, to avoid race + ;; conditions while the buffer contents are being restored. + revert-buffer-in-progress-p)) + +(defun flycheck-deferred-check-p () + "Determine whether the current buffer has a deferred check. + +Return t if so, or nil otherwise." + flycheck-deferred-syntax-check) + +(defun flycheck-buffer-deferred () + "Defer syntax check for the current buffer." + (setq flycheck-deferred-syntax-check t)) + +(defun flycheck-clean-deferred-check () + "Clean an deferred syntax checking state." + (setq flycheck-deferred-syntax-check nil)) + +(defun flycheck-perform-deferred-syntax-check () + "Perform any deferred syntax checks." + (when (flycheck-deferred-check-p) + (flycheck-clean-deferred-check) + (flycheck-buffer-automatically))) + + +;;; Automatic syntax checking +(defun flycheck-may-check-automatically (&optional condition) + "Determine whether the buffer may be checked under CONDITION. + +Read-only buffers may never be checked automatically. + +If CONDITION is non-nil, determine whether syntax may checked +automatically according to +`flycheck-check-syntax-automatically'." + (and (not (or buffer-read-only (flycheck-ephemeral-buffer-p))) + (or (not condition) + (memq condition flycheck-check-syntax-automatically)))) + +(defun flycheck-buffer-automatically (&optional condition force-deferred) + "Automatically check syntax at CONDITION. + +Syntax is not checked if `flycheck-may-check-automatically' +returns nil for CONDITION. + +The syntax check is deferred if FORCE-DEFERRED is non-nil, or if +`flycheck-must-defer-check' returns t." + (when (and flycheck-mode (flycheck-may-check-automatically condition)) + (if (or force-deferred (flycheck-must-defer-check)) + (flycheck-buffer-deferred) + (with-demoted-errors "Error while checking syntax automatically: %S" + (flycheck-buffer))))) + +(defvar-local flycheck-idle-change-timer nil + "Timer to mark the idle time since the last change.") + +(defun flycheck-clear-idle-change-timer () + "Clear the idle change timer." + (when flycheck-idle-change-timer + (cancel-timer flycheck-idle-change-timer) + (setq flycheck-idle-change-timer nil))) + +(defun flycheck-handle-change (beg end _len) + "Handle a buffer change between BEG and END. + +BEG and END mark the beginning and end of the change text. _LEN +is ignored. + +Start a syntax check if a new line has been inserted into the +buffer." + ;; Save and restore the match data, as recommended in (elisp)Change Hooks + (save-match-data + (when flycheck-mode + ;; The buffer was changed, thus clear the idle timer + (flycheck-clear-idle-change-timer) + (if (string-match-p (rx "\n") (buffer-substring beg end)) + (flycheck-buffer-automatically 'new-line 'force-deferred) + (setq flycheck-idle-change-timer + (run-at-time flycheck-idle-change-delay nil + #'flycheck-handle-idle-change)))))) + +(defun flycheck-handle-idle-change () + "Handle an expired idle time since the last change." + (flycheck-clear-idle-change-timer) + (flycheck-buffer-automatically 'idle-change)) + +(defun flycheck-handle-save () + "Handle a save of the buffer." + (flycheck-buffer-automatically 'save)) + + +;;; Utility functions +(defun flycheck-sexp-to-string (sexp) + "Convert SEXP to a string. + +Like `prin1-to-string' but ensure that the returned string +is loadable." + (let ((print-quoted t) + (print-length nil) + (print-level nil)) + (prin1-to-string sexp))) + +(defun flycheck-string-to-number-safe (string) + "Safely convert STRING to a number. + +If STRING is of string type and a numeric string, convert STRING +to a number and return it. Otherwise return nil." + (let ((number-re (rx string-start (one-or-more (any digit)) string-end))) + (when (and (stringp string) (string-match-p number-re string)) + (string-to-number string)))) + +(defun flycheck-string-list-p (obj) + "Determine if OBJ is a list of strings." + (and (listp obj) (-all? #'stringp obj))) + +(defun flycheck-symbol-list-p (obj) + "Determine if OBJ is a list of symbols." + (and (listp obj) (-all? #'symbolp obj))) + +(defun flycheck-same-files-p (file-a file-b) + "Determine whether FILE-A and FILE-B refer to the same file." + (string= (directory-file-name (file-truename file-a)) + (directory-file-name (file-truename file-b)))) + +(defvar-local flycheck-temporaries nil + "Temporary files and directories created by Flycheck.") + +(defun flycheck-temp-dir-system () + "Create a unique temporary directory. + +Use `flycheck-temp-prefix' as prefix, and add the directory to +`flycheck-temporaries'. + +Return the path of the directory" + (let* ((tempdir (make-temp-file flycheck-temp-prefix 'directory))) + (push tempdir flycheck-temporaries) + tempdir)) + +(defun flycheck-temp-file-system (filename) + "Create a temporary file named after FILENAME. + +If FILENAME is non-nil, this function creates a temporary +directory with `flycheck-temp-dir-system', and creates a file +with the same name as FILENAME in this directory. + +Otherwise this function creates a temporary file with +`flycheck-temp-prefix' and a random suffix. The path of the file +is added to `flycheck-temporaries'. + +Add the path of the file to `flycheck-temporaries'. + +Return the path of the file." + (let (tempfile) + (if filename + (let ((directory (flycheck-temp-dir-system))) + (setq tempfile (expand-file-name (file-name-nondirectory filename) + directory))) + (setq tempfile (make-temp-file flycheck-temp-prefix))) + (push tempfile flycheck-temporaries) + tempfile)) + +(defun flycheck-temp-file-inplace (filename) + "Create an in-place copy of FILENAME. + +Prefix the file with `flycheck-temp-prefix' and add the path of +the file to `flycheck-temporaries'. + +If FILENAME is nil, fall back to `flycheck-temp-file-system'. + +Return the path of the file." + (if filename + (let* ((tempname (format "%s_%s" + flycheck-temp-prefix + (file-name-nondirectory filename))) + (tempfile (expand-file-name tempname + (file-name-directory filename)))) + (push tempfile flycheck-temporaries) + tempfile) + (flycheck-temp-file-system filename))) + +(defun flycheck-save-buffer-to-file (file-name) + "Save the contents of the current buffer to FILE-NAME." + (make-directory (file-name-directory file-name) t) + (let ((jka-compr-inhibit t)) + (write-region nil nil file-name nil 0))) + +(defun flycheck-save-buffer-to-temp (temp-file-fn) + "Save buffer to temp file returned by TEMP-FILE-FN. + +Return the name of the temporary file." + (let ((filename (funcall temp-file-fn (buffer-file-name)))) + ;; Do not flush short-lived temporary files onto disk + (let ((write-region-inhibit-fsync t)) + (flycheck-save-buffer-to-file filename)) + filename)) + +(defun flycheck-prepend-with-option (option items &optional prepend-fn) + "Prepend OPTION to each item in ITEMS, using PREPEND-FN. + +Prepend OPTION to each item in ITEMS. + +ITEMS is a list of strings to pass to the syntax checker. OPTION +is the option, as string. PREPEND-FN is a function called to +prepend OPTION to each item in ITEMS. It receives the option and +a single item from ITEMS as argument, and must return a string or +a list of strings with OPTION prepended to the item. If +PREPEND-FN is nil or omitted, use `list'. + +Return a list of strings where OPTION is prepended to each item +in ITEMS using PREPEND-FN. If PREPEND-FN returns a list, it is +spliced into the resulting list." + (unless (stringp option) + (error "Option %S is not a string" option)) + (unless prepend-fn + (setq prepend-fn #'list)) + (let ((prepend + (lambda (item) + (let ((result (funcall prepend-fn option item))) + (cond + ((and (listp result) (-all? #'stringp result)) result) + ((stringp result) (list result)) + (t (error "Invalid result type for option: %S" result))))))) + (apply #'append (mapcar prepend items)))) + +(defun flycheck-find-in-buffer (pattern) + "Find PATTERN in the current buffer. + +Return the result of the first matching group of PATTERN, or nil, +if PATTERN did not match." + (save-restriction + (widen) + (save-excursion + (goto-char (point-min)) + (when (re-search-forward pattern nil 'no-error) + (match-string-no-properties 1))))) + +(defun flycheck-ephemeral-buffer-p () + "Determine whether the current buffer is an ephemeral buffer. + +See Info node `(elisp)Buffer Names' for information about +ephemeral buffers." + (string-prefix-p " " (buffer-name))) + +(defun flycheck-encrypted-buffer-p () + "Determine whether the current buffer is an encrypted file. + +See Info node `(epa)Top' for Emacs' interface to encrypted +files." + ;; The EPA file handler sets this variable locally to remember the recipients + ;; of the encrypted file for re-encryption. Hence, a local binding of this + ;; variable is a good indication that the buffer is encrypted. I haven't + ;; found any better indicator anyway. + (local-variable-p 'epa-file-encrypt-to)) + +(defun flycheck-autoloads-file-p () + "Determine whether the current buffer is a autoloads file. + +Autoloads are generated by package.el during installation." + (string-suffix-p "-autoloads.el" (buffer-name))) + +(defun flycheck-in-user-emacs-directory-p (filename) + "Whether FILENAME is in `user-emacs-directory'." + (string-prefix-p (file-name-as-directory (file-truename user-emacs-directory)) + (file-truename filename))) + +(defun flycheck-safe-delete (file-or-dir) + "Safely delete FILE-OR-DIR." + (ignore-errors + (if (file-directory-p file-or-dir) + (delete-directory file-or-dir 'recursive) + (delete-file file-or-dir)))) + +(defun flycheck-safe-delete-temporaries () + "Safely delete all temp files and directories of Flycheck. + +Safely delete all files and directories listed in +`flycheck-temporaries' and set the variable's value to nil." + (mapc #'flycheck-safe-delete flycheck-temporaries) + (setq flycheck-temporaries nil)) + +(eval-and-compile + (defun flycheck-rx-message (form) + "Translate the `(message)' FORM into a regular expression." + (let ((body (or (cdr form) '((one-or-more not-newline))))) + (rx-submatch-n `(group-n 4 ,@body)))) + + (defun flycheck-rx-file-name (form) + "Translate the `(file-name)' FORM into a regular expression." + (let ((body (or (cdr form) '((minimal-match + (one-or-more not-newline)))))) + (rx-submatch-n `(group-n 1 ,@body)))) + + (defun flycheck-rx-to-string (form &optional no-group) + "Like `rx-to-string' for FORM, but with special keywords: + +`line' + matches the line number. + +`column' + matches the column number. + +`(file-name SEXP ...)' + matches the file name. SEXP constitutes the body of the message. If no + SEXP is given, use a default body of `(minimal-match + (one-or-more not-newline))'. + +`(message SEXP ...)' + matches the message. SEXP constitutes the body of the message. If no SEXP + is given, use a default body of `(one-or-more not-newline)'. + +NO-GROUP is passed to `rx-to-string'." + (let ((rx-constituents + (append + `((line . ,(rx (group-n 2 (one-or-more digit)))) + (column . ,(rx (group-n 3 (one-or-more digit)))) + (file-name flycheck-rx-file-name 0 nil) + (message flycheck-rx-message 0 nil)) + rx-constituents nil))) + (rx-to-string form no-group)))) + +(defun flycheck-current-load-file () + "Get the source file currently being loaded. + +Always return the name of the corresponding source file, never +any byte-compiled file. + +Return nil, if the currently loaded file cannot be determined." + (-when-let* ((this-file (cond + (load-in-progress load-file-name) + ((bound-and-true-p byte-compile-current-file)) + (t (buffer-file-name)))) + ;; A best guess for the source file of a compiled library. Works + ;; well in most cases, and especially for ELPA packages + (source-file (concat (file-name-sans-extension this-file) + ".el"))) + (when (file-exists-p source-file) + source-file))) + +(defun flycheck-module-root-directory (module &optional file-name) + "Get the root directory for a MODULE in FILE-NAME. + +MODULE is a qualified module name, either a string with +components separated by a dot, or as list of components. +FILE-NAME is the name of the file or directory containing the +module as string. When nil or omitted, defaults to the return +value of function `buffer-file-name'. + +Return the root directory of the module, that is, the directory, +from which FILE-NAME can be reached by descending directories +along each part of MODULE. + +If the MODULE name does not match the directory hierarchy upwards +from FILE-NAME, return the directory containing FILE-NAME. When +FILE-NAME is nil, return `default-directory'." + (let ((file-name (or file-name (buffer-file-name))) + (module-components (if (stringp module) + (split-string module (rx ".")) + (copy-sequence module)))) + (if (and module-components file-name) + (let ((parts (nreverse module-components)) + (base-directory (directory-file-name + (file-name-sans-extension file-name)))) + (while (and parts + (string= (file-name-nondirectory base-directory) + (car parts))) + (pop parts) + (setq base-directory (directory-file-name + (file-name-directory base-directory)))) + (file-name-as-directory base-directory)) + (if file-name (file-name-directory file-name) default-directory)))) + + +;;; Minibuffer tools +(defvar read-flycheck-checker-history nil + "`completing-read' history of `read-flycheck-checker'.") + +(defun read-flycheck-checker (prompt &optional default) + "Read a flycheck checker from minibuffer with PROMPT and DEFAULT. + +Return the checker as symbol, or default, if no checker was +chosen. If DEFAULT is nil and no checker was chosen, signal a +`user-error', if the underlying completion system does not +provide a default on its own." + (when (and default (not (flycheck-valid-checker-p default))) + (error "%S is no valid Flycheck checker" default)) + (let* ((candidates (mapcar #'symbol-name (flycheck-defined-checkers))) + (default (and default (symbol-name default))) + (input (pcase flycheck-completion-system + (`ido (ido-completing-read prompt candidates nil + 'require-match nil + 'read-flycheck-checker-history + default)) + (`grizzl (if (and (fboundp 'grizzl-make-index) + (fboundp 'grizzl-completing-read)) + (grizzl-completing-read + prompt (grizzl-make-index candidates)) + (user-error "Please install Grizzl from \ +https://github.com/d11wtq/grizzl"))) + (_ (completing-read prompt candidates nil 'require-match + nil 'read-flycheck-checker-history + default))))) + (when (string-empty-p input) + (unless default + (user-error "No syntax checker entered")) + (setq input default)) + (let ((checker (intern input))) + (unless (flycheck-valid-checker-p checker) + (error "%S is no Flycheck syntax checker" checker)) + checker))) + + +;;; Checker definitions +(defun flycheck-command-argument-p (arg) + "Check whether ARG is a valid command argument." + (pcase arg + ((pred stringp) t) + ((or `source `source-inplace `source-original) t) + ((or `temporary-directory `temporary-file-name) t) + (`(config-file ,option-name ,config-file-var) + (and (stringp option-name) + (symbolp config-file-var))) + (`(config-file ,option-name ,config-file-var ,prepender) + (and (stringp option-name) + (symbolp config-file-var) + (symbolp prepender))) + (`(,(or `option `option-list) ,option-name ,option-var) + (and (stringp option-name) + (symbolp option-var))) + (`(,(or `option `option-list) ,option-name ,option-var ,prepender) + (and (stringp option-name) + (symbolp option-var) + (symbolp prepender))) + (`(,(or `option `option-list) ,option-name ,option-var ,prepender ,filter) + (and (stringp option-name) + (symbolp option-var) + (symbolp prepender) + (symbolp filter))) + (`(option-flag ,option-name ,option-var) + (and (stringp option-name) + (symbolp option-var))) + (`(eval ,_) t) + (_ nil))) + +(defun flycheck-validate-next-checker (next-checker &optional validate-checker) + "Validate NEXT-CHECKER. + +With VALIDATE-CHECKER not nil, also validate the actual checker +being referred to. Otherwise just validate the general shape and +the predicate. + +Signal an error if NEXT-CHECKER is not a valid entry for +`:next-checkers'." + (let ((checker (pcase next-checker + ((pred symbolp) next-checker) + (`(no-errors . ,(pred symbolp)) (cdr next-checker)) + (`(warnings-only . ,(pred symbolp)) (cdr next-checker)) + (`(,predicate . ,(pred symbolp)) + (error "%S must be one of `no-errors' or `warnings-only'" + predicate)) + (`(_ . ,checker) + (error "%S must be a syntax checker symbol" checker)) + (_ (error "%S must be a symbol or a cons cell" + next-checker))))) + (when (and validate-checker + (not (flycheck-valid-checker-p checker))) + (error "%s is not a valid Flycheck syntax checker" checker)) + t)) + +(defconst flycheck-checker-version 1 + "The internal version of syntax checker declarations. + +Flycheck will not use syntax checkers whose version is less than +this constant.") + +(defun flycheck-verify-checker-properties (symbol) + "Verify the syntax checker properties of SYMBOL." + (let ((command (get symbol 'flycheck-command)) + (parser (get symbol 'flycheck-error-parser)) + (patterns (get symbol 'flycheck-error-patterns)) + (filter (get symbol 'flycheck-error-filter)) + (modes (get symbol 'flycheck-modes)) + (predicate (get symbol 'flycheck-predicate)) + (next-checkers (get symbol 'flycheck-next-checkers))) + (when (null command) + (error "Missing :command")) + (unless (stringp (car command)) + (error "Invalid command executable %S" (car command))) + (unless (-all? 'flycheck-command-argument-p (cdr command)) + (error "Invalid command arguments %S" command)) + (when (and (null parser) (null patterns)) + (error "Missing :error-patterns or :error-parser")) + (unless (functionp parser) + (error ":error-parser %S is not a function" parser)) + (unless (functionp filter) + (error ":error-filter %S is not a function" filter)) + (unless (or modes predicate) + (error "Missing :modes or :predicate")) + (unless (-all? #'symbolp modes) + (error "Invalid :modes %s, must be a symbol or a list thereof" modes)) + (unless (or (null predicate) (functionp predicate)) + (error ":predicate %S is not a function" predicate)) + (dolist (checker next-checkers) + (flycheck-validate-next-checker checker)))) + +(defun flycheck-set-checker-properties (symbol properties) + "Set and verify syntax checker PROPERTIES on SYMBOL. + +PROPERTIES is an alist of properties to set." + (pcase-dolist (`(,prop . ,value) properties) + (put symbol prop value)) + (flycheck-verify-checker-properties symbol) + (put symbol 'flycheck-checker-version flycheck-checker-version)) + +(defmacro flycheck-define-checker (symbol docstring &rest properties) + "Define SYMBOL as syntax checker with DOCSTRING and PROPERTIES. + +DOCSTRING provides documentation for the new syntax checker. Use +`flycheck-describe-checker' to view the documentation of a syntax +checker. + +The following PROPERTIES constitute a syntax checker. `:command' +is mandatory. A syntax checker must also have either `:modes' or +`:predicate', and either `:error-patterns' or `:error-parser'. +`:next-checkers' is entirely optional. + +Signal an error at macro-expansion time if a mandatory property +is missing or if any property as an invalid value. + +Any syntax checker defined with this macro is eligible for manual +syntax checker selection with `flycheck-select-checker'. To make +the new syntax checker available for automatic selection, it must +be registered in `flycheck-checkers'. + +`:command (EXECUTABLE ARG ...)' + An unquoted list describing the syntax checker command to + execute. + + EXECUTABLE must be a string with the executable of this + syntax checker. + + A variable `flycheck-CHECKER-executable' is implicitly + defined to allow overriding of the executable. The variable + is customizable and buffer-local. If this variable is + non-nil, Flycheck uses the value of the variable as + executable, otherwise it falls back to EXECUTABLE. In + either case, the executable is checked with + `executable-find' before use. + + Each ARG is an argument to the executable, either as string, + or as special symbol or form for + `flycheck-substitute-argument', which see. + +`:error-patterns ((LEVEL SEXP ...) ...)' + An unquoted list of error patterns to parse the output of + the syntax checker `:command'. + + LEVEL is either `error' or `warning' and denotes the + severity of errors matched by the pattern. The LEVEL is + followed by one or more RX `SEXP's which parse the error and + extract line, column, file name and error message. + + See `rx' for general information about RX, and + `flycheck-rx-to-string' for special RX forms provided by + Flycheck. + + All patterns are applied in the order of declaration to the + whole output of the syntax checker. Output already matched + by a pattern will not be matched by subsequent patterns. In + other words, the first pattern wins. + +`:error-parser FUNCTION' +`:error-parser (lambda (output checker buffer) BODY ...)' + A function to parse errors with, either as unquoted symbol, + or `lambda' form. + + The function must accept three arguments OUTPUT CHECKER + BUFFER, where OUTPUT is the syntax checker output as string, + CHECKER the syntax checker that was used, and BUFFER a + buffer object representing the checked buffer. The function + must return a list of `flycheck-error' objects parsed from + OUTPUT. + +`:error-filter FUNCTION' +`:error-filter (lambda (errors) BODY ...)' + A function to filter or modify errors parsed by + `:error-parser' or `:error-patterns'. + + The function takes the list of parsed `flycheck-error' + objects as sole argument and shall return a list of + `flycheck-error' as the result of the syntax checker. The + function is free to add or remove errors, or modify + individual errors. It may modify the list of errors as well + as individual errors in place. + + Syntax checkers will mostly use this feature to fix + misplaced error locations, or improve error messages. + +`:modes MODE' +`:modes (MODE ...)' + An unquoted major mode symbol or a list thereof. If + present, the syntax checker is only used if the major mode + of the buffer to check is equal (as in `eq') to any given + MODE. + + If a `:predicate' is present, it is additionally used in + each buffer of these MODEs. + +`:predicate FUNCTION' +`:predicate (lambda () BODY ...)' + A function to determine whether to use the syntax checker in + the current buffer, either as unquoted function symbol or + `lambda' form. The syntax checker is only used if this + function returns non-nil when called in the buffer to check. + If `:modes' is given, the function is only called in + matching modes. + +`:next-checkers (ITEM ...)' + An unquoted list defining the syntax checker to run after + this syntax checker. + + Flycheck tries all items in order of declaration. Each ITEM + is either a syntax checker symbol, or a cons + cell `(PREDICATE . CHECKER)'. + + In the former case, the syntax checker is always considered. + In the later case, CHECKER is only considered if the + PREDICATE matches. + + PREDICATE is either `no-errors' or `warnings-only'. With + `no-errors' CHECKER is only considered if this checker + reported no errors or warnings at all. With `warnings-only' + CHECKER is only considered if this checker reported only + warnings, but no errors. + + The first registered and available syntax checker with + matching predicate is executed after this checker." + (declare (indent 1) + (doc-string 2)) + (let ((modes (plist-get properties :modes)) + (command (plist-get properties :command)) + (executable-var (intern (format "flycheck-%s-executable" symbol)))) + `(progn + (defcustom ,executable-var nil + ,(format "The executable of the %s syntax checker. + +Either a string containing the name or the path of the +executable, or nil to use the default executable from the syntax +checker declaration. + +The default executable is %S." symbol (car command)) + :type '(choice (const :tag "Default executable" nil) + (string :tag "Name or path")) + :group 'flycheck-executables + :risky t) + + (make-variable-buffer-local ',executable-var) + (flycheck-set-checker-properties + ',symbol + (list '(flycheck-documentation . ,docstring) + '(flycheck-executable-var . ,executable-var) + '(flycheck-command . ,command) + (cons 'flycheck-error-parser + #',(or (plist-get properties :error-parser) + 'flycheck-parse-with-patterns)) + '(flycheck-error-patterns + . + ,(mapcar + (lambda (p) + (cons (flycheck-rx-to-string `(and ,@(cdr p)) 'no-group) + (car p))) + (plist-get properties :error-patterns))) + (cons 'flycheck-error-filter + #',(or (plist-get properties :error-filter) + 'flycheck-sanitize-errors)) + '(flycheck-modes . ,(if (and modes (symbolp modes)) + (list modes) + modes)) + (cons 'flycheck-predicate #',(plist-get properties :predicate)) + '(flycheck-next-checkers . ,(plist-get properties :next-checkers)) + (cons 'flycheck-file (flycheck-current-load-file))))))) + +;;;###autoload +(defmacro flycheck-def-config-file-var (symbol checker &optional file-name + &rest custom-args) + "Define SYMBOL as config file variable for CHECKER, with default FILE-NAME. + +SYMBOL is declared as customizable, buffer-local variable using +`defcustom', to provide a configuration file for the given syntax +CHECKER. CUSTOM-ARGS are forwarded to `defcustom'. + +FILE-NAME is the initial value of the new variable. If omitted, +the default value is nil. + +Use this together with the `config-file' form in the `:command' +argument to `flycheck-define-checker'." + (declare (indent 3)) + `(progn + (put ',checker 'flycheck-config-file-var ',symbol) + (defcustom ,symbol ,file-name + ,(format "Configuration file for `%s'. + +If set to a string, locate the configuration file using the +functions from `flycheck-locate-config-file-functions'. If the +file is found pass it to the syntax checker as configuration +file. + +If no configuration file is found, or if this variable is set to +nil, invoke the syntax checker without a configuration file. + +Use this variable as file-local variable if you need a specific +configuration file a buffer." checker) + :type '(choice (const :tag "No configuration file" nil) + (string :tag "File name or path")) + :group 'flycheck-config-files + ,@custom-args) + (make-variable-buffer-local ',symbol))) + +;;;###autoload +(defmacro flycheck-def-option-var (symbol init-value checker docstring + &rest custom-args) + "Define SYMBOL as option variable with INIT-VALUE for CHECKER. + +SYMBOL is declared as customizable variable, buffer-local +variable using `defcustom', to provide an option for the given +syntax CHECKER. INIT-VALUE is the initial value of the variable, +and DOCSTRING is its docstring. CUSTOM-ARGS are forwarded to +`defcustom'. + +Use this together with the `option', `option-list' and +`option-flag' forms in the `:command' argument to +`flycheck-define-checker'." + (declare (indent 3) + (doc-string 4)) + `(progn + (let ((options (flycheck-checker-option-vars ',checker))) + (unless (memq ',symbol options) + (put ',checker 'flycheck-option-vars (cons ',symbol options)))) + (defcustom ,symbol ,init-value + ,(format "%s + +This variable is an option for the syntax checker `%s'." docstring checker) + :group 'flycheck-options + ,@custom-args) + (make-variable-buffer-local ',symbol))) + + +;;; Checker extensions +(defun flycheck-add-next-checker (checker next-checker &optional append) + "Add a NEXT-CHECKER after CHECKER. + +CHECKER is a syntax checker symbol, to which to add NEXT-CHECKER. + +NEXT-CHECKER describes the syntax checker to run after CHECKER. +It is a either a syntax checker symbol, or a cons +cell `(PREDICATE . CHECKER)'. In the former case, always +consider the syntax checker. In the later case, only consider +CHECKER if the PREDICATE matches. PREDICATE is either `no-errors' +or `warnings-only'. In the former case, CHECKER is only +considered if this checker reported no errors or warnings at all, +in the latter case, CHECKER is only considered if this checker +reported only warnings, but no errors. + +NEXT-CHECKER is prepended before other checkers to run after +CHECKER, unless APPEND is non-nil." + (unless (flycheck-valid-checker-p checker) + (error "%s is not a valid syntax checker" checker)) + (flycheck-validate-next-checker next-checker 'validate-checker) + (if append + (put checker 'flycheck-next-checkers + (append (get checker 'flycheck-next-checkers) (list next-checker))) + (push next-checker (get checker 'flycheck-next-checkers)))) + + +;;; Checker API +(defun flycheck-valid-checker-p (checker) + "Check whether a CHECKER is valid. + +A valid checker is a symbol defined as syntax checker with +`flycheck-define-checker'." + (and (symbolp checker) + (= (or (get checker 'flycheck-checker-version) 0) + flycheck-checker-version))) + +(defun flycheck-defined-checkers () + "Find all defined syntax checkers. + +The returned list is sorted alphapetically by the symbol name of +the syntax checkers." + (let (defined-checkers) + (mapatoms (lambda (symbol) + (when (flycheck-valid-checker-p symbol) + (push symbol defined-checkers)))) + (sort defined-checkers #'string<))) + +(defun flycheck-registered-checker-p (checker) + "Determine whether CHECKER is registered. + +A checker is registered if it is contained in +`flycheck-checkers'." + (and (flycheck-valid-checker-p checker) + (memq checker flycheck-checkers))) + +(defun flycheck-disabled-checker-p (checker) + "Determine whether CHECKER is disabled. + +A checker is disabled if it is contained in +`flycheck-disabled-checkers'." + (memq checker flycheck-disabled-checkers)) + +(defun flycheck-enabled-checker-p (checker) + "Determine whether CHECKER is an enabled checker. + +A syntax checker is enabled, if it is registered and not +disabled." + (and (flycheck-registered-checker-p checker) + (not (flycheck-disabled-checker-p checker)))) + +(defun flycheck-enabled-checkers () + "Get all enabled syntax checkers. + +These are all syntax checkers which are registered in +`flycheck-checkers' and not disabled via +`flycheck-disabled-checkers'." + (-reject #'flycheck-disabled-checker-p flycheck-checkers)) + +(defun flycheck-checker-executable-variable (checker) + "Get the executable variable of CHECKER." + (get checker 'flycheck-executable-var)) + +(defun flycheck-checker-default-executable (checker) + "Get the default executable of CHECKER." + (car (get checker 'flycheck-command))) + +(defun flycheck-checker-executable (checker) + "Get the command executable of CHECKER. + +The executable is either the value of the variable +`flycheck-CHECKER-executable', or the default executable given in +the syntax checker definition, if the variable is nil." + (or (symbol-value (flycheck-checker-executable-variable checker)) + (flycheck-checker-default-executable checker))) + +(defun flycheck-checker-arguments (checker) + "Get the command arguments of CHECKER." + (cdr (get checker 'flycheck-command))) + +(defun flycheck-checker-modes (checker) + "Get the modes of CHECKER." + (let ((modes (get checker 'flycheck-modes))) + (if (and modes (symbolp modes)) + (list modes) + modes))) + +(defun flycheck-checker-predicate (checker) + "Get the predicate function of CHECKER." + (get checker 'flycheck-predicate)) + +(defun flycheck-checker-next-checkers (checker) + "Get the next checkers for CHECKER." + (get checker 'flycheck-next-checkers)) + +(defun flycheck-checker-error-patterns (checker) + "Get the error patterns of CHECKER. + +Each pattern has the form `(REGEXP . LEVEL)' where REGEXP is the +regular expression, and LEVEL the corresponding level symbol." + (get checker 'flycheck-error-patterns)) + +(defun flycheck-checker-error-parser (checker) + "Get the error parser of CHECKER." + (get checker 'flycheck-error-parser)) + +(defun flycheck-checker-error-filter (checker) + "Get the error filter of CHECKER." + (get checker 'flycheck-error-filter)) + +(defun flycheck-checker-pattern-to-error-regexp (pattern) + "Convert PATTERN into an error regexp for compile.el. + +Return a list representing PATTERN, suitable as element in +`compilation-error-regexp-alist'." + (let* ((regexp (car pattern)) + (level (cdr pattern)) + (level-no (pcase level + (`error 2) + (`warning 1)))) + (list regexp 1 2 3 level-no))) + +(defun flycheck-checker-compilation-error-regexp-alist (checker) + "Convert error patterns of CHECKER for use with compile.el. + +Return an alist of all error patterns of CHECKER, suitable for +use with `compilation-error-regexp-alist'." + (mapcar #'flycheck-checker-pattern-to-error-regexp + (flycheck-checker-error-patterns checker))) + +(defun flycheck-checker-documentation (checker) + "Get the documentation of CHECKER." + (documentation-property checker 'flycheck-documentation)) + +(defun flycheck-checker-file (checker) + "Get the file CHECKER was defined in. + +Return nil if the file cannot be determined." + (get checker 'flycheck-file)) + +(defun flycheck-checker-config-file-var (checker) + "Get the associated configuration file variable of CHECKER. + +Return nil if CHECKER has no associated configuration file +variable." + (get checker 'flycheck-config-file-var)) + +(defun flycheck-checker-option-vars (checker) + "Get the associated option variables of CHECKER. + +Return a (possibly empty) list of variable symbols." + (get checker 'flycheck-option-vars)) + +(defun flycheck-locate-config-file (filename checker) + "Locate the configuration file FILENAME for CHECKER. + +Locate the configuration file using +`flycheck-locate-config-file-functions'. + +Return the absolute path of the configuration file, or nil if no +configuration file was found." + (-when-let (filepath (run-hook-with-args-until-success + 'flycheck-locate-config-file-functions + filename checker)) + (when (file-exists-p filepath) + filepath))) + +(defun flycheck-substitute-argument (arg checker) + "Substitute ARG for CHECKER. + +Return a list of real arguments for the executable of CHECKER, +substituted for the symbolic argument ARG. Single arguments, +e.g. if ARG is a literal strings, are wrapped in a list. + +ARG may be one of the following forms: + +STRING + Return ARG unchanged. + +`source', `source-inplace' + Create a temporary file to check and return its path. With + `source-inplace' create the temporary file in the same + directory as the original file. The value of + `flycheck-temp-prefix' is used as prefix of the file name. + + With `source', try to retain the non-directory component of + the buffer's file name in the temporary file. + + `source' is the preferred way to pass the input file to a + syntax checker. `source-inplace' should only be used if the + syntax checker needs other files from the source directory, + such as include files in C. + +`source-original' + Return the path of the actual file to check, or an empty + string if the buffer has no file name. + + Note that the contents of the file may not be up to date + with the contents of the buffer to check. Do not use this + as primary input to a checker, unless absolutely necessary. + + When using this symbol as primary input to the syntax + checker, add `flycheck-buffer-saved-p' to the `:predicate'. + +`temporary-directory' + Create a unique temporary directory and return its path. + +`temporary-file-name' + Return a unique temporary filename. The file is *not* + created. + +`(config-file OPTION VARIABLE [PREPEND-FN])' + Search the configuration file bound to VARIABLE with + `flycheck-locate-config-file' and return a list of arguments + that pass this configuration file to the syntax checker, or + nil if the configuration file was not found. + + PREPEND-FN is called with the OPTION and the located + configuration file, and should return OPTION prepended + before the file, either a string or as list. If omitted, + PREPEND-FN defaults to `list'. + +`(option OPTION VARIABLE [PREPEND-FN [FILTER]])' + Retrieve the value of VARIABLE and return a list of + arguments that pass this value as value for OPTION to the + syntax checker. + + PREPEND-FN is called with the OPTION and the value of + VARIABLE, and should return OPTION prepended before the + file, either a string or as list. If omitted, PREPEND-FN + defaults to `list'. + + FILTER is an optional function to be applied to the value of + VARIABLE before prepending. This function must return nil + or a string. In the former case, return nil. In the latter + case, return a list of arguments as described above. + +`(option-list OPTION VARIABLE [PREPEND-FN [FILTER]])' + Retrieve the value of VARIABLE, which must be a list, + and prepend OPTION before each item in this list, using + PREPEND-FN. + + PREPEND-FN is called with the OPTION and each item of the + list as second argument, and should return OPTION prepended + before the item, either as string or as list. If omitted, + PREPEND-FN defaults to `list'. + + FILTER is an optional function to be applied to each item in + the list before prepending OPTION. It shall return the + option value for each item as string, or nil, if the item is + to be ignored. + +`(option-flag OPTION VARIABLE)' + Retrieve the value of VARIABLE and return OPTION, if the + value is non-nil. Otherwise return nil. + +`(eval FORM)' + Return the result of evaluating FORM in the buffer to be + checked. FORM must either return a string or a list of + strings, or nil to indicate that nothing should be + substituted for CELL. For all other return types, signal an + error + + _No_ further substitutions are performed, neither in FORM + before it is evaluated, nor in the result of evaluating + FORM. + +In all other cases, signal an error. + +Note that substitution is *not* recursive. No symbols or cells +are substituted within the body of cells!" + (pcase arg + ((pred stringp) (list arg)) + (`source + (list (flycheck-save-buffer-to-temp #'flycheck-temp-file-system))) + (`source-inplace + (list (flycheck-save-buffer-to-temp #'flycheck-temp-file-inplace))) + (`source-original (list (or (buffer-file-name) ""))) + (`temporary-directory (list (flycheck-temp-dir-system))) + (`temporary-file-name + (let ((directory (flycheck-temp-dir-system))) + (list (make-temp-name (expand-file-name "flycheck" directory))))) + (`(config-file ,option-name ,file-name-var) + (-when-let* ((value (symbol-value file-name-var)) + (file-name (flycheck-locate-config-file value checker))) + (flycheck-prepend-with-option option-name (list file-name)))) + (`(config-file ,option-name ,file-name-var ,prepend-fn) + (-when-let* ((value (symbol-value file-name-var)) + (file-name (flycheck-locate-config-file value checker))) + (flycheck-prepend-with-option option-name (list file-name) prepend-fn))) + (`(option ,option-name ,variable) + (-when-let (value (symbol-value variable)) + (unless (stringp value) + (error "Value %S of %S for option %s is not a string" + value variable option-name)) + (flycheck-prepend-with-option option-name (list value)))) + (`(option ,option-name ,variable ,prepend-fn) + (-when-let (value (symbol-value variable)) + (unless (stringp value) + (error "Value %S of %S for option %s is not a string" + value variable option-name)) + (flycheck-prepend-with-option option-name (list value) prepend-fn))) + (`(option ,option-name ,variable ,prepend-fn ,filter) + (-when-let (value (funcall filter (symbol-value variable))) + (unless (stringp value) + (error "Value %S of %S (filter: %S) for option %s is not a string" + value variable filter option-name)) + (flycheck-prepend-with-option option-name (list value) prepend-fn))) + (`(option-list ,option-name ,variable) + (let ((value (symbol-value variable))) + (unless (and (listp value) (-all? #'stringp value)) + (error "Value %S of %S for option %S is not a list of strings" + value variable option-name)) + (flycheck-prepend-with-option option-name value))) + (`(option-list ,option-name ,variable ,prepend-fn) + (let ((value (symbol-value variable))) + (unless (and (listp value) (-all? #'stringp value)) + (error "Value %S of %S for option %S is not a list of strings" + value variable option-name)) + (flycheck-prepend-with-option option-name value prepend-fn))) + (`(option-list ,option-name ,variable ,prepend-fn ,filter) + (let ((value (delq nil (mapcar filter (symbol-value variable))))) + (unless (and (listp value) (-all? #'stringp value)) + (error "Value %S of %S for option %S is not a list of strings" + value variable option-name)) + (flycheck-prepend-with-option option-name value prepend-fn))) + (`(option-flag ,option-name ,variable) + (when (symbol-value variable) + (list option-name))) + (`(eval ,form) + (let ((result (eval form))) + (cond + ((and (listp result) (-all? #'stringp result)) result) + ((stringp result) (list result)) + (t (error "Invalid result from evaluation of %S: %S" form result))))) + (_ (error "Unsupported argument %S" arg)))) + +(defun flycheck-checker-substituted-arguments (checker) + "Get the substituted arguments of a CHECKER. + +Substitute each argument of CHECKER using +`flycheck-substitute-argument'. This replaces any special +symbols in the command." + (apply #'append + (mapcar (lambda (arg) (flycheck-substitute-argument arg checker)) + (flycheck-checker-arguments checker)))) + +(defun flycheck-checker-shell-command (checker) + "Get a shell command for CHECKER. + +Perform substitution in the arguments of CHECKER, but with +`flycheck-substitute-shell-argument'. + +Return the command of CHECKER as single string, suitable for +shell execution." + (combine-and-quote-strings + (cons (flycheck-checker-executable checker) + (apply #'append + (mapcar (lambda (arg) + (if (memq arg '(source source-inplace source-original)) + (list (or (buffer-file-name) "")) + (flycheck-substitute-argument arg checker))) + (flycheck-checker-arguments checker)))))) + +(defun flycheck-check-modes (checker) + "Check the allowed modes of CHECKER. + +Check the current `major-mode' against the modes allowed for +CHECKER. Return t if the modes match or nil otherwise." + (let ((modes (flycheck-checker-modes checker))) + (or (not modes) (memq major-mode modes)))) + +(defun flycheck-check-predicate (checker) + "Check the predicate of CHECKER. + +Check the predicate of CHECKER. Return t if CHECKER has no +predicate function, otherwise return the result of calling the +predicate function." + (let ((predicate (flycheck-checker-predicate checker))) + (or (not predicate) (funcall predicate)))) + +(defun flycheck-check-executable (checker) + "Check the executable of the CHECKER." + (when (executable-find (flycheck-checker-executable checker)) t)) + +(defun flycheck-may-use-checker (checker) + "Determine whether a CHECKER may be used. + +Return t if CHECKER may be used for the current buffer and nil +otherwise." + (if (flycheck-valid-checker-p checker) + (and (flycheck-check-modes checker) + (flycheck-check-predicate checker) + (flycheck-check-executable checker)) + (lwarn 'flycheck :warning "%S is no valid Flycheck syntax checker. +Try to reinstall the package defining this syntax checker." checker) + nil)) + +(defun flycheck-may-use-next-checker (next-checker) + "Determine whether NEXT-CHECKER may be used." + (when (symbolp next-checker) + (push t next-checker)) + (let ((predicate (car next-checker)) + (next-checker (cdr next-checker))) + (and (or (eq predicate t) + (and (eq predicate 'no-errors) + (not (flycheck-has-current-errors-p))) + (and (eq predicate 'warnings-only) + (not (flycheck-has-current-errors-p 'error)))) + (flycheck-enabled-checker-p next-checker) + (flycheck-may-use-checker next-checker)))) + + +;;; Configuration file functions +(defun flycheck-locate-config-file-absolute-path (filepath _checker) + "Locate a configuration file by a FILEPATH. + +If FILEPATH is a contains a path separator, expand it against the +default directory and return it. Otherwise return nil. + +_CHECKER is ignored." + ;; If the path is just a plain file name, skip it. + (unless (string= (file-name-nondirectory filepath) filepath) + (expand-file-name filepath))) + +(defun flycheck-locate-config-file-projectile (filename _checker) + "Locate a configuration FILENAME in a projectile project. + +If the Projectile library (see URL +`https://github.com/bbatsov/projectile') is available and the +current buffer is within a Projectile project, search FILENAME in +the root directory of the project. If the file is found, return +its absolute path. + +Otherwise return nil. + +_CHECKER is ignored." + (when (fboundp 'projectile-project-root) + (-when-let* ((root (ignore-errors (projectile-project-root))) + (filepath (expand-file-name filename root))) + (when (file-exists-p filepath) + filepath)))) + +(defun flycheck-locate-config-file-ancestor-directories (filename _checker) + "Locate a configuration FILENAME in ancestor directories. + +If the current buffer has a file name, search FILENAME in the +directory of the current buffer and all ancestors thereof (see +`locate-dominating-file'). If the file is found, return its +absolute path. Otherwise return nil. + +_CHECKER is ignored." + (-when-let* ((basefile (buffer-file-name)) + (directory (locate-dominating-file basefile filename))) + (expand-file-name filename directory))) + +(defun flycheck-locate-config-file-home (filename _checker) + "Locate a configuration FILENAME in the home directory. + +Return the absolute path, if FILENAME exists in the user's home +directory, or nil otherwise." + (let ((path (expand-file-name filename "~"))) + (when (file-exists-p path) + path))) + +(mapc (apply-partially #'custom-add-frequent-value + 'flycheck-locate-config-file-functions) + '(flycheck-locate-config-file-absolute-path + flycheck-locate-config-file-projectile + flycheck-locate-config-file-ancestor-directories + flycheck-locate-config-file-home)) + + +;;; Generic option filters +(defun flycheck-option-int (value) + "Convert an integral option VALUE to a string. + +If VALUE is nil, return nil. Otherwise return VALUE converted to +a string." + (when value + (number-to-string value))) + +(defun flycheck-option-comma-separated-list (value &optional separator filter) + "Convert VALUE into a list separated by SEPARATOR. + +SEPARATOR is a string to separate items in VALUE, defaulting to +\",\". FILTER is an optional function, which takes a single +argument and returns either a string or nil. + +If VALUE is a list, apply FILTER to each item in VALUE, remove +all nil items, and return a single string of all remaining items +separated by SEPARATOR. + +Otherwise, apply FILTER to VALUE and return the result. +SEPARATOR is ignored in this case." + (let ((filter (or filter #'identity)) + (separator (or separator ","))) + (if (listp value) + (-when-let (value (delq nil (mapcar filter value))) + (string-join value separator)) + (funcall filter value)))) + + +;;; Syntax checker predicates +(defun flycheck-buffer-saved-p (&optional buffer) + "Determine whether BUFFER is saved to a file. + +BUFFER is the buffer to check. If omitted or nil, use the +current buffer as BUFFER. + +Return non-nil if the BUFFER is backed by a file, and not +modified, or nil otherwise." + (and (buffer-file-name buffer) (not (buffer-modified-p buffer)))) + + +;;; Checker selection +(defvar-local flycheck-last-checker nil + "The last checker used for the current buffer.") + +(defun flycheck-clear-checker () + "Clear configured and remembered checkers in the current buffer." + (setq flycheck-last-checker nil)) + +(defun flycheck-try-last-checker-for-buffer () + "Try the last checker for the current buffer. + +Return the checker if it may be used, or nil otherwise." + ;; We should not use the last checker if it was removed from the list of + ;; allowed checkers in the meantime + (when (and (flycheck-enabled-checker-p flycheck-last-checker) + (flycheck-may-use-checker flycheck-last-checker)) + flycheck-last-checker)) + +(defun flycheck-get-new-checker-for-buffer () + "Find a new checker for the current buffer. + +If a checker is found set `flycheck-last-checker' to re-use this +checker for the next check. + +Return the checker if there is any, or nil otherwise." + (let ((checkers (flycheck-enabled-checkers))) + (while (and checkers (not (flycheck-may-use-checker (car checkers)))) + (setq checkers (cdr checkers))) + (when checkers + (setq flycheck-last-checker (car checkers))))) + +(defun flycheck-get-checker-for-buffer () + "Find the checker for the current buffer. + +Return checker if there is a checker for the current buffer, or +nil otherwise." + (if flycheck-checker + (if (flycheck-may-use-checker flycheck-checker) + flycheck-checker + (user-error "Configured syntax checker %s cannot be used" + flycheck-checker)) + (or (flycheck-try-last-checker-for-buffer) + (flycheck-get-new-checker-for-buffer)))) + +(defun flycheck-get-next-checker-for-buffer (checker) + "Get the checker to run after CHECKER for the current buffer." + (let ((next-checkers (flycheck-checker-next-checkers checker))) + (while (and next-checkers + (not (flycheck-may-use-next-checker (car next-checkers)))) + (setq next-checkers (cdr next-checkers))) + (when next-checkers + (if (symbolp (car next-checkers)) + (car next-checkers) + (cdar next-checkers))))) + +(defun flycheck-select-checker (checker) + "Select CHECKER for the current buffer. + +CHECKER is a syntax checker symbol (see `flycheck-checkers') or +nil. In the former case, use CHECKER for the current buffer, +otherwise deselect the current syntax checker (if any) and use +automatic checker selection via `flycheck-checkers'. + +If called interactively prompt for CHECKER. With prefix arg +deselect the current syntax checker and enable automatic +selection again. + +Set `flycheck-checker' to CHECKER and automatically start a new +syntax check if the syntax checker changed. + +CHECKER will be used, even if it is not contained in +`flycheck-checkers', or if it is disabled via +`flycheck-disabled-checkers'." + (interactive + (if current-prefix-arg + (list nil) + (list (read-flycheck-checker "Select checker: " flycheck-last-checker)))) + (when (not (eq checker flycheck-checker)) + (setq flycheck-checker checker) + (when flycheck-mode + (flycheck-buffer)))) + + +;;; Checkers as compile commands +(defun flycheck-compile-name (_name) + "Get a name for a Flycheck compilation buffer. + +_NAME is ignored." + (format "*Flycheck %s*" (buffer-file-name))) + +(defun flycheck-compile (checker) + "Run CHECKER via `compile'. + +CHECKER must be a valid syntax checker. Interactively, prompt +for a syntax checker to run. + +Instead of highlighting errors in the buffer, this command pops +up a separate buffer with the entire output of the syntax checker +tool, just like `compile' (\\[compile])." + (interactive + (list (read-flycheck-checker "Run syntax checker as compile command: " + (or flycheck-checker flycheck-last-checker)))) + (unless (flycheck-valid-checker-p checker) + (user-error "%S is not a valid syntax checker" checker)) + (unless (buffer-file-name) + (user-error "Cannot compile buffers without backing file")) + (unless (flycheck-may-use-checker checker) + (user-error "Cannot use syntax checker %S in this buffer" checker)) + (let* ((command (flycheck-checker-shell-command checker)) + (buffer (compilation-start command nil #'flycheck-compile-name))) + (with-current-buffer buffer + (set (make-local-variable 'compilation-error-regexp-alist) + (flycheck-checker-compilation-error-regexp-alist checker))))) + + +;;; Documentation +;;;###autoload +(defun flycheck-info () + "Open the Flycheck manual." + (interactive) + (info "flycheck")) + +(define-button-type 'help-flycheck-checker-def + :supertype 'help-xref + 'help-function 'flycheck-goto-checker-definition + 'help-echo (purecopy "mouse-2, RET: find Flycheck checker definition")) + +(defconst flycheck-find-checker-regexp + (rx line-start (zero-or-more (syntax whitespace)) + "(" symbol-start "flycheck-define-checker" symbol-end + (eval (list 'regexp find-function-space-re)) + symbol-start + "%s" + symbol-end + (or (syntax whitespace) line-end)) + "Regular expression to find a checker definition.") + +(add-to-list 'find-function-regexp-alist + '(flycheck-checker . flycheck-find-checker-regexp)) + +(defun flycheck-goto-checker-definition (checker file) + "Go to to the definition of CHECKER in FILE." + (let ((location (find-function-search-for-symbol + checker 'flycheck-checker file))) + (pop-to-buffer (car location)) + (if (cdr location) + (goto-char (cdr location)) + (message "Unable to find checker location in file")))) + +(defun flycheck-checker-at-point () + "Return the Flycheck checker found at or before point. + +Return 0 if there is no checker." + (let ((symbol (variable-at-point 'any-symbol))) + (if (and (symbolp symbol) (flycheck-valid-checker-p symbol)) + symbol + 0))) + +(defun flycheck-describe-checker (checker) + "Display the documentation of CHECKER. + +CHECKER is a checker symbol. + +Pop up a help buffer with the documentation of CHECKER." + (interactive + (let* ((checker (flycheck-checker-at-point)) + (enable-recursive-minibuffers t) + (prompt (if (symbolp checker) + (format "Describe syntax checker (default %s): " checker) + "Describe syntax checker: ")) + (reply (read-flycheck-checker prompt))) + (list (or reply checker)))) + (if (or (null checker) (not (flycheck-valid-checker-p checker))) + (message "You didn't specify a Flycheck syntax checker.") + (help-setup-xref (list #'flycheck-describe-checker checker) + (called-interactively-p 'interactive)) + (save-excursion + (with-help-window (help-buffer) + (let ((executable (flycheck-checker-default-executable checker)) + (filename (flycheck-checker-file checker)) + (modes (flycheck-checker-modes checker)) + (config-file-var (flycheck-checker-config-file-var checker)) + (option-vars (-sort #'string< + (flycheck-checker-option-vars checker)))) + (princ (format "%s is a Flycheck syntax checker" checker)) + (when filename + (princ (format " in `%s'" (file-name-nondirectory filename))) + (with-current-buffer standard-output + (save-excursion + (re-search-backward "`\\([^`']+\\)'" nil t) + (help-xref-button 1 'help-flycheck-checker-def checker filename)))) + (princ ".\n\n") + (princ (format " This syntax checker executes \"%s\"" executable)) + (if config-file-var + (princ (format ", using a configuration file from `%s'.\n" + config-file-var)) + (princ ".\n")) + (when modes + (princ (format " It checks syntax in the major mode(s) %s. " + (string-join + (mapcar (apply-partially #'format "`%s'") modes) + ", ")))) + (with-current-buffer (help-buffer) + (save-excursion + (goto-char (point-min)) + (forward-paragraph) + (fill-region-as-paragraph (point) (point-max)))) + (princ "\n\n") + (princ (format " The executable can be overridden with `%s'." + (flycheck-checker-executable-variable checker))) + (princ "\n") + (when option-vars + (princ "\n This syntax checker can be configured with these options:\n\n") + (dolist (var option-vars) + (princ (format " * `%s'\n" var))))) + (princ (format "\nDocumentation:\n%s" + (flycheck-checker-documentation checker))))))) + + +;;; Checker error API +(cl-defstruct (flycheck-error + (:constructor flycheck-error-new) + (:constructor flycheck-error-new-at (line column + &optional level message + &key checker + (filename (buffer-file-name)) + (buffer (current-buffer))))) + "Structure representing an error reported by a syntax checker. +Slots: + +`buffer' + The buffer the reported was reported for, as buffer object. + +`checker' + The syntax checker which reported this error, as symbol. + +`filename' + The file name the error refers to, as string. + +`line' + The line number the error refers to, as number. + +`column' + The column number the error refers to, as number. + +`level' + The error level, as either `warning' or `error'." + buffer checker filename line column message level) + +(defmacro flycheck-error-with-buffer (err &rest forms) + "Switch to the buffer of ERR and evaluate FORMS. + +If the buffer of ERR is not live, FORMS are not evaluated." + (declare (indent 1) (debug t)) + `(when (buffer-live-p (flycheck-error-buffer ,err)) + (with-current-buffer (flycheck-error-buffer ,err) + ,@forms))) + +(defun flycheck-error-line-region (err) + "Get the line region of ERR. + +ERR is a Flycheck error whose region to get. + +Return a cons cell `(BEG . END)' where BEG is the first +non-whitespace character on the line ERR refers to, and END the +end of the line." + (flycheck-error-with-buffer err + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (forward-line (- (flycheck-error-line err) 1)) + (back-to-indentation) + (let ((beg (point)) + (end (line-end-position))) + (when (= beg end) + ;; The current line is empty, so include the previous line break + ;; character(s) to have any region at all + (forward-line -1) + (setq beg (line-end-position))) + (cons beg end)))))) + +(defun flycheck-error-column-region (err) + "Get the error column region of ERR. + +ERR is a Flycheck error whose region to get. + +Return a cons cell `(BEG . END)' where BEG is the character +before the error column, and END the actual error column, or nil +if ERR has no column." + (-when-let (column (flycheck-error-column err)) + (save-excursion + (save-restriction + (widen) + (let ((line (flycheck-error-line err))) + (goto-char (point-min)) + (forward-line (- line 1)) + (cond + ((> line (line-number-at-pos)) + ;; If the line is beyond the end of the file, return the very last + ;; column in the file + (cons (- (point-max) 1) (point-max))) + ((= (line-beginning-position) (line-end-position)) + ;; The line is empty, so there is no column to highlight on this + ;; line. Thus, return the last column of the previous line + (let ((end (line-beginning-position))) + (forward-line -1) + (cons (line-end-position) end))) + (:else + ;; The end is either the column offset of the line, or + ;; the end of the line, if the column offset points beyond the end + ;; of the line. + (let ((end (min (+ (line-beginning-position) column) + (+ (line-end-position) 1)))) + (cons (- end 1) end))))))))) + +(defun flycheck-error-thing-region (thing err) + "Get the region of THING at the column of ERR. + +ERR is a Flycheck error whose region to get. THING is a +understood by `thing-at-point'. + +Return a cons cell `(BEG . END)' where BEG is the beginning of +the THING at the error column, and END the end of the symbol. If +ERR has no error column, or if there is no THING at this column, +return nil." + (-when-let (column (car (flycheck-error-column-region err))) + (save-excursion + (save-restriction + (widen) + (goto-char column) + (bounds-of-thing-at-point thing))))) + +(defun flycheck-error-region-for-mode (err mode) + "Get the region of ERR for the highlighting MODE. + +ERR is a Flycheck error. MODE may be one of the following symbols: + +`columns' + Get the column region of ERR, or the line region if ERR + has no column. + +`symbols' + Get the symbol region of ERR, or the result of `columns', if + there is no sexp at the error column. + +`sexps' + Get the sexp region of ERR, or the result of `columns', if + there is no sexp at the error column. + +`lines' + Return the line region. + +Otherwise signal an error." + (pcase mode + (`columns (or (flycheck-error-column-region err) + (flycheck-error-line-region err))) + (`symbols (or (flycheck-error-thing-region 'symbol err) + (flycheck-error-region-for-mode err 'columns))) + (`sexps (or (flycheck-error-thing-region 'sexp err) + (flycheck-error-region-for-mode err 'columns))) + (`lines (flycheck-error-line-region err)) + (_ (error "Invalid mode %S" mode)))) + +(defun flycheck-error-pos (err) + "Get the buffer position of ERR. + +ERR is a Flycheck error whose position to get. + +The error position is the error column, or the first +non-whitespace character of the error line, if ERR has no error column." + (car (or (flycheck-error-column-region err) + (flycheck-error-line-region err)))) + +(defun flycheck-error-format (err) + "Format ERR as human-readable string. + +Return a string that represents the given ERR. This string does +_not_ include the file name." + (let* ((line (flycheck-error-line err)) + (column (flycheck-error-column err)) + (level (symbol-name (flycheck-error-level err))) + (checker (symbol-name (flycheck-error-checker err))) + (message (flycheck-error-message err)) + (format `(,(number-to-string line) ":" + ,@(when column (list (number-to-string column) ":")) + ,level ": " + ,message " (" ,checker ")"))) + (apply #'concat format))) + +(defun flycheck-error-< (err1 err2) + "Determine whether ERR1 goes before ERR2 by location. + +Compare by line numbers and then by column numbers." + (let ((line1 (flycheck-error-line err1)) + (line2 (flycheck-error-line err2))) + (if (= line1 line2) + (let ((col1 (flycheck-error-column err1)) + (col2 (flycheck-error-column err2))) + (and col2 + ;; Sort errors for the whole line first + (or (not col1) (< col1 col2)))) + (< line1 line2)))) + +(defun flycheck-error-level-< (err1 err2) + "Determine whether ERR1 goes before ERR2 by error level. + +Like `flycheck-error-<', but compares by error level severity +first. Levels of the same severity are compared by name." + (let* ((level1 (flycheck-error-level err1)) + (level2 (flycheck-error-level err2)) + (severity1 (flycheck-error-level-severity level1)) + (severity2 (flycheck-error-level-severity level2))) + (cond + ((= severity1 severity2) + (if (string= level1 level2) + (flycheck-error-< err1 err2) + (string< level1 level2))) + (t (< severity1 severity2))))) + + +;;; Error levels + +;;;###autoload +(defun flycheck-define-error-level (level &rest properties) + "Define a new error LEVEL with PROPERTIES. + +The following PROPERTIES constitute an error level: + +`:severity SEVERITY' + A number denoting the severity of this level. The higher + the number, the more severe is this level compared to other + levels. Defaults to 0. + + The severity is used by `flycheck-error-level-<' to + determine the ordering of errors according to their levels. + +`:overlay-category CATEGORY' + A symbol denoting the overlay category to use for error + highlight overlays for this level. See Info + node `(elisp)Overlay Properties' for more information about + overlay categories. + + A category for an error level overlay should at least define + the `face' property, for error highlighting. Other useful + properties for error level categories are `priority' to + influence the stacking of multiple error level overlays, and + `help-echo' to define a default error messages for errors + without messages. + +`:fringe-bitmap BITMAP' + A fringe bitmap symbol denoting the bitmap to use for fringe + indicators for this level. See Info node `(elisp)Fringe + Bitmaps' for more information about fringe bitmaps, + including a list of built-in fringe bitmaps. + +`:fringe-face FACE' + A face symbol denoting the face to use for fringe indicators + for this level. + +`:error-list-face FACE' + A face symbol denoting the face to use for messages of this + level in the error list. See `flycheck-list-errors'." + (declare (indent 1)) + (put level 'flycheck-error-level t) + (put level 'flycheck-error-severity + (or (plist-get properties :severity) 0)) + (put level 'flycheck-overlay-category + (plist-get properties :overlay-category)) + (put level 'flycheck-fringe-bitmap + (plist-get properties :fringe-bitmap)) + (put level 'flycheck-fringe-face + (plist-get properties :fringe-face)) + (put level 'flycheck-error-list-face + (plist-get properties :error-list-face))) + +(defun flycheck-error-level-p (level) + "Determine whether LEVEL is a Flycheck error level." + (get level 'flycheck-error-level)) + +(defun flycheck-error-level-severity (level) + "Get the numeric severity of LEVEL." + (or (get level 'flycheck-error-severity) 0)) + +(defun flycheck-error-level-overlay-category (level) + "Get the overlay category for LEVEL." + (get level 'flycheck-overlay-category)) + +(defun flycheck-error-level-fringe-bitmap (level) + "Get the fringe bitmap for LEVEL." + (get level 'flycheck-fringe-bitmap)) + +(defun flycheck-error-level-fringe-face (level) + "Get the fringe face for LEVEL." + (get level 'flycheck-fringe-face)) + +(defun flycheck-error-level-error-list-face (level) + "Get the error list face for LEVEL." + (get level 'flycheck-error-list-face)) + +(defun flycheck-error-level-make-fringe-icon (level side) + "Create the fringe icon for LEVEL at SIDE. + +Return a propertized string that shows a fringe bitmap according +to LEVEL and the given fringe SIDE. + +LEVEL is a Flycheck error level defined with +`flycheck-define-error-level', and SIDE is either `left-fringe' +or `right-fringe'. + +Return a propertized string representing the fringe icon, +intended for use as `before-string' of an overlay to actually +show the icon." + (unless (memq side '(left-fringe right-fringe)) + (error "Invalid fringe side: %S" side)) + (propertize "!" 'display + (list side + (flycheck-error-level-fringe-bitmap level) + (flycheck-error-level-fringe-face level)))) + + +;;; Built-in error levels +(put 'flycheck-error-overlay 'face 'flycheck-error) +(put 'flycheck-error-overlay 'priority 110) +(put 'flycheck-error-overlay 'help-echo "Unknown error.") + +(flycheck-define-error-level 'error + :severity 100 + :overlay-category 'flycheck-error-overlay + :fringe-bitmap 'exclamation-mark + :fringe-face 'flycheck-fringe-error + :error-list-face 'flycheck-error-list-error) + +(put 'flycheck-warning-overlay 'face 'flycheck-warning) +(put 'flycheck-warning-overlay 'priority 100) +(put 'flycheck-warning-overlay 'help-echo "Unknown warning.") + +(flycheck-define-error-level 'warning + :severity 10 + :overlay-category 'flycheck-warning-overlay + :fringe-bitmap 'question-mark + :fringe-face 'flycheck-fringe-warning + :error-list-face 'flycheck-error-list-warning) + +(put 'flycheck-info-overlay 'face 'flycheck-info) +(put 'flycheck-info-overlay 'priority 90) +(put 'flycheck-info-overlay 'help-echo "Unknown info.") + +(flycheck-define-error-level 'info + :severity -1 + :overlay-category 'flycheck-info-overlay + ;; Not exactly the right indicator, but looks pretty, and I prefer to use + ;; built-in bitmaps over diving into the hassle of messing around with custom + ;; fringe bitmaps + :fringe-bitmap 'empty-line + :fringe-face 'flycheck-fringe-info + :error-list-face 'flycheck-error-list-info) + + +;;; General error parsing +(defun flycheck-parse-output (output checker buffer) + "Parse OUTPUT from CHECKER in BUFFER. + +OUTPUT is a string with the output from the checker symbol +CHECKER. BUFFER is the buffer which was checked. + +Return the errors parsed with the error patterns of CHECKER." + (let* ((parser (or (flycheck-checker-error-parser checker) + #'flycheck-parse-with-patterns)) + (errors (funcall parser output checker buffer))) + (dolist (err errors) + ;; Remember the source buffer and checker in the error + (setf (flycheck-error-buffer err) buffer) + (setf (flycheck-error-checker err) checker)) + errors)) + +(defun flycheck-fix-error-filename (err buffer-files) + "Fix the file name of ERR from BUFFER-FILES. + +Make the file name of ERR absolute. If the absolute file name of +ERR is in BUFFER-FILES, replace it with the return value of the +function `buffer-file-name'." + (flycheck-error-with-buffer err + (-when-let (filename (flycheck-error-filename err)) + (setq filename (expand-file-name filename)) + (when (-any? (apply-partially #'flycheck-same-files-p filename) + buffer-files) + (setq filename (buffer-file-name))) + (setf (flycheck-error-filename err) filename))) + err) + + +;;; Error parsing with regular expressions +(defun flycheck-get-regexp (patterns) + "Create a single regular expression from PATTERNS." + (rx-to-string `(or ,@(mapcar (lambda (p) (list 'regexp (car p))) patterns)) + 'no-group)) + +(defun flycheck-tokenize-output-with-patterns (output patterns) + "Tokenize OUTPUT with PATTERNS. + +Split the output into error tokens, using all regular expressions +from the error PATTERNS. An error token is simply a string +containing a single error from OUTPUT. Such a token can then be +parsed into a structured error by applying the PATTERNS again, +see `flycheck-parse-errors-with-patterns'. + +Return a list of error tokens." + (let ((regexp (flycheck-get-regexp patterns)) + (last-match 0) + errors) + (while (string-match regexp output last-match) + (push (match-string 0 output) errors) + (setq last-match (match-end 0))) + (reverse errors))) + +(defun flycheck-try-parse-error-with-pattern (err pattern) + "Try to parse a single ERR with a PATTERN. + +Return the parsed error if PATTERN matched ERR, or nil +otherwise." + (let ((regexp (car pattern)) + (level (cdr pattern))) + (when (string-match regexp err) + (let ((filename (match-string 1 err)) + (line (match-string 2 err)) + (column (match-string 3 err)) + (message (match-string 4 err))) + (flycheck-error-new + :filename (unless (string-empty-p filename) filename) + :line (flycheck-string-to-number-safe line) + :column (flycheck-string-to-number-safe column) + :message (unless (string-empty-p message) message) + :level level))))) + +(defun flycheck-parse-error-with-patterns (err patterns) + "Parse a single ERR with error PATTERNS. + +Apply each pattern in PATTERNS to ERR, in the given order, and +return the first parsed error." + ;; Try to parse patterns in the order of declaration to make sure that the + ;; first match wins. + (let (parsed-error) + (while (and patterns + (not (setq parsed-error + (flycheck-try-parse-error-with-pattern + err (car patterns))))) + (setq patterns (cdr patterns))) + parsed-error)) + +(defun flycheck-parse-errors-with-patterns (errors patterns) + "Parse ERRORS with PATTERNS. + +ERRORS is a list of strings where each string is an unparsed +error message, typically from `flycheck-split-output'. PATTERNS +is a list of error patterns to parse ERRORS with. + +Return a list of parsed errors." + (mapcar (lambda (e) (flycheck-parse-error-with-patterns e patterns)) errors)) + +(defun flycheck-parse-with-patterns (output checker _buffer) + "Parse OUTPUT from CHECKER with error patterns. + +Uses the error patterns of CHECKER to tokenize the output and +tries to parse each error token with all patterns, in the order +of declaration. Hence an error is never matched twice by two +different patterns. The pattern declared first always wins. + +_BUFFER is ignored. + +Return a list of parsed errors and warnings (as `flycheck-error' +objects)." + (let ((patterns (flycheck-checker-error-patterns checker))) + (flycheck-parse-errors-with-patterns + (flycheck-tokenize-output-with-patterns output patterns) patterns))) + + +;;; Error parsers +(defun flycheck-parse-xml-region (beg end) + "Parse the xml region between BEG and END. + +Wrapper around `xml-parse-region' which transforms the return +value of this function into one compatible to +`libxml-parse-xml-region' by simply returning the first element +from the node list." + (car (xml-parse-region beg end))) + +(defvar flycheck-xml-parser + (if (fboundp 'libxml-parse-xml-region) + 'libxml-parse-xml-region 'flycheck-parse-xml-region) + "Parse an xml string from a region. + +Use libxml if Emacs is built with libxml support. Otherwise fall +back to `xml-parse-region'.") + +(defun flycheck-parse-xml-string (xml) + "Parse an XML string. + +Return the document tree parsed from XML in the form `(ROOT ATTRS +BODY...)'. ROOT is a symbol identifying the name of the root +element. ATTRS is an alist of the attributes of the root node. +BODY is zero or more body elements, either as strings (in case of +text nodes) or as XML nodes, in the same for as the root node." + (with-temp-buffer + (insert xml) + (funcall flycheck-xml-parser (point-min) (point-max)))) + +(defun flycheck-parse-checkstyle-file-node (node) + "Parse a single file NODE in a Checkstyle document. + +Return a list of all errors contained in the NODE, or nil if NODE +is not a file node." + (let ((filename (cdr (assq 'name (cadr node)))) + errors) + (dolist (child-node (cddr node)) + (when (and (listp child-node) (eq (car child-node) 'error)) + (let* ((attrs (cadr child-node)) + (line (flycheck-string-to-number-safe + (cdr (assq 'line attrs)))) + (column (flycheck-string-to-number-safe + (cdr (assq 'column attrs)))) + (severity (cdr (assq 'severity attrs))) + (message (cdr (assq 'message attrs)))) + (push (flycheck-error-new + :filename filename + :line line + :column (when (and column (> column 0)) column) + :message message + :level (pcase severity + (`"error" 'error) + (`"warning" 'warning) + (`"info" 'info) + ;; Default to error for unknown severity + (_ 'error))) + errors)))) + (nreverse errors))) + +(defun flycheck-parse-checkstyle (output _checker _buffer) + "Parse Checkstyle errors from OUTPUT. + +Parse Checkstyle-like XML output. Use this error parser for +checkers that have an option to output errors in this format. + +_CHECKER and _BUFFER are ignored. + +See URL `http://checkstyle.sourceforge.net/' for information +about Checkstyle." + (let ((root (flycheck-parse-xml-string output))) + (when (eq (car root) 'checkstyle) + (-mapcat #'flycheck-parse-checkstyle-file-node + (-filter (lambda (n) (and (listp n) (eq (car n) 'file))) + (cddr root)))))) + +(defun flycheck-parse-cppcheck-error-node (node) + "Parse a single error NODE from Cppcheck XML. + +Return a list of all Flycheck errors this node represents." + (let ((node-attrs (cadr node)) + errors) + (dolist (child-node (cddr node)) + (when (and (listp child-node) (eq (car child-node) 'location)) + (let ((child-attrs (cadr child-node))) + (push (flycheck-error-new + :filename (cdr (assq 'file child-attrs)) + :line (flycheck-string-to-number-safe + (cdr (assq 'line child-attrs))) + :message (cdr (assq 'verbose node-attrs)) + :level (if (string= (cdr (assq 'severity node-attrs)) "error") + 'error 'warning)) + errors)))) + (nreverse errors))) + +(defun flycheck-parse-cppcheck (output _checker _buffer) + "Parse Cppcheck errors from OUTPUT. + +Parse Cppcheck XML v2 output. + +_BUFFER and _ERROR are ignored. + +See URL `http://cppcheck.sourceforge.net/' for more information +about Cppcheck." + (let ((root (flycheck-parse-xml-string output))) + (when (eq (car root) 'results) + (let ((nodes (cddr root))) + (while (and nodes + (not (and (listp (car nodes)) (eq (caar nodes) 'errors)))) + (setq nodes (cdr nodes))) + ;; Filter error nodes + (-mapcat #'flycheck-parse-cppcheck-error-node + (-filter (lambda (n) (and (listp n) (eq (car n) 'error))) + (car nodes))))))) + + +;;; Error filtering + +(defun flycheck-filter-errors (errors checker) + "Filter ERRORS from CHECKER. + +Apply the error filter of CHECKER to ERRORs and return the +result. If CHECKER has no error filter, fall back to +`flycheck-sanitize-errors'." + (let ((filter (or (flycheck-checker-error-filter checker) + #'flycheck-sanitize-errors))) + (funcall filter errors))) + +(defun flycheck-sanitize-errors (errors) + "Sanitize ERRORS. + +Sanitize ERRORS by trimming leading and trailing whitespace in +all error messages, and by replacing 0 columns and empty error +messages with nil. + +Returns sanitized ERRORS." + (dolist (err errors) + (flycheck-error-with-buffer err + (let ((message (flycheck-error-message err)) + (column (flycheck-error-column err))) + (when message + (setq message (string-trim message)) + (setf (flycheck-error-message err) + (if (string-empty-p message) nil message))) + (when (eq column 0) + (setf (flycheck-error-column err) nil))))) + errors) + +(defun flycheck-collapse-error-message-whitespace (errors) + "Collapse whitespace in all messages of ERRORS. + +Return ERRORS." + (dolist (err errors) + (-when-let (message (flycheck-error-message err)) + (setf (flycheck-error-message err) + (replace-regexp-in-string (rx (one-or-more (any space "\n" "\r"))) + " " message 'fixed-case 'literal)))) + errors) + +(defun flycheck-dedent-error-messages (errors) + "Dedent all messages of ERRORS. + +For each error in ERRORS, determine the indentation offset from +the leading whitespace of the first line, and dedent all further +lines accordingly. + +Return ERRORS, with in-place modifications." + (dolist (err errors) + (-when-let (message (flycheck-error-message err)) + (with-temp-buffer + (insert message) + ;; Determine the indentation offset + (goto-char (point-min)) + (back-to-indentation) + (let* ((indent-offset (- (point) (point-min)))) + ;; Now iterate over all lines and dedent each according to + ;; `indent-offset' + (while (not (eobp)) + (back-to-indentation) + ;; If the current line starts with sufficient whitespace, delete the + ;; indendation offset. Otherwise keep the line intact, as we might + ;; loose valuable information + (when (>= (- (point) (line-beginning-position)) indent-offset) + (delete-char (- indent-offset))) + (forward-line 1))) + (delete-trailing-whitespace (point-min) (point-max)) + (setf (flycheck-error-message err) + (buffer-substring-no-properties (point-min) (point-max)))))) + errors) + +(defun flycheck-fold-include-errors (errors sentinel-message) + "Fold errors from included files. + +ERRORS is a list of errors in which to fold errors. +SENTINEL-MESSAGE is the error message which denotes an error on +an include. + +The function will fold the messages of all subsequent errors in +the included file into the error on the include. + +Returns ERRORS, with folded messages." + ;; Fold messages from faulty includes into the errors on the corresponding + ;; include lines. The user still needs to visit the affected include to + ;; list and navigate these errors, but they can at least get an idea of + ;; what is wrong. + (let (including-filename ; The name of the file including a + ; faulty include + include-error ; The error on the include line + errors-in-include) ; All errors in the include, as strings + (dolist (err errors) + (-when-let* ((message (flycheck-error-message err)) + (filename (flycheck-error-filename err))) + (cond + ((and (string= message sentinel-message) + ;; Don't handle faulty includes recursively, we are only + ;; interested in “top-level” errors + (not including-filename)) + ;; We are looking at an error denoting a faulty include, so let's + ;; remember the error and the name of the include, and initialize + ;; our folded error message + (setq include-error err + including-filename filename + errors-in-include (list "Errors in included file:"))) + ((and include-error (not (string= filename including-filename))) + ;; We are looking at an error *inside* the last faulty include, so + ;; let's record err, as human-readable string + (push (flycheck-error-format err) errors-in-include)) + (include-error + ;; We are looking at an unrelated error, so fold all include + ;; errors, if there are any + (when (and include-error errors-in-include) + (setf (flycheck-error-message include-error) + (string-join (nreverse errors-in-include) "\n"))) + (setq include-error nil + including-filename nil + errors-in-include nil))))) + ;; If there are still pending errors to be folded, do so now + (when (and include-error errors-in-include) + (setf (flycheck-error-message include-error) + (string-join (nreverse errors-in-include) "\n")))) + errors) + + +;;; Error analysis +(defvar-local flycheck-current-errors nil + "A list of all errors and warnings in the current buffer.") + +(defun flycheck-clear-errors () + "Remove all error information from the current buffer." + (setq flycheck-current-errors nil) + (flycheck-report-status 'not-checked)) + +(defun flycheck-relevant-error-p (err) + "Determine whether ERR is relevant for the current buffer. + +Return t if ERR may be shown for the current buffer, or nil +otherwise." + (flycheck-error-with-buffer err + (let ((file-name (flycheck-error-filename err)) + (message (flycheck-error-message err))) + (and + (or (not file-name) (flycheck-same-files-p file-name (buffer-file-name))) + message + (not (string-empty-p message)) + (flycheck-error-line err))))) + +(defun flycheck-relevant-errors (errors) + "Filter the relevant errors from ERRORS. + +Return a list of all errors that are relevant for their +corresponding buffer." + (-filter #'flycheck-relevant-error-p errors)) + +(defun flycheck-sort-errors (errors) + "Sort ERRORS by line and column numbers. + +ERRORS is modified by side effects." + (sort errors 'flycheck-error-<)) + +(defun flycheck-count-errors (errors) + "Count the number of warnings and errors in ERRORS. + +Return a cons cell whose `car' is the number of errors and whose +`car' is the number of warnings." + (let (counts-by-level) + (dolist (err errors) + (let* ((level (flycheck-error-level err)) + (item (assq level counts-by-level))) + (if item + (setcdr item (1+ (cdr item))) + (push (cons level 1) counts-by-level)))) + counts-by-level)) + +(defun flycheck-has-errors-p (errors &optional level) + "Determine if there are any ERRORS with LEVEL. + +If LEVEL is omitted check if ERRORS is not nil." + (if level + (-any? (lambda (e) (eq (flycheck-error-level e) level)) errors) + (when errors t))) + +(defun flycheck-has-current-errors-p (&optional level) + "Determine if the current buffer has errors with LEVEL. + +If LEVEL is omitted if the current buffer has any errors at all." + (flycheck-has-errors-p flycheck-current-errors level)) + + +;;; Error overlay management +(defun flycheck-add-overlay (err) + "Add overlay for ERR. + +Return the created overlay." + (flycheck-error-with-buffer err + ;; We must have a proper error region for the sake of fringe indication, + ;; error display and error navigation, even if the highlighting is disabled. + ;; We erase the highlighting later on in this case + (pcase-let* ((`(,beg . ,end) (flycheck-error-region-for-mode + err (or flycheck-highlighting-mode'lines))) + (overlay (make-overlay beg end)) + (level (flycheck-error-level err)) + (category (flycheck-error-level-overlay-category level))) + (unless (flycheck-error-level-p level) + (error "Undefined error level: %S" level)) + (overlay-put overlay 'flycheck-overlay t) + (overlay-put overlay 'flycheck-error err) + ;; TODO: Consider hooks to re-check if overlay contents change + (overlay-put overlay 'category category) + (unless flycheck-highlighting-mode + ;; Erase the highlighting from the overlay if requested by the user + (overlay-put overlay 'face nil)) + (when flycheck-indication-mode + (overlay-put overlay 'before-string + (flycheck-error-level-make-fringe-icon + level flycheck-indication-mode))) + (overlay-put overlay 'help-echo (flycheck-error-message err)) + overlay))) + +(defun flycheck-filter-overlays (overlays) + "Get all Flycheck overlays from OVERLAYS." + (-filter (lambda (o) (overlay-get o 'flycheck-overlay)) overlays)) + +(defun flycheck-overlays-at (pos) + "Get all Flycheck overlays at POS." + (flycheck-filter-overlays (overlays-at pos))) + +(defun flycheck-overlays-in (beg end) + "Get all Flycheck overlays between BEG and END." + (flycheck-filter-overlays (overlays-in beg end))) + +(defun flycheck-overlay-errors-at (pos) + "Return a list of all flycheck errors overlayed at POS." + (mapcar (lambda (o) (overlay-get o 'flycheck-error)) + (flycheck-overlays-at pos))) + +(defun flycheck-overlay-errors-in (beg end) + "Return a list of all flycheck errors overlayed between BEG and END." + (mapcar (lambda (o) (overlay-get o 'flycheck-error)) + (flycheck-overlays-in beg end))) + +(defvar-local flycheck-overlays-to-delete nil + "Overlays mark for deletion after all syntax checks completed.") +(put 'flycheck-overlays-to-delete 'permanent-local t) + +(defun flycheck-delete-all-overlays () + "Remove all flycheck overlays in the current buffer." + (flycheck-delete-marked-overlays) + (save-restriction + (widen) + (mapc #'delete-overlay (flycheck-overlays-in (point-min) (point-max))))) + +(defun flycheck-mark-all-overlays-for-deletion () + "Mark all current overlays for deletion." + (setq flycheck-overlays-to-delete + (append (flycheck-overlays-in (point-min) (point-max)) + flycheck-overlays-to-delete))) + +(defun flycheck-delete-marked-overlays () + "Delete all overlays marked for deletion." + (mapc #'delete-overlay flycheck-overlays-to-delete) + (setq flycheck-overlays-to-delete nil)) + + +;;; Error navigation +(defun flycheck-next-error-pos (n &optional reset) + "Get the position of the N-th next error. + +With negative n, get the position of the (-N)-th previous error +instead. With non-nil RESET, search from `point-min', otherwise +search from the current point. + +Return the position of the next or previous error, or nil if +there is none." + (let ((n (or n 1)) + (pos (if reset (point-min) (point)))) + (if (>= n 0) + ;; Search forwards + (while (and pos (> n 0)) + (setq n (1- n)) + (when (get-char-property pos 'flycheck-error) + ;; Move beyond from the current error if any + (setq pos (next-single-char-property-change pos 'flycheck-error))) + (while (not (or (= pos (point-max)) + (get-char-property pos 'flycheck-error))) + ;; Scan for the next error + (setq pos (next-single-char-property-change pos 'flycheck-error))) + (when (and (= pos (point-max)) + (not (get-char-property pos 'flycheck-error))) + ;; If we reached the end of the buffer, but no error, we didn't find + ;; any + (setq pos nil))) + ;; Search backwards + (while (and pos (< n 0)) + (setq n (1+ n)) + ;; Loop until we find an error. We need to check the position *before* + ;; the current one, because `previous-single-char-property-change' + ;; always moves to the position *of* the change. + (while (not (or (= pos (point-min)) + (get-char-property (1- pos) 'flycheck-error))) + (setq pos (previous-single-char-property-change pos 'flycheck-error))) + (when (and (= pos (point-min)) + (not (get-char-property pos 'flycheck-error))) + ;; We didn't find any error. + (setq pos nil)) + (when pos + ;; We found an error, so move to its beginning + (setq pos (previous-single-char-property-change pos + 'flycheck-error))))) + pos)) + +(defun flycheck-next-error-function (n reset) + "Visit the N-th error from the current point. + +Intended for use with `next-error-function'." + (let ((pos (flycheck-next-error-pos n reset))) + (if pos + (goto-char pos) + (user-error "No more Flycheck errors")))) + +(defun flycheck-next-error (&optional n reset) + "Visit the N-th error from the current point. + +If RESET is given and non-nil, re-start from the beginning of the buffer. + +N specifies how many errors to move forwards. If negative, move backwards." + (interactive "P") + (when (consp n) + ;; Universal prefix argument means reset + (setq reset t n nil)) + (flycheck-next-error-function n reset)) + +(defun flycheck-previous-error (&optional n) + "Visit the N-th previous error. + +If given, N specifies the number of errors to move backwards. If +N is negative, move forwards instead." + (interactive "P") + (flycheck-next-error (- (or n 1)))) + +(defun flycheck-first-error (&optional n) + "Visit the N-th error from beginning of the buffer. + +If given, N specifies the number of errors to move forward from +the beginning of the buffer." + (interactive "P") + (flycheck-next-error n 'reset)) + + +;;; Error list +(defconst flycheck-error-list-buffer "*Flycheck errors*" + "The name of the buffer to show error lists.") + +(defvar flycheck-error-list-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "n") #'flycheck-error-list-next-error) + (define-key map (kbd "p") #'flycheck-error-list-previous-error) + (define-key map (kbd "RET") #'flycheck-error-list-goto-error) + map) + "The keymap of `flycheck-error-list-mode'.") + +(define-derived-mode flycheck-error-list-mode tabulated-list-mode "Flycheck errors" + "Major mode for listing Flycheck errors. + +\\{flycheck-error-list-mode-map}" + (setq tabulated-list-format + [("Line" 4 flycheck-error-list-entry-< :right-align t) + ("Col" 3 nil :right-align t) + ("Level" 8 flycheck-error-list-entry-level-<) + ("Message" 0 nil)] + ;; Sort by location initially + tabulated-list-sort-key (cons "Line" nil) + tabulated-list-padding 1 + tabulated-list-entries #'flycheck-error-list-entries + ;; `revert-buffer' updates the mode line for us, so all we need to do is + ;; set the corresponding mode line construct. + mode-line-buffer-identification flycheck-error-list-mode-line) + (tabulated-list-init-header)) + +(defvar-local flycheck-error-list-source-buffer nil + "The current source buffer of the error list.") +;; Needs to permanently local to preserve the source buffer across buffer +;; reversions +(put 'flycheck-error-list-source-buffer 'permanent-local t) + +(defun flycheck-error-list-set-source (buffer) + "Set BUFFER as the source buffer of the error list." + (when (get-buffer flycheck-error-list-buffer) + (with-current-buffer flycheck-error-list-buffer + ;; Only update the source when required + (unless (eq buffer flycheck-error-list-source-buffer) + (setq flycheck-error-list-source-buffer buffer) + (flycheck-error-list-refresh))))) + +(defun flycheck-error-list-update-source () + "Update the source buffer of the error list." + (when (not (eq (current-buffer) (get-buffer flycheck-error-list-buffer))) + ;; We must not update the source buffer, if the current buffer is the error + ;; list itself. + (flycheck-error-list-set-source (current-buffer)))) + +(defun flycheck-error-list-make-number-cell (number face) + "Make a table cell for a NUMBER with FACE. + +Convert NUMBER to string, fontify it with FACE and return the +string with attached text properties." + (if (numberp number) + (propertize (number-to-string number) 'font-lock-face face) + "")) + +(defun flycheck-error-list-make-entry (error) + "Make a table cell for the given ERROR. + +Return a list with the contents of the table cell." + (let ((level-face (flycheck-error-level-error-list-face + (flycheck-error-level error))) + (line (flycheck-error-line error)) + (column (flycheck-error-column error)) + (message (or (flycheck-error-message error) "Unknown error")) + (checker (flycheck-error-checker error))) + (list error + (vector (flycheck-error-list-make-number-cell + line 'flycheck-error-list-line-number) + (flycheck-error-list-make-number-cell + column 'flycheck-error-list-column-number) + (propertize (symbol-name (flycheck-error-level error)) + 'font-lock-face level-face) + (format "%s (%s)" message checker))))) + +(defun flycheck-error-list-entries () + "Create the entries for the error list." + (when (buffer-live-p flycheck-error-list-source-buffer) + (let ((errors (buffer-local-value 'flycheck-current-errors + flycheck-error-list-source-buffer))) + (mapcar #'flycheck-error-list-make-entry errors)))) + +(defun flycheck-error-list-entry-< (entry1 entry2) + "Determine whether ENTRY1 is before ENTRY2 by location. + +See `flycheck-error-<'." + (flycheck-error-< (car entry1) (car entry2))) + +(defun flycheck-error-list-entry-level-< (entry1 entry2) + "Determine whether ENTRY1 is before ENTRY2 by level. + +See `flycheck-error-level-<'." + (not (flycheck-error-level-< (car entry1) (car entry2)))) + +(defvar flycheck-error-list-mode-line-map + (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + #'flycheck-error-list-mouse-switch-to-source) + map) + "Keymap for error list mode line.") + +(defun flycheck-error-list-propertized-source-name () + "Get the name of the current source buffer for the mode line. + +Propertize the name of the current source buffer for use in the +mode line indication of `flycheck-error-list-mode'." + (let ((name (replace-regexp-in-string + (rx "%") "%%" + (buffer-name flycheck-error-list-source-buffer) + 'fixed-case 'literal))) + (propertize name 'face 'mode-line-buffer-id + 'mouse-face 'mode-line-highlight + 'help-echo "mouse-1: switch to source" + 'local-map flycheck-error-list-mode-line-map))) + +(defun flycheck-error-list-mouse-switch-to-source (event) + "Switch to the error list source buffer of the EVENT window." + (interactive "e") + (save-selected-window + (when (eventp event) + (select-window (posn-window (event-start event)))) + (when (buffer-live-p flycheck-error-list-source-buffer) + (switch-to-buffer flycheck-error-list-source-buffer)))) + +(defun flycheck-error-list-recenter-at (pos) + "Recenter the error list at POS." + (dolist (window (get-buffer-window-list flycheck-error-list-buffer + nil 'all-frames)) + (with-selected-window window + (goto-char pos) + (recenter)))) + +(defun flycheck-error-list-refresh () + "Refresh the current error list. + +Add all errors currently reported for the current +`flycheck-error-list-source-buffer', and recenter the error +list." + (interactive) + ;; We only refresh the error list, when it is visible in a window, and we + ;; select this window while reverting, because Tabulated List mode attempts to + ;; recenter the error at the old location, so it must have the proper window + ;; selected. + (-when-let (error-list-window (get-buffer-window flycheck-error-list-buffer + 'all-frames)) + (with-selected-window error-list-window + (revert-buffer)) + (flycheck-error-list-highlight-errors))) + +(defun flycheck-error-list-goto-error (&optional error) + "Go to the location of an ERROR from the error list. + +Interactively or when ERROR is not given, go to the error at +point." + (interactive) + (-when-let* ((error (or error (tabulated-list-get-id))) + (buffer (flycheck-error-buffer error))) + (when (buffer-live-p buffer) + (if (eq (window-buffer) (get-buffer flycheck-error-list-buffer)) + ;; When called from within the error list, keep the error list, + ;; otherwise replace the current buffer. + (pop-to-buffer buffer 'other-window) + (switch-to-buffer buffer)) + (let ((pos (flycheck-error-pos error))) + (unless (eq (goto-char pos) (point)) + ;; If widening gets in the way of moving to the right place, remove it + ;; and try again + (widen) + (goto-char pos))) + ;; Re-highlight the errors + (flycheck-error-list-highlight-errors)))) + +(defun flycheck-error-list-next-error-pos (pos &optional n) + "Get the N'th next error in the error list from POS. + +N defaults to 1. If N is negative, search for the previous error +instead. + +Get the beginning position of the N'th next error from POS, or +nil, if there is no next error." + (let ((n (or n 1)) + ) + (if (>= n 0) + ;; Search forward + (while (and pos (/= n 0)) + (setq n (1- n)) + (setq pos (next-single-property-change pos 'tabulated-list-id))) + ;; Search backwards + (while (/= n 0) + (setq n (1+ n)) + ;; We explicitly give the limit here to explicitly have the minimum + ;; point returned, to be able to move to the first error (which starts + ;; at `point-min') + (setq pos (previous-single-property-change pos 'tabulated-list-id + nil (point-min))))) + pos)) + +(defun flycheck-error-list-previous-error (n) + "Go to the N'th previous error in the error list." + (interactive "P") + (flycheck-error-list-next-error (- (or n 1)))) + +(defun flycheck-error-list-next-error (n) + "Go to the N'th next error in the error list." + (interactive "P") + (let ((pos (flycheck-error-list-next-error-pos (point) n))) + (when (and pos (/= pos (point))) + (goto-char pos) + (save-selected-window + ;; Keep the error list selected, so that the user can navigate errors by + ;; repeatedly pressing n/p, without having to re-select the error list + ;; window. + (flycheck-error-list-goto-error))))) + +(defvar-local flycheck-error-list-highlight-overlays nil + "Error highlight overlays in the error list buffer.") +(put 'flycheck-error-list-highlight-overlays 'permanent-local t) + +(defun flycheck-error-list-highlight-errors () + "Highlight errors in the error list." + (when (get-buffer flycheck-error-list-buffer) + (let ((errors-at-line (flycheck-overlay-errors-in (line-beginning-position) + (line-end-position))) + (errors-at-point (flycheck-overlay-errors-at (point)))) + (with-current-buffer flycheck-error-list-buffer + (let ((old-overlays flycheck-error-list-highlight-overlays) + (min-point (point-max)) + (max-point (point-min))) + ;; Display the new overlays first, to avoid re-display flickering + (setq flycheck-error-list-highlight-overlays nil) + (when errors-at-line + (let ((next-error-pos (point-min))) + (while next-error-pos + (let* ((beg next-error-pos) + (end (flycheck-error-list-next-error-pos beg)) + (err (tabulated-list-get-id beg)) + (face (cond + ((member err errors-at-point) + 'flycheck-error-list-highlight-at-point) + ((member err errors-at-line) + 'flycheck-error-list-highlight)))) + (when face + (setq min-point (min min-point beg) + max-point (max max-point beg)) + (let ((ov (make-overlay beg + ;; Extend overlay to the beginning of + ;; the next line, to highlight the + ;; whole line + (or end (point-max))))) + (push ov flycheck-error-list-highlight-overlays) + (overlay-put ov 'flycheck-error-highlight-overlay t) + (overlay-put ov 'face face))) + (setq next-error-pos end))))) + ;; Delete the old overlays + (mapc #'delete-overlay old-overlays) + ;; Move point to the middle error + (goto-char (+ min-point (/ (- max-point min-point) 2))) + (beginning-of-line) + ;; And recenter the error list at this position + (flycheck-error-list-recenter-at (point))))))) + +(defun flycheck-list-errors () + "Show the error list for the current buffer." + (interactive) + (unless flycheck-mode + (user-error "Flycheck mode not enabled")) + ;; Create and initialize the error list + (unless (get-buffer flycheck-error-list-buffer) + (with-current-buffer (get-buffer-create flycheck-error-list-buffer) + (flycheck-error-list-mode))) + (flycheck-error-list-set-source (current-buffer)) + ;; Show the error list in a window, and re-select the old window + (display-buffer flycheck-error-list-buffer) + ;; Finally, refresh the error list to show the most recent errors + (flycheck-error-list-refresh)) + +(defalias 'list-flycheck-errors 'flycheck-list-errors) + + +;;; Status reporting +(defvar-local flycheck-last-status-change 'not-checked + "The last status change in the current buffer.") + +(defun flycheck-report-error () + "Report a Flycheck error status. + +Clears all Flycheck errors first, runs +`flycheck-syntax-check-failed-hook' and reports the status with +`flycheck-report-status'." + (flycheck-clear) + (run-hooks 'flycheck-syntax-check-failed-hook) + (flycheck-report-status 'errored)) + +(defun flycheck-report-status (status) + "Report Flycheck STATUS. + +STATUS is one of the following symbols: + +`not-checked' + The current buffer was not checked. + +`no-checker' + Automatic syntax checker selection did not find a suitable + syntax checker. + +`running' + A syntax check is now running in the current buffer. + +`errored' + The current syntax check has errored. + +`finished' + The current syntax check was finished normally. + +`interrupted' + The current syntax check was interrupted. + +`suspicious' + The last syntax check had a suspicious result. + +Set `flycheck-last-status-change' and call +`flycheck-status-changed-functions' with STATUS. Afterwards +refresh the mode line." + (setq flycheck-last-status-change status) + (run-hook-with-args 'flycheck-status-changed-functions status) + (force-mode-line-update)) + + +;;; Mode line reporting +(defun flycheck-mode-line-status-text (&optional status) + "Get a text describing STATUS for use in the mode line. + +STATUS defaults to `flycheck-last-status-change' if omitted or +nil." + (let ((text (pcase (or status flycheck-last-status-change) + (`not-checked "") + (`no-checker "-") + (`running "*") + (`errored "!") + (`finished + (if flycheck-current-errors + (let ((error-counts (flycheck-count-errors + flycheck-current-errors))) + (format ":%s/%s" + (or (cdr (assq 'error error-counts)) 0) + (or (cdr (assq 'warning error-counts)) 0))) + "")) + (`interrupted "-") + (`suspicious "?")))) + (concat " FlyC" text))) + + +;;; General error display +(defun flycheck-display-errors (errors) + "Display ERRORS using `flycheck-display-errors-function'." + (when flycheck-display-errors-function + (funcall flycheck-display-errors-function errors))) + +(defvar-local flycheck-display-error-at-point-timer nil + "Timer to automatically show the error at point in minibuffer.") + +(defun flycheck-cancel-error-display-error-at-point-timer () + "Cancel the error display timer for the current buffer." + (when flycheck-display-error-at-point-timer + (cancel-timer flycheck-display-error-at-point-timer) + (setq flycheck-display-error-at-point-timer nil))) + +(defun flycheck-display-error-at-point () + "Display the all error messages at point in minibuffer." + (flycheck-cancel-error-display-error-at-point-timer) + (when flycheck-mode + (-when-let (errors (flycheck-overlay-errors-at (point))) + (flycheck-display-errors errors)))) + +(defun flycheck-display-error-at-point-soon () + "Display the first error message at point in minibuffer delayed." + (flycheck-cancel-error-display-error-at-point-timer) + (when (flycheck-overlays-at (point)) + (setq flycheck-display-error-at-point-timer + (run-at-time flycheck-display-errors-delay nil 'flycheck-display-error-at-point)))) + + +;;; Error display functions +(defconst flycheck-error-message-buffer "*Flycheck error messages*" + "The name of the buffer to show long error messages in.") + +(defun flycheck-error-message-buffer () + "Get the buffer object to show long error messages in. + +Get the buffer named by variable `flycheck-error-message-buffer', +or nil if the buffer does not exist." + (get-buffer flycheck-error-message-buffer)) + +(defun flycheck-may-use-echo-area-p () + "Determine whether the echo area may be used. + +The echo area may be used if the cursor is not in the echo area, +and if the echo area is not occupied by minibuffer input." + (not (or cursor-in-echo-area (active-minibuffer-window)))) + +(defun flycheck-display-error-messages (errors) + "Display the messages of ERRORS. + +Concatenate all non-nil messages of ERRORS separated by empty +lines, and display them with `display-message-or-buffer', which +shows the messages either in the echo area or in a separate +buffer, depending on the number of lines. See Info +node `(elisp)Displaying Messages' for more information. + +In the latter case, show messages in +`flycheck-error-message-buffer'." + (let ((messages (delq nil (mapcar #'flycheck-error-message errors)))) + (when (and errors (flycheck-may-use-echo-area-p)) + (display-message-or-buffer (string-join messages "\n\n") + flycheck-error-message-buffer)))) + +(defun flycheck-hide-error-buffer () + "Hide the Flycheck error buffer if necessary. + +Hide the error buffer if there is no error under point." + (-when-let* ((buffer (flycheck-error-message-buffer)) + (window (get-buffer-window buffer))) + (unless (flycheck-overlays-at (point)) + (quit-window nil window)))) + + +;;; Working with error messages +(defun flycheck-copy-messages-as-kill (pos) + "Copy each error message under POS into kill ring. + +Each error message under point is copied into the kill ring." + (interactive "d") + (let ((messages (delq nil (mapcar #'flycheck-error-message + (flycheck-overlay-errors-at pos))))) + (when messages + (mapc #'kill-new (reverse messages)) + (message (string-join messages "\n"))))) + +(defun flycheck-google-messages (pos &optional quote-flag) + "Google each error message at POS. + +Issue a separate Google query for each error message at POS. +Signal an error if there are more messages at POS than +`flycheck-google-max-messages'. + +Enclose the Google query in quotation marks, if +`google-wrap-in-quotes' is t. With QUOTE-FLAG, invert the effect +of `google-wrap-in-quotes'. + +This function requires the Google This library from URL +`https://github.com/Bruce-Connor/emacs-google-this'." + (interactive "d\nP") + (if (fboundp 'google-string) + (let ((messages (delq nil (mapcar #'flycheck-error-message + (flycheck-overlay-errors-at pos))))) + (when (and flycheck-google-max-messages + (> (length messages) flycheck-google-max-messages)) + (user-error "More than %s messages at point" + flycheck-google-max-messages)) + (dolist (msg messages) + (google-string quote-flag msg 'no-confirm))) + (user-error "Please install Google This from \ +https://github.com/Bruce-Connor/emacs-google-this"))) + + +;;; Checker process management +(defvar-local flycheck-current-process nil + "The current syntax checking process.") +(put 'flycheck-current-process 'permanent-local t) + +(defun flycheck-running-p () + "Determine whether a syntax check is running." + (when (and flycheck-current-process + (memq (process-status flycheck-current-process) '(exit signal))) + (flycheck-delete-process flycheck-current-process) + (setq flycheck-current-process nil)) + (when flycheck-current-process t)) + +(defun flycheck-delete-process (process) + "Delete PROCESS and clear it's resources." + (mapc #'flycheck-safe-delete (process-get process 'flycheck-temporaries)) + (delete-process process)) + +(defun flycheck-receive-checker-output (process output) + "Receive a syntax checking PROCESS OUTPUT." + (push output (process-get process 'flycheck-pending-output))) + +(defun flycheck-get-output (process) + "Get the complete output of PROCESS." + (with-demoted-errors "Error while retrieving process output: %S" + (let ((pending-output (process-get process 'flycheck-pending-output))) + (apply #'concat (nreverse pending-output))))) + +(defun flycheck-finish-syntax-check (checker exit-status files output) + "Finish a syntax check from CHECKER with EXIT-STATUS. + +FILES is a list of files given as input to the checker. OUTPUT +is the output of the syntax checker. + +Parse the OUTPUT and report an appropriate error status." + (let (errors) + (condition-case err + (setq errors (flycheck-parse-output output checker (current-buffer))) + (error + (message "Failed to parse errors from checker %S in output: %s\n\ +Error: %s" checker output (error-message-string err)) + (flycheck-report-error) + (setq errors :errored))) + (unless (eq errors :errored) + (when (and (/= exit-status 0) (not errors)) + ;; Warn about a suspicious result from the syntax checker. We do right + ;; after parsing the errors, before filtering, because a syntax checker + ;; might report errors from other files (e.g. includes) even if there + ;; are no errors in the file being checked. + (message "Checker %S returned non-zero exit code %s, but no errors from \ +output: %s\nChecker definition probably flawed." + checker exit-status output) + (flycheck-report-status 'suspicious)) + (setq errors (flycheck-relevant-errors + (flycheck-filter-errors + (mapcar (lambda (e) (flycheck-fix-error-filename e files)) + errors) checker))) + (setq flycheck-current-errors + (flycheck-sort-errors (append errors flycheck-current-errors nil))) + ;; Process all new errors + (mapc (apply-partially #'run-hook-with-args-until-success + 'flycheck-process-error-functions) errors) + (flycheck-report-status 'finished) + (let ((next-checker (flycheck-get-next-checker-for-buffer checker))) + (if next-checker + (flycheck-start-checker next-checker) + (flycheck-delete-marked-overlays) + (flycheck-error-list-refresh) + (run-hooks 'flycheck-after-syntax-check-hook) + (when (eq (current-buffer) (window-buffer)) + (flycheck-display-error-at-point)) + ;; Immediately try to run any pending deferred syntax check, which + ;; were triggered by intermediate automatic check event, to make sure + ;; that we quickly refine outdated error information + (flycheck-perform-deferred-syntax-check)))))) + +(defun flycheck-handle-signal (process _event) + "Handle a signal from the syntax checking PROCESS. + +_EVENT is ignored." + (when (memq (process-status process) '(signal exit)) + (let ((checker (process-get process 'flycheck-checker)) + (files (process-get process 'flycheck-temporaries)) + (exit-status (process-exit-status process)) + (output (flycheck-get-output process)) + (buffer (process-get process 'flycheck-buffer))) + (flycheck-delete-process process) + (when (buffer-live-p buffer) + (with-current-buffer buffer + (setq flycheck-current-process nil) + (condition-case err + (pcase (process-status process) + (`signal + ;; The process was killed, so let's just delete all overlays, + ;; and report a bad state + (flycheck-delete-marked-overlays) + (flycheck-report-status 'interrupted)) + (`exit + (when flycheck-mode + (flycheck-finish-syntax-check checker exit-status + files output)))) + (error + (flycheck-report-error) + (signal (car err) (cdr err))))))))) + +(defun flycheck-start-checker (checker) + "Start a syntax CHECKER." + (condition-case err + (let* ((program (flycheck-checker-executable checker)) + (args (flycheck-checker-substituted-arguments checker)) + ;; Use pipes to receive output from the syntax checker. They are + ;; more efficient and more robust than PTYs, which Emacs uses by + ;; default, and since we don't need any job control features, we + ;; can easily use pipes. + (process-connection-type nil) + ;; We pass do not associate the process with any buffer, by passing + ;; nil for the BUFFER argument of `start-process'. Instead, we + ;; just remember the buffer being checked in a process property + ;; (see below). This neatly avoids all side-effects implied by + ;; attached a process to a buffer, which may cause conflicts with + ;; other packages. + ;; + ;; See https://github.com/flycheck/flycheck/issues/298 for an + ;; example for such a conflict. + (process (apply 'start-process "flycheck" nil program args))) + (setq flycheck-current-process process) + (set-process-filter process 'flycheck-receive-checker-output) + (set-process-sentinel process 'flycheck-handle-signal) + (set-process-query-on-exit-flag process nil) + (flycheck-report-status 'running) + (process-put process 'flycheck-temporaries flycheck-temporaries) + ;; Now that temporary files and directories are attached to the process, + ;; we can reset the variables used to collect them + (setq flycheck-temporaries nil) + ;; Remember the syntax checker and the buffer. + (process-put process 'flycheck-checker checker) + (process-put process 'flycheck-buffer (current-buffer))) + (error + (flycheck-report-error) + (flycheck-safe-delete-temporaries) + (when flycheck-current-process + ;; Clear the process if it's already there + (flycheck-delete-process flycheck-current-process) + (setq flycheck-current-process nil)) + (signal (car err) (cdr err))))) + +(defun flycheck-stop-checker () + "Stop any syntax checker for the current buffer." + (when (flycheck-running-p) + ;; Killing the current process will force the sentinel, which does the + ;; cleanup + (kill-process flycheck-current-process))) + + +;;; Syntax checker executable +(defun flycheck-set-checker-executable (checker &optional executable) + "Set the EXECUTABLE of CHECKER. + +CHECKER is a syntax checker symbol. EXECUTABLE is a string with +the name of a executable or the path to an executable file, which +is to be used as executable for CHECKER. If omitted or nil, +reset the executable of CHECKER. + +Interactively, prompt for a syntax checker and an executable +file, and set the executable of the selected syntax checker. +With prefix arg, prompt for a syntax checker only, and reset the +executable of the select checker to the default. + +Set the executable variable of CHECKER, that is, +`flycheck-CHECKER-executable' to EXECUTABLE. Signal +`user-error', if EXECUTABLE does not denote a command or an +executable file. + +This command is intended for interactive use only. In Lisp, just +`let'-bind the corresponding variable, or set it directly. Use +`flycheck-checker-executable-variable' to obtain the executable +variable symbol for a syntax checker." + (interactive + (let* ((checker (read-flycheck-checker "Syntax checker: ")) + (default-executable (flycheck-checker-default-executable checker)) + (executable (if current-prefix-arg + nil + (read-file-name "Executable: " nil default-executable + nil nil #'executable-find)))) + (list checker executable))) + (when (and executable (not (executable-find executable))) + (user-error "%s is no executable" executable)) + (let ((variable (flycheck-checker-executable-variable checker))) + (set variable executable))) +(put 'flycheck-set-checker-executable 'interactive-only + "Set the executable variable directly instead") + + +;;; Built-in checkers +(flycheck-def-option-var flycheck-gnat-include-path nil ada-gnat + "A list of include directories for GNAT. + +The value of this variable is a list of strings, where each +string is a directory to add to the include path of gcc. +Relative paths are relative to the file being checked." + :type '(repeat (directory :tag "Include directory")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gnat-language-standard "2012" ada-gnat + "The language standard to use in GNAT. + +The value of this variable is either a string denoting a language +standard, or nil, to use the default standard. When non-nil, pass +the language standard via the `-std' option." + :type '(choice (const :tag "Default standard" nil) + (string :tag "Language standard")) + :safe #'stringp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gnat-warnings + '("wa") ada-gnat + "A list of additional Ada warnings to enable in GNAT. + +The value of this variable is a list of strings, where each +string is the name of a warning category to enable. By default, +most optional warnings are recommended, as in `-gnata'. + +Refer to Info Node `(gnat_ugn_unw)Warning Message Control' for +more information about GNAT warnings." + :type '(repeat :tag "Warnings" (string :tag "Warning name")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.20")) + +(flycheck-define-checker ada-gnat + "An Ada syntax checker using GNAT. + +Uses the GNAT compiler from GCC. See URL +`https://gcc.gnu.org/onlinedocs/gnat_ugn_unw/'." + :command ("gnatmake" + "-c" ; Just compile, don't bind + "-f" ; Force re-compilation + "-u" ; Compile the main file only + "-gnatf" ; Full error information + "-gnatef" ; Full source file name + "-D" temporary-directory + (option-list "-gnat" flycheck-gnat-warnings concat) + (option-list "-I" flycheck-gnat-include-path concat) + (option "-gnat" flycheck-gnat-language-standard concat) + source) + :error-patterns + ((error line-start + (message "In file included from") " " (file-name) ":" line ":" + column ":" + line-end) + (info line-start (file-name) ":" line ":" column + ": note: " (message) line-end) + (warning line-start (file-name) ":" line ":" column + ": warning: " (message) line-end) + (error line-start (file-name) ":" line ":" column ;no specific error prefix in Ada + ": " (message) line-end)) + :modes (ada-mode)) + +(flycheck-define-checker asciidoc + "A AsciiDoc syntax checker using the AsciiDoc compiler. + +See URL `http://www.methods.co.nz/asciidoc'." + :command ("asciidoc" source) + :error-patterns + ((error line-start "asciidoc: ERROR: " (file-name) + ": Line " line ": " (message) line-end) + (warning line-start "asciidoc: " (or "WARNING" "DEPRECATED") ": " (file-name) + ": Line " line ": " (message) line-end)) + :modes adoc-mode) + +(flycheck-def-option-var flycheck-clang-blocks nil c/c++-clang + "Enable blocks in Clang. + +When non-nil, enable blocks in Clang with `-fblocks'. See URL +`http://clang.llvm.org/docs/BlockLanguageSpec.html' for more +information about blocks." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-clang-definitions nil c/c++-clang + "Additional preprocessor definitions for Clang. + +The value of this variable is a list of strings, where each +string is an additional definition to pass to Clang, via the `-D' +option." + :type '(repeat (string :tag "Definition")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.15")) + +(flycheck-def-option-var flycheck-clang-include-path nil c/c++-clang + "A list of include directories for Clang. + +The value of this variable is a list of strings, where each +string is a directory to add to the include path of Clang. +Relative paths are relative to the file being checked." + :type '(repeat (directory :tag "Include directory")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.14")) + +(flycheck-def-option-var flycheck-clang-includes nil c/c++-clang + "A list of additional include files for Clang. + +The value of this variable is a list of strings, where each +string is a file to include before syntax checking. Relative +paths are relative to the file being checked." + :type '(repeat (file :tag "Include file")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.15")) + +(flycheck-def-option-var flycheck-clang-language-standard nil c/c++-clang + "The language standard to use in Clang. + +The value of this variable is either a string denoting a language +standard, or nil, to use the default standard. When non-nil, +pass the language standard via the `-std' option." + :type '(choice (const :tag "Default standard" nil) + (string :tag "Language standard")) + :safe #'stringp + :package-version '(flycheck . "0.15")) + +(flycheck-def-option-var flycheck-clang-ms-extensions nil c/c++-clang + "Whether to enable Microsoft extensions to C/C++ in Clang. + +When non-nil, enable Microsoft extensions to C/C++ via +`-fms-extensions'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.16")) + +(flycheck-def-option-var flycheck-clang-no-exceptions nil c/c++-clang + "Whether to disable exceptions in Clang. + +When non-nil, disable exceptions for syntax checks, via +`-fno-exceptions'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-clang-no-rtti nil c/c++-clang + "Whether to disable RTTI in Clang. + +When non-nil, disable RTTI for syntax checks, via `-fno-rtti'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.15")) + +(flycheck-def-option-var flycheck-clang-standard-library nil c/c++-clang + "The standard library to use for Clang. + +The value of this variable is the name of a standard library as +string, or nil to use the default standard library. + +Refer to the Clang manual at URL +`http://clang.llvm.org/docs/UsersManual.html' for more +information about the standard library." + :type '(choice (const "libc++") + (const :tag "GNU libstdc++" "libstdc++") + (string :tag "Library name")) + :safe #'stringp + :package-version '(flycheck . "0.15")) + +(flycheck-def-option-var flycheck-clang-warnings '("all" "extra") c/c++-clang + "A list of additional warnings to enable in Clang. + +The value of this variable is a list of strings, where each string +is the name of a warning category to enable. By default, all +recommended warnings and some extra warnings are enabled (as by +`-Wall' and `-Wextra' respectively). + +Refer to the Clang manual at URL +`http://clang.llvm.org/docs/UsersManual.html' for more +information about warnings." + :type '(choice (const :tag "No additional warnings" nil) + (repeat :tag "Additional warnings" + (string :tag "Warning name"))) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.14")) + +(defun flycheck-c/c++-quoted-include-directory () + "Get the directory for quoted includes. + +C/C++ compiles typicall look up includes with quotation marks in +the directory of the file being compiled. However, since +Flycheck uses temporary copies for syntax checking, it needs to +explicitly determine the directory for quoted includes. + +This function determines the directory by looking at +`buffer-file-name', or if that is nil, at `default-directory'." + (-if-let (fn (buffer-file-name)) + (file-name-directory fn) + ;; If the buffer has no file name, fall back to its default directory + default-directory)) + +(flycheck-define-checker c/c++-clang + "A C/C++ syntax checker using Clang. + +See URL `http://clang.llvm.org/'." + :command ("clang" + "-fsyntax-only" + "-fno-color-diagnostics" ; Do not include color codes in output + "-fno-caret-diagnostics" ; Do not visually indicate the source + ; location + "-fno-diagnostics-show-option" ; Do not show the corresponding + ; warning group + "-iquote" (eval (flycheck-c/c++-quoted-include-directory)) + (option "-std=" flycheck-clang-language-standard concat) + (option "-stdlib=" flycheck-clang-standard-library concat) + (option-flag "-fms-extensions" flycheck-clang-ms-extensions) + (option-flag "-fno-exceptions" flycheck-clang-no-exceptions) + (option-flag "-fno-rtti" flycheck-clang-no-rtti) + (option-flag "-fblocks" flycheck-clang-blocks) + (option-list "-include" flycheck-clang-includes) + (option-list "-W" flycheck-clang-warnings concat) + (option-list "-D" flycheck-clang-definitions concat) + (option-list "-I" flycheck-clang-include-path) + "-x" (eval + (pcase major-mode + (`c++-mode "c++") + (`c-mode "c"))) + source) + :error-patterns + ((error line-start + (message "In file included from") " " (file-name) ":" line ":" + line-end) + (info line-start (file-name) ":" line ":" column + ": note: " (message) line-end) + (warning line-start (file-name) ":" line ":" column + ": warning: " (message) line-end) + (error line-start (file-name) ":" line ":" column + ": " (or "fatal error" "error") ": " (message) line-end)) + :error-filter + (lambda (errors) + (flycheck-fold-include-errors + (flycheck-sanitize-errors errors) "In file included from")) + :modes (c-mode c++-mode) + :next-checkers ((warnings-only . c/c++-cppcheck))) + +(flycheck-def-option-var flycheck-gcc-definitions nil c/c++-gcc + "Additional preprocessor definitions for GCC. + +The value of this variable is a list of strings, where each +string is an additional definition to pass to GCC, via the `-D' +option." + :type '(repeat (string :tag "Definition")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gcc-include-path nil c/c++-gcc + "A list of include directories for GCC. + +The value of this variable is a list of strings, where each +string is a directory to add to the include path of gcc. +Relative paths are relative to the file being checked." + :type '(repeat (directory :tag "Include directory")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gcc-includes nil c/c++-gcc + "A list of additional include files for GCC. + +The value of this variable is a list of strings, where each +string is a file to include before syntax checking. Relative +paths are relative to the file being checked." + :type '(repeat (file :tag "Include file")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gcc-language-standard nil c/c++-gcc + "The language standard to use in GCC. + +The value of this variable is either a string denoting a language +standard, or nil, to use the default standard. When non-nil, +pass the language standard via the `-std' option." + :type '(choice (const :tag "Default standard" nil) + (string :tag "Language standard")) + :safe #'stringp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gcc-no-exceptions nil c/c++-gcc + "Whether to disable exceptions in GCC. + +When non-nil, disable exceptions for syntax checks, via +`-fno-exceptions'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gcc-no-rtti nil c/c++-gcc + "Whether to disable RTTI in GCC. + +When non-nil, disable RTTI for syntax checks, via `-fno-rtti'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gcc-warnings '("all" "extra") c/c++-gcc + "A list of additional warnings to enable in GCC. + +The value of this variable is a list of strings, where each string +is the name of a warning category to enable. By default, all +recommended warnings and some extra warnings are enabled (as by +`-Wall' and `-Wextra' respectively). + +Refer to the gcc manual at URL +`https://gcc.gnu.org/onlinedocs/gcc/' for more information about +warnings." + :type '(choice (const :tag "No additional warnings" nil) + (repeat :tag "Additional warnings" + (string :tag "Warning name"))) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.20")) + +(flycheck-define-checker c/c++-gcc + "A C/C++ syntax checker using GCC. + +Requires GCC 4.8 or newer. See URL `https://gcc.gnu.org/'." + :command ("gcc" + "-fsyntax-only" + "-fshow-column" + "-fno-diagnostics-show-caret" ; Do not visually indicate the source location + "-fno-diagnostics-show-option" ; Do not show the corresponding + ; warning group + "-iquote" (eval (flycheck-c/c++-quoted-include-directory)) + (option "-std=" flycheck-gcc-language-standard concat) + (option-flag "-fno-exceptions" flycheck-gcc-no-exceptions) + (option-flag "-fno-rtti" flycheck-gcc-no-rtti) + (option-list "-include" flycheck-gcc-includes) + (option-list "-W" flycheck-gcc-warnings concat) + (option-list "-D" flycheck-gcc-definitions concat) + (option-list "-I" flycheck-gcc-include-path) + "-x" (eval + (pcase major-mode + (`c++-mode "c++") + (`c-mode "c"))) + source) + :error-patterns + ((error line-start + (message "In file included from") " " (file-name) ":" line ":" + column ":" + line-end) + (info line-start (file-name) ":" line ":" column + ": note: " (message) line-end) + (warning line-start (file-name) ":" line ":" column + ": warning: " (message) line-end) + (error line-start (file-name) ":" line ":" column + ": " (or "fatal error" "error") ": " (message) line-end)) + :error-filter + (lambda (errors) + (flycheck-fold-include-errors + (flycheck-sanitize-errors errors) "In file included from")) + :modes (c-mode c++-mode) + :next-checkers ((warnings-only . c/c++-cppcheck))) + +(flycheck-def-option-var flycheck-cppcheck-checks '("style") c/c++-cppcheck + "Enabled checks for Cppcheck. + +The value of this variable is a list of strings, where each +string is the name of an additional check to enable. By default, +all coding style checks are enabled. + +See section \"Enable message\" in the Cppcheck manual at URL +`http://cppcheck.sourceforge.net/manual.pdf', and the +documentation of the `--enable' option for more information, +including a list of supported checks." + :type '(repeat :tag "Additional checks" + (string :tag "Check name")) + ;; Quote this lambda, to allow `describe-variable' to display the lambda + ;; properly + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.14")) + +(flycheck-def-option-var flycheck-cppcheck-inconclusive nil c/c++-cppcheck + "Whether to enable Cppcheck inconclusive checks. + +When non-nil, enable Cppcheck inconclusive checks. This allows Cppcheck to +report warnings it's not certain of, but it may result in false positives. + +This will have no effect when using Cppcheck 1.53 and older." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.19")) + +(flycheck-define-checker c/c++-cppcheck + "A C/C++ checker using cppcheck. + +See URL `http://cppcheck.sourceforge.net/'." + :command ("cppcheck" "--quiet" "--xml-version=2" "--inline-suppr" + (option "--enable=" flycheck-cppcheck-checks concat + flycheck-option-comma-separated-list) + (option-flag "--inconclusive" flycheck-cppcheck-inconclusive) + source) + :error-parser flycheck-parse-cppcheck + :modes (c-mode c++-mode)) + +(flycheck-define-checker cfengine + "A CFEngine syntax checker using cf-promises. + +See URL `http://cfengine.com/'." + :command ("cf-promises" "-Wall" "-f" + ;; We must stay in the same directory to resolve @include + source-inplace) + :error-patterns + ((warning line-start (file-name) ":" line ":" column + ": warning: " (message) line-end) + (error line-start (file-name) ":" line ":" column + ": error: " (message) line-end)) + :modes (cfengine-mode cfengine3-mode)) + +(flycheck-define-checker chef-foodcritic + "A Chef cookbooks syntax checker using Foodcritic. + +See URL `http://acrmp.github.io/foodcritic/'." + :command ("foodcritic" source) + :error-patterns + ((error line-start (message) ": " (file-name) ":" line line-end)) + :modes (enh-ruby-mode ruby-mode) + :predicate + (lambda () + (let ((parent-dir (file-name-directory + (directory-file-name default-directory)))) + (or + ;; Chef CookBook + ;; http://docs.opscode.com/chef/knife.html#id38 + (locate-dominating-file parent-dir "recipes") + ;; Knife Solo + ;; http://matschaffer.github.io/knife-solo/#label-Init+command + (locate-dominating-file parent-dir "cookbooks"))))) + +(flycheck-define-checker coffee + "A CoffeeScript syntax checker using coffee. + +See URL `http://coffeescript.org/'." + ;; --print suppresses generation of compiled .js files + :command ("coffee" "--compile" "--print" source) + :error-patterns + ((error line-start (file-name) ":" line ":" column + ": error: " (message) line-end)) + :modes coffee-mode + :next-checkers ((warnings-only . coffee-coffeelint))) + +(flycheck-def-config-file-var flycheck-coffeelintrc coffee-coffeelint + ".coffeelint.json" + :safe #'stringp) + +(flycheck-define-checker coffee-coffeelint + "A CoffeeScript style checker using coffeelint. + +This syntax checker requires coffeelint 1.0 or newer. + +See URL `http://www.coffeelint.org/'." + :command + ("coffeelint" + (config-file "--file" flycheck-coffeelintrc) + "--checkstyle" source) + :error-parser flycheck-parse-checkstyle + :modes coffee-mode) + +(flycheck-define-checker css-csslint + "A CSS syntax and style checker using csslint. + +See URL `https://github.com/CSSLint/csslint'." + :command ("csslint" "--format=checkstyle-xml" source) + :error-parser flycheck-parse-checkstyle + :modes css-mode) + +(defconst flycheck-d-module-re + (rx "module" (one-or-more (syntax whitespace)) + (group (one-or-more (not (syntax whitespace)))) + (zero-or-more (syntax whitespace)) + ";") + "Regular expression to match a D module declaration.") + +(defun flycheck-d-base-directory () + "Get the relative base directory path for this module." + (let* ((file-name (buffer-file-name)) + (module-file (if (string= (file-name-nondirectory file-name) + "package.d") + (directory-file-name (file-name-directory file-name)) + file-name))) + (flycheck-module-root-directory + (flycheck-find-in-buffer flycheck-d-module-re) + module-file))) + +(flycheck-def-option-var flycheck-dmd-include-path nil d-dmd + "A list of include directories for dmd. + +The value of this variable is a list of strings, where each +string is a directory to add to the include path of dmd. +Relative paths are relative to the file being checked." + :type '(repeat (directory :tag "Include directory")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.18")) + +(flycheck-define-checker d-dmd + "A D syntax checker using the DMD compiler. + +See URL `http://dlang.org/'." + :command ("dmd" "-debug" "-o-" + "-wi" ; Compilation will continue even if there are warnings + (eval (concat "-I" (flycheck-d-base-directory))) + (option-list "-I" flycheck-dmd-include-path concat) + source) + :error-patterns + ((error line-start (file-name) "(" line "): Error: " (message) line-end) + (warning line-start (file-name) "(" line "): " + (or "Warning" "Deprecation") ": " (message) line-end)) + :modes d-mode) + +(flycheck-define-checker elixir + "An Elixir syntax checker using the Elixir interpreter. + +See URL `http://elixir-lang.org/'." + :command ("elixirc" + "-o" temporary-directory ; Move compiler output out of the way + "--ignore-module-conflict" ; Prevent tedious module redefinition + ; warning. + source) + :error-patterns + ;; Elixir compiler errors + ((error line-start "** (" (zero-or-more not-newline) ") " + (file-name) ":" line ": " (message) line-end) + ;; Warnings from Elixir >= 0.12.4 + (warning line-start (file-name) ":" line ": warning:" (message) line-end) + ;; Warnings from older Elixir versions + (warning line-start (file-name) ":" line ": " (message) line-end)) + :modes elixir-mode) + +(defconst flycheck-this-emacs-executable + (concat invocation-directory invocation-name) + "The path to the currently running Emacs executable.") + +(defconst flycheck-emacs-args '("-Q" "--batch") + "Common arguments to Emacs invocations.") + +(defmacro flycheck-prepare-emacs-lisp-form (&rest body) + "Prepare BODY for use as check form in a subprocess." + (declare (indent 0)) + `(flycheck-sexp-to-string + '(progn + (defvar jka-compr-inhibit) + (unwind-protect + ;; Flycheck inhibits compression of temporary files, thus we + ;; must not attempt to decompress. + (let ((jka-compr-inhibit t)) + ;; Strip option-argument separator from arguments, if present + (when (equal (car command-line-args-left) "--") + (setq command-line-args-left (cdr command-line-args-left))) + ,@body) + ;; Prevent Emacs from processing the arguments on its own, see + ;; https://github.com/flycheck/flycheck/issues/319 + (setq command-line-args-left nil))))) + +(defconst flycheck-emacs-lisp-check-form + (flycheck-prepare-emacs-lisp-form + ;; Keep track of the generated bytecode files, to delete them after byte + ;; compilation. + (defvar flycheck-byte-compiled-files nil) + (let ((byte-compile-dest-file-function + (lambda (source) + (let ((temp-file (make-temp-file (file-name-nondirectory source)))) + (push temp-file flycheck-byte-compiled-files) + temp-file)))) + (unwind-protect + (byte-compile-file (car command-line-args-left)) + (mapc (lambda (f) (ignore-errors (delete-file f))) + flycheck-byte-compiled-files))))) + +(flycheck-def-option-var flycheck-emacs-lisp-load-path nil emacs-lisp + "Load path to use in the Emacs Lisp syntax checker. + +When set to a list of strings, add each directory in this list to +the `load-path' before invoking the byte compiler. Relative +paths in this list are expanded against the `default-directory' +of the buffer to check. When nil, only use the built-in +`load-path' of Emacs. + +The directory of the file being checked is always part of the +`load-path' while checking, regardless of the value of this +variable. + +Set this variable to `load-path' to use the `load-path' of your +Emacs session for syntax checking. + +Note that changing this variable can lead to wrong results of the +syntax check, e.g. if an unexpected version of a required library +is used." + :type '(repeat directory) + :risky t + :package-version '(flycheck . "0.14")) + +(flycheck-def-option-var flycheck-emacs-lisp-initialize-packages + 'auto emacs-lisp + "Whether to initialize packages in the Emacs Lisp syntax checker. + +To initialize packages, call `package-initialize' before +byte-compiling the file to check. + +When nil, never initialize packages. When `auto', initialize +packages only when checking files from `user-emacs-directory'. +For any other non-nil value, always initialize packages." + :type '(choice (const :tag "Do not initialize packages" nil) + (const :tag "Initialize packages for configuration only" auto) + (const :tag "Always initialize packages" t)) + :risky t + :package-version '(flycheck . "0.14")) + +(defconst flycheck-emacs-lisp-package-initialize-form + (flycheck-sexp-to-string + '(with-demoted-errors "Error during package initialization: %S" + (package-initialize))) + "Form used to initialize packages.") + +(defun flycheck-option-emacs-lisp-package-initialize (value) + "Option VALUE filter for `flycheck-emacs-lisp-initialize-packages'." + (let ((shall-initialize + (if (eq value 'auto) + (flycheck-in-user-emacs-directory-p (buffer-file-name)) + value))) + (when shall-initialize + ;; If packages shall be initialized, return the corresponding form, + ;; otherwise make Flycheck ignore the option by returning nil. + flycheck-emacs-lisp-package-initialize-form))) + +(flycheck-def-option-var flycheck-emacs-lisp-package-user-dir nil emacs-lisp + "Package directory for the Emacs Lisp syntax checker. + +When set to a string, set `package-user-dir' to the value of this +variable before initializing packages. + +This variable has no effect, if +`flycheck-emacs-lisp-initialize-packages' is nil." + :type '(choice (const :tag "Default package directory" nil) + (directory :tag "Custom package directory")) + :risky t + :package-version '(flycheck . "0.14")) + +(defun flycheck-option-emacs-lisp-package-user-dir (value) + "Option VALUE filter for `flycheck-emacs-lisp-package-user-dir'." + (unless value + ;; Inherit the package directory from our Emacs session + (setq value (and (boundp 'package-user-dir) package-user-dir))) + (when value + (flycheck-sexp-to-string `(setq package-user-dir ,value)))) + +(flycheck-define-checker emacs-lisp + "An Emacs Lisp syntax checker using the Emacs Lisp Byte compiler. + +See Info Node `(elisp)Byte Compilation'." + :command ("emacs" (eval flycheck-emacs-args) + (option-list "--directory" flycheck-emacs-lisp-load-path nil + ;; Expand relative paths against the directory of the + ;; buffer to check + expand-file-name) + (option "--eval" flycheck-emacs-lisp-package-user-dir nil + flycheck-option-emacs-lisp-package-user-dir) + (option "--eval" flycheck-emacs-lisp-initialize-packages nil + flycheck-option-emacs-lisp-package-initialize) + "--eval" (eval flycheck-emacs-lisp-check-form) + "--" + source-inplace) + :error-patterns + ((error line-start (file-name) ":" line ":" column ":Error:" + (message (zero-or-more not-newline) + (zero-or-more "\n " (zero-or-more not-newline))) + line-end) + (warning line-start (file-name) ":" line ":" column ":Warning:" + (message (zero-or-more not-newline) + (zero-or-more "\n " (zero-or-more not-newline))) + line-end)) + :error-filter + (lambda (errors) + (flycheck-collapse-error-message-whitespace + (flycheck-sanitize-errors errors))) + :modes (emacs-lisp-mode lisp-interaction-mode) + :predicate + (lambda () + (and + ;; Ensure that we only check buffers with a backing file. For buffers + ;; without a backing file we cannot guarantee that file names in error + ;; messages are properly resolved, because `byte-compile-file' emits file + ;; names *relative to the directory of the checked file* instead of the + ;; working directory. Hence our backwards-substitution will fail, because + ;; the checker process has a different base directory to resolve relative + ;; file names than the Flycheck code working on the buffer to check. + (buffer-file-name) + ;; Do not check buffers which should not be byte-compiled. The checker + ;; process will refuse to compile these, which would confuse Flycheck + (not (bound-and-true-p no-byte-compile)) + ;; Do not check buffers used for autoloads generation during package + ;; installation. These buffers are too short-lived for being checked, and + ;; doing so causes spurious errors. See + ;; https://github.com/flycheck/flycheck/issues/45 and + ;; https://github.com/bbatsov/prelude/issues/248. We must also not check + ;; compilation buffers, but as these are ephemeral, Flycheck won't check + ;; them anyway. + (not (flycheck-autoloads-file-p)))) + :next-checkers (emacs-lisp-checkdoc)) + +(defconst flycheck-emacs-lisp-checkdoc-form + (flycheck-prepare-emacs-lisp-form + (require 'checkdoc) + + (let ((source (car command-line-args-left)) + ;; Remember the default directory of the process + (process-default-directory default-directory)) + (with-temp-buffer + (insert-file-contents source 'visit) + (setq buffer-file-name source) + ;; And change back to the process default directory to make file-name + ;; back-substutition work + (setq default-directory process-default-directory) + (with-demoted-errors "Error in checkdoc: %S" + (checkdoc-current-buffer t) + (with-current-buffer checkdoc-diagnostic-buffer + (princ (buffer-substring-no-properties (point-min) (point-max))) + (kill-buffer))))))) + +(flycheck-define-checker emacs-lisp-checkdoc + "An Emacs Lisp style checker using CheckDoc. + +The checker runs `checkdoc-current-buffer'." + :command ("emacs" (eval flycheck-emacs-args) + "--eval" (eval flycheck-emacs-lisp-checkdoc-form) + "--" source) + :error-patterns + ((warning line-start (file-name) ":" line ": " (message) line-end)) + :modes (emacs-lisp-mode) + :predicate + (lambda () + ;; Do not check Autoloads, Cask/Carton and dir-locals files. These files + ;; really don't need to follow Checkdoc conventions. + (not (or (flycheck-autoloads-file-p) + (and (buffer-file-name) + (member (file-name-nondirectory (buffer-file-name)) + '("Cask" "Carton" ".dir-locals.el"))))))) + +(progn + ;; Use the currently running Emacs by default. + (setcar (get 'emacs-lisp 'flycheck-command) flycheck-this-emacs-executable) + (setcar (get 'emacs-lisp-checkdoc 'flycheck-command) + flycheck-this-emacs-executable)) + +(flycheck-define-checker erlang + "An Erlang syntax checker using the Erlang interpreter. + +See URL `http://www.erlang.org/'." + :command ("erlc" "-o" temporary-directory "-Wall" source) + :error-patterns + ((warning line-start (file-name) ":" line ": Warning:" (message) line-end) + (error line-start (file-name) ":" line ": " (message) line-end)) + :modes erlang-mode) + +(flycheck-define-checker eruby-erubis + "A eRuby syntax checker using the `erubis' command. + +See URL `http://www.kuwata-lab.com/erubis/'." + :command ("erubis" "-z" source) + :error-patterns + ((error line-start (file-name) ":" line ": " (message) line-end)) + :predicate + (lambda () + (or (memq major-mode '(html-erb-mode rhtml-mode)) + (and (buffer-file-name) + (member (file-name-extension (buffer-file-name)) + '("erb" "rhtml")))))) + +(flycheck-def-option-var flycheck-gfortran-include-path nil fortran-gfortran + "A list of include directories for GCC Fortran. + +The value of this variable is a list of strings, where each +string is a directory to add to the include path of gcc. +Relative paths are relative to the file being checked." + :type '(repeat (directory :tag "Include directory")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gfortran-language-standard "f95" fortran-gfortran + "The language standard to use in GFortran. + +The value of this variable is either a string denoting a language +standard, or nil, to use the default standard. When non-nil, +pass the language standard via the `-std' option." + :type '(choice (const :tag "Default standard" nil) + (string :tag "Language standard")) + :safe #'stringp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-gfortran-layout nil fortran-gfortran + "The source code layout to use in GFortran. + +The value of this variable is one of the following symbols: + +nil + Let gfortran determine the layout from the extension + +`free' + Use free form layout + + +`fixed' + Use fixed form layout + +In any other case, an error is signaled.") + +(defun flycheck-option-gfortran-layout (value) + "Option VALUE filter for `flycheck-gfortran-layout'." + (pcase value + (`nil nil) + (`free "free-form") + (`fixed "fixed-form") + (_ (error "Invalid value for flycheck-gfortran-layout: %S" value)))) + +(flycheck-def-option-var flycheck-gfortran-warnings '("all" "extra") + fortran-gfortran + "A list of warnings for GCC Fortran. + +The value of this variable is a list of strings, where each string +is the name of a warning category to enable. By default, all +recommended warnings and some extra warnings are enabled (as by +`-Wall' and `-Wextra' respectively). + +Refer to the gfortran manual at URL +`https://gcc.gnu.org/onlinedocs/gfortran/' for more information +about warnings") + +(flycheck-define-checker fortran-gfortran + "An Fortran syntax checker using GCC. + +Uses GCC's Fortran compiler gfortran. See URL +`https://gcc.gnu.org/onlinedocs/gfortran/'." + :command ("gfortran" + "-fsyntax-only" + "-fshow-column" + "-fno-diagnostics-show-caret" ; Do not visually indicate the source location + "-fno-diagnostics-show-option" ; Do not show the corresponding + ; warning group + ;; Fortran has similar include processing as C/C++ + "-iquote" (eval (flycheck-c/c++-quoted-include-directory)) + (option "-std=" flycheck-gfortran-language-standard concat) + (option "-f" flycheck-gfortran-layout concat + flycheck-option-gfortran-layout) + (option-list "-W" flycheck-gfortran-warnings concat) + (option-list "-I" flycheck-gfortran-include-path concat) + source) + :error-patterns + ((error line-start (file-name) ":" line "." column ":\n" + (= 3 (zero-or-more not-newline) "\n") + (or "Error" "Fatal Error") ": " (message) line-end) + (warning line-start (file-name) ":" line "." column ":\n" + (= 3 (zero-or-more not-newline) "\n") + "Warning: " (message) line-end)) + :modes (fortran-mode f90-mode)) + +(flycheck-define-checker go-gofmt + "A Go syntax and style checker using the gofmt utility. + +See URL `http://golang.org/cmd/gofmt/'." + :command ("gofmt" source) + :error-patterns + ((error line-start (file-name) ":" line ":" column ": " (message) line-end)) + :modes go-mode + :next-checkers ((no-errors . go-golint) + ;; Fall back, if go-golint doesn't exist + (no-errors . go-vet) + ;; Fall back, if go-vet doesn't exist + (no-errors . go-build) (no-errors . go-test) + (no-errors . go-errcheck))) + +(flycheck-define-checker go-golint + "A Go style checker using Golint. + +See URL `https://github.com/golang/lint'." + :command ("golint" source) + :error-patterns + ((warning line-start (file-name) ":" line ":" column ": " (message) line-end)) + :modes go-mode + :next-checkers (go-vet + ;; Fall back, if go-vet doesn't exist + go-build go-test go-errcheck)) + +(flycheck-def-option-var flycheck-go-vet-print-functions nil go-vet + "A comma-separated list of print-like functions for `go tool vet'. + +Go vet will check these functions for format string problems and +issues, such as a mismatch between the number of formats used, +and the number of arguments given. + +Each entry is in the form Name:N where N is the zero-based +argument position of the first argument involved in the print: +either the format or the first print argument for non-formatted +prints. For example, if you have Warn and Warnf functions that +take an io.Writer as their first argument, like Fprintf, +-printfuncs=Warn:1,Warnf:1 " + :type '(repeat :tag "print-like functions" + (string :tag "function")) + :safe #'flycheck-string-list-p) + +(flycheck-define-checker go-vet + "A Go syntax checker using the `go tool vet' command. + +See URL `http://golang.org/cmd/go/' and URL +`http://godoc.org/code.google.com/p/go.tools/cmd/vet'." + :command ("go" "tool" "vet" + (option "-printfuncs=" flycheck-go-vet-print-functions concat + flycheck-option-comma-separated-list) + source) + :error-patterns + ((warning line-start (file-name) ":" line ": " (message) line-end)) + :modes go-mode + ;; We must explicitly check whether the "vet" tool is available + :predicate (lambda () + (let ((go (flycheck-checker-executable 'go-vet))) + (member "vet" (ignore-errors (process-lines go "tool"))))) + :next-checkers (go-build + go-test + ;; Fall back if `go build' or `go test' can be used + go-errcheck)) + +(flycheck-define-checker go-build + "A Go syntax and type checker using the `go build' command. + +See URL `http://golang.org/cmd/go'." + :command ("go" "build" "-o" temporary-file-name) + :error-patterns + ((error line-start (file-name) ":" line ":" + (optional column ":") " " + (message (one-or-more not-newline) + (zero-or-more "\n\t" (one-or-more not-newline))) + line-end)) + :modes go-mode + :predicate (lambda () + (and (flycheck-buffer-saved-p) + (not (string-suffix-p "_test.go" (buffer-file-name))))) + :next-checkers ((no-errors . go-errcheck))) + +(flycheck-define-checker go-test + "A Go syntax and type checker using the `go test' command. + +See URL `http://golang.org/cmd/go'." + ;; This command builds the test executable and leaves it in the current + ;; directory. Unfortunately 'go test -c' does not have the '-o' option. + :command ("go" "test" "-c") + :error-patterns + ((error line-start (file-name) ":" line ": " + (message (one-or-more not-newline) + (zero-or-more "\n\t" (one-or-more not-newline))) + line-end)) + :modes go-mode + :predicate + (lambda () (and (flycheck-buffer-saved-p) + (string-suffix-p "_test.go" (buffer-file-name)))) + :next-checkers ((no-errors . go-errcheck))) + +(flycheck-define-checker go-errcheck + "A Go checker for unchecked errors. + +See URL `https://github.com/kisielk/errcheck'." + :command ("errcheck" ".") + :error-patterns + ((warning line-start (file-name) ":" line ":" column (one-or-more "\t") (message) line-end)) + :error-filter + (lambda (errors) + (let ((errors (flycheck-sanitize-errors errors))) + (dolist (err errors) + (-when-let (message (flycheck-error-message err)) + ;; Improve the messages reported by errcheck to make them more clear. + (setf (flycheck-error-message err) + (format "Ignored `error` returned from `%s`" message))))) + errors) + :modes go-mode + :predicate flycheck-buffer-saved-p) + +(flycheck-define-checker haml + "A Haml syntax checker using the Haml compiler. + +See URL `http://haml.info'." + :command ("haml" "-c" source) + :error-patterns + ((error line-start "Syntax error on line " line ": " (message) line-end)) + :modes haml-mode) + +(flycheck-define-checker handlebars + "A Handlebars syntax checker using the Handlebars compiler. + +See URL `http://handlebarsjs.com/'." + :command ("handlebars" source) + :error-patterns + ((error line-start + "Error: Parse error on line " line ":" (optional "\r") "\n" + (zero-or-more not-newline) "\n" (zero-or-more not-newline) "\n" + (message) line-end)) + :modes (handlebars-mode handlebars-sgml-mode)) + +(defconst flycheck-haskell-module-re + (rx line-start (zero-or-more (or "\n" (any space))) + "module" (one-or-more (or "\n" (any space))) + (group (one-or-more (not (any space "\n"))))) + "Regular expression for a Haskell module name.") + +(flycheck-def-option-var flycheck-ghc-no-user-package-database nil haskell-ghc + "Whether to disable the user package database in GHC. + +When non-nil, disable the user package database in GHC, via +`-no-user-package-db'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.16")) + +(flycheck-def-option-var flycheck-ghc-package-databases nil haskell-ghc + "Additional module databases for GHC. + +The value of this variable is a list of strings, where each +string is a directory of a package database. Each package +database is given to GHC via `-package-db'." + :type '(repeat (directory :tag "Package database")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.16")) + +(flycheck-def-option-var flycheck-ghc-search-path nil haskell-ghc + "Module search path for GHC. + +The value of this variable is a list of strings, where each +string is a directory containing Haskell modules. Each directory +is added to the GHC search path via `-i'." + :type '(repeat (directory :tag "Module directory")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.16")) + +(flycheck-def-option-var flycheck-ghc-language-extensions nil haskell-ghc + "Language extensions for GHC. + +The value of this variable is a list of strings, where each +string is a Haskell language extension, as in the LANGUAGE +pragma. Each extension is enabled via `-X'." + :type '(repeat (string :tag "Language extension")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.19")) + +(flycheck-define-checker haskell-ghc + "A Haskell syntax and type checker using ghc. + +See URL `http://www.haskell.org/ghc/'." + :command ("ghc" "-Wall" "-fno-code" + (option-flag "-no-user-package-db" + flycheck-ghc-no-user-package-database) + (option-list "-package-db" flycheck-ghc-package-databases) + (option-list "-i" flycheck-ghc-search-path concat) + ;; Include the parent directory of the current module tree, to + ;; properly resolve local imports + (eval (concat + "-i" + (flycheck-module-root-directory + (flycheck-find-in-buffer flycheck-haskell-module-re)))) + (option-list "-X" flycheck-ghc-language-extensions concat) + ;; Force GHC to treat the file as Haskell file, even if it doesn't + ;; have an extension. Otherwise GHC would fail on files without an + ;; extension + "-x" "hs" source) + :error-patterns + ((warning line-start (file-name) ":" line ":" column ":" + (or " " "\n ") "Warning:" (optional "\n") + (message + (one-or-more " ") (one-or-more not-newline) + (zero-or-more "\n" + (one-or-more " ") + (one-or-more not-newline))) + line-end) + (error line-start (file-name) ":" line ":" column ":" + (or (message (one-or-more not-newline)) + (and "\n" + (message + (one-or-more " ") (one-or-more not-newline) + (zero-or-more "\n" + (one-or-more " ") + (one-or-more not-newline))))) + line-end)) + :error-filter + (lambda (errors) + (flycheck-sanitize-errors (flycheck-dedent-error-messages errors))) + :modes haskell-mode + :next-checkers ((warnings-only . haskell-hlint))) + +(flycheck-define-checker haskell-hlint + "A Haskell style checker using hlint. + +See URL `https://github.com/ndmitchell/hlint'." + :command ("hlint" source-inplace) + :error-patterns + ((warning line-start + (file-name) ":" line ":" column + ": Warning: " + (message (one-or-more not-newline) + (one-or-more "\n" (one-or-more not-newline))) + line-end) + (error line-start + (file-name) ":" line ":" column + ": Error: " + (message (one-or-more not-newline) + (one-or-more "\n" (one-or-more not-newline))) + line-end)) + :modes haskell-mode) + +(flycheck-def-config-file-var flycheck-tidyrc html-tidy ".tidyrc" + :safe #'stringp) + +(flycheck-define-checker html-tidy + "A HTML syntax and style checker using Tidy. + +See URL `https://github.com/w3c/tidy-html5'." + :command ("tidy" (config-file "-config" flycheck-tidyrc) "-e" "-q" source) + :error-patterns + ((error line-start + "line " line + " column " column + " - Error: " (message) line-end) + (warning line-start + "line " line + " column " column + " - Warning: " (message) line-end)) + :modes (html-mode nxhtml-mode web-mode)) + +(flycheck-def-config-file-var flycheck-jshintrc javascript-jshint ".jshintrc" + :safe #'stringp) + +(flycheck-define-checker javascript-jshint + "A JavaScript syntax and style checker using jshint. + +See URL `http://www.jshint.com'." + :command ("jshint" "--checkstyle-reporter" + (config-file "--config" flycheck-jshintrc) + source) + :error-parser flycheck-parse-checkstyle + :modes (js-mode js2-mode js3-mode)) + +(flycheck-def-option-var flycheck-eslint-rulesdir nil javascript-eslint + "The directory of custom rules for ESLint. + +The value of this variable is either a string containing the path +to a directory with custom rules, or nil, to not give any custom +rules to ESLint. + +Refer to the ESLint manual at URL +`https://github.com/eslint/eslint/tree/master/docs/command-line-interface#--rulesdir' +for more information about the custom directory." + :type '(choice (const :tag "No custom rules directory" nil) + (directory :tag "Custom rules directory")) + :safe #'stringp + :package-version '(flycheck . "0.16")) + +(flycheck-def-config-file-var flycheck-eslintrc javascript-eslint nil + :safe #'stringp + :package-version '(flycheck . "0.20")) + +(flycheck-define-checker javascript-eslint + "A JavaScript syntax and style checker using eslint. + +See URL `https://github.com/eslint/eslint'." + :command ("eslint" "--format=compact" + (config-file "--config" flycheck-eslintrc) + (option "--rulesdir" flycheck-eslint-rulesdir) + ;; We need to use source-inplace because eslint looks for + ;; configuration files in the directory of the file being checked. + ;; See https://github.com/flycheck/flycheck/issues/447 + source-inplace) + :error-patterns + ((warning line-start (file-name) + ": line " line ", col " column ", Warning - " (message) line-end) + (error line-start (file-name) + ": line " line ", col " column ", Error - " (message) line-end)) + :modes (js-mode js2-mode js3-mode)) + +(flycheck-def-config-file-var flycheck-gjslintrc javascript-gjslint ".gjslintrc" + :safe #'stringp) + +(flycheck-define-checker javascript-gjslint + "A JavaScript syntax and style checker using Closure Linter. + +See URL `https://developers.google.com/closure/utilities'." + :command ("gjslint" "--unix_mode" + (config-file "--flagfile" flycheck-gjslintrc) + source) + :error-patterns ((error line-start + (file-name) ":" line ":" (message) + line-end)) + :modes (js-mode js2-mode js3-mode)) + +(flycheck-define-checker json-jsonlint + "A JSON syntax and style checker using jsonlint. + +See URL `https://github.com/zaach/jsonlint'." + :command ("jsonlint" "-c" "-q" source) + :error-patterns + ((error line-start + (file-name) + ": line " line + ", col " column ", " + (message) line-end)) + :predicate + (lambda () + (or + (eq major-mode 'json-mode) + (and (buffer-file-name) + (string= (file-name-extension (buffer-file-name)) "json"))))) + +(flycheck-define-checker less + "A LESS syntax checker using lessc. + +At least version 1.4 of lessc is required. + +See URL `http://lesscss.org'." + :command ("lessc" "--lint" "--no-color" source) + :error-patterns + ((error line-start (one-or-more word) ":" + (message) + " in " + (file-name) + + " on line " line + ", column " column ":" + line-end)) + :modes less-css-mode) + +(flycheck-define-checker lua + "A Lua syntax checker using the Lua compiler. + +See URL `http://www.lua.org/'." + :command ("luac" "-p" source) + :error-patterns + ((error line-start + ;; Skip the name of the luac executable. We also skip the file name, + ;; because luac is stupid enough as to abbreviate file names in its + ;; output, which for obvious reasons breaks our file name + ;; detection. See https://github.com/flycheck/flycheck/issues/251 + (minimal-match (zero-or-more not-newline)) + ":" line ": " (message) line-end)) + :modes lua-mode) + +(flycheck-define-checker make + "A Makefile syntax checker using the POSIX compatible Make command. + +See URL `http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html'." + :command ("make" "-n" "-f" source-inplace) + :error-patterns + (;; GNU Make + ;; http://www.gnu.org/software/make/ + (error line-start (file-name) ":" line ": " (message) line-end) + ;; NetBSD Make + ;; http://netbsd.gw.com/cgi-bin/man-cgi?make++NetBSD-current + (error line-start + (zero-or-more not-newline) ; make command name + ": \"" (file-name) "\" line " line ": " (message) line-end) + ;; FreeBSD Make (unmaintained) + ;; http://www.freebsd.org/cgi/man.cgi?query=make&sektion=1 + (error line-start "\"" (file-name) "\", line " line ": " (message) line-end) + ;; OpenBSD Make (unmaintained) + ;; http://www.openbsd.org/cgi-bin/man.cgi?query=make + (error line-start (message) " (" (file-name) ":" line ")" line-end)) + :modes (makefile-mode makefile-gmake-mode makefile-bsdmake-mode)) + +(flycheck-define-checker perl + "A Perl syntax checker using the Perl interpreter. + +See URL `http://www.perl.org'." + :command ("perl" "-w" "-c" source) + :error-patterns + ((error line-start (minimal-match (message)) + " at " (file-name) " line " line + (or "." (and ", " (zero-or-more not-newline))) line-end)) + :modes (perl-mode cperl-mode) + :next-checkers (perl-perlcritic)) + +(flycheck-def-option-var flycheck-perlcritic-verbosity nil perl-perlcritic + "The message severity for Perl Critic. + +The value of this variable is a severity level as integer, for +the `--severity' option to Perl Critic." + :type '(integer :tag "Severity level") + :safe #'integerp + :package-version '(flycheck . "0.18")) + +(flycheck-define-checker perl-perlcritic + "A Perl syntax checker using Perl::Critic. + +See URL `https://metacpan.org/pod/Perl::Critic'." + :command ("perlcritic" "--no-color" "--verbose" "%f:%l:%c:%s:%m (%e)\n" + (option "--severity" flycheck-perlcritic-verbosity nil + flycheck-option-int) + source) + :error-patterns + ((info line-start + (file-name) ":" line ":" column ":" (any "1") ":" (message) + line-end) + (warning line-start + (file-name) ":" line ":" column ":" (any "234") ":" (message) + line-end) + (error line-start + (file-name) ":" line ":" column ":" (any "5") ":" (message) + line-end)) + :modes (cperl-mode perl-mode)) + +(flycheck-define-checker php + "A PHP syntax checker using the PHP command line interpreter. + +See URL `http://php.net/manual/en/features.commandline.php'." + :command ("php" "-l" "-d" "error_reporting=E_ALL" "-d" "display_errors=1" + "-d" "log_errors=0" source) + :error-patterns + ((error line-start (or "Parse" "Fatal" "syntax") " error" (any ":" ",") " " + (message) " in " (file-name) " on line " line line-end)) + :modes (php-mode php+-mode) + :next-checkers ((warnings-only . php-phpmd) + (warnings-only . php-phpcs))) + +(flycheck-def-option-var flycheck-phpmd-rulesets + '("cleancode" "codesize" "controversial" "design" "naming" "unusedcode") + php-phpmd + "The rule sets for PHP Mess Detector. + +Set default rule sets and custom rule set files. + +See section \"Using multiple rule sets\" in the PHP Mess Detector +manual at URL `http://phpmd.org/documentation/index.html'." + :type '(repeat :tag "rule sets" + (string :tag "A filename or rule set")) + :safe #'flycheck-string-list-p) + +(flycheck-define-checker php-phpmd + "A PHP style checker using PHP Mess Detector. + +See URL `http://phpmd.org/'." + :command ("phpmd" source "text" + (eval (flycheck-option-comma-separated-list + flycheck-phpmd-rulesets))) + :error-patterns + ((warning line-start(file-name) ":" line (message) line-end)) + :modes (php-mode php+-mode) + :next-checkers (php-phpcs)) + +(flycheck-def-option-var flycheck-phpcs-standard nil php-phpcs + "The coding standard for PHP CodeSniffer. + +When nil, use the default standard from the global PHP +CodeSniffer configuration. When set to a string, pass the string +to PHP CodeSniffer which will interpret it as name as a standard, +or as path to a standard specification." + :type '(choice (const :tag "Default standard" nil) + (string :tag "Standard name or file")) + :safe #'stringp) + +(flycheck-define-checker php-phpcs + "A PHP style checker using PHP_CodeSniffer. + +See URL `http://pear.php.net/package/PHP_CodeSniffer/'." + :command ("phpcs" "--report=emacs" + (option "--standard=" flycheck-phpcs-standard concat) + source) + ;; Though phpcs supports Checkstyle output which we could feed to + ;; `flycheck-parse-checkstyle', we are still using error patterns here, + ;; because PHP has notoriously unstable output habits. See URL + ;; `https://github.com/flycheck/flycheck/issues/78' and URL + ;; `https://github.com/flycheck/flycheck/issues/118' + :error-patterns + ((error line-start + (file-name) ":" line ":" column ": error - " (message) + line-end) + (warning line-start + (file-name) ":" line ":" column ": warning - " (message) + line-end)) + :modes (php-mode php+-mode)) + +(flycheck-define-checker puppet-parser + "A Puppet DSL syntax checker using puppet's own parser. + +See URL `http://puppetlabs.com/'." + :command ("puppet" "parser" "validate" "--color=false" source) + :error-patterns + ((error line-start + ;; Skip over the path of the Puppet executable + (minimal-match (zero-or-more not-newline)) + ": Could not parse for environment " (one-or-more word) + ": " (message (minimal-match (zero-or-more anything))) + " at " (file-name "/" (zero-or-more not-newline)) ":" line line-end)) + :modes puppet-mode + :next-checkers ((no-errors . puppet-lint))) + +(flycheck-define-checker puppet-lint + "A Puppet DSL style checker using puppet-lint. + +See URL `http://puppet-lint.com/'." + ;; We must check the original file, because Puppetlint is quite picky on the + ;; names of files and there place in the directory structure, to comply with + ;; Puppet's autoload directory layout. For instance, a class foo::bar is + ;; required to be in a file foo/bar.pp. Any other place, such as a Flycheck + ;; temporary file will cause an error. + :command ("puppet-lint" + "--log-format" "%{path}:%{linenumber}:%{kind}: %{message} (%{check})" + source-original) + :error-patterns + ((warning line-start (file-name) ":" line ":warning: " (message) line-end) + (error line-start (file-name) ":" line ":error: " (message) line-end)) + :modes puppet-mode + ;; Since we check the original file, we can only use this syntax checker if + ;; the buffer is actually linked to a file, and if it is not modified. + :predicate flycheck-buffer-saved-p) + +(flycheck-def-config-file-var flycheck-flake8rc python-flake8 ".flake8rc" + :safe #'stringp) + +(flycheck-def-option-var flycheck-flake8-maximum-complexity nil python-flake8 + "The maximum McCabe complexity of methods. + +If nil, do not check the complexity of methods. If set to an +integer, report any complexity greater than the value of this +variable as warning. + +If set to an integer, this variable overrules any similar setting +in the configuration file denoted by `flycheck-flake8rc'." + :type '(choice (const :tag "Do not check McCabe complexity" nil) + (integer :tag "Maximum complexity")) + :safe #'integerp) + +(flycheck-def-option-var flycheck-flake8-maximum-line-length nil python-flake8 + "The maximum length of lines. + +If set to an integer, the value of this variable denotes the +maximum length of lines, overruling any similar setting in the +configuration file denoted by `flycheck-flake8rc'. An error will +be reported for any line longer than the value of this variable. + +If set to nil, use the maximum line length from the configuration +file denoted by `flycheck-flake8rc', or the PEP 8 recommendation +of 79 characters if there is no configuration with this setting." + :type '(choice (const :tag "Default value") + (integer :tag "Maximum line length in characters")) + :safe #'integerp) + +(flycheck-define-checker python-flake8 + "A Python syntax and style checker using Flake8. + +For best error reporting, use Flake8 2.0 or newer. + +See URL `https://pypi.python.org/pypi/flake8'." + :command ("flake8" + (config-file "--config" flycheck-flake8rc) + (option "--max-complexity" flycheck-flake8-maximum-complexity nil + flycheck-option-int) + (option "--max-line-length" flycheck-flake8-maximum-line-length nil + flycheck-option-int) + source) + :error-patterns + ((error line-start + (file-name) ":" line ":" (optional column ":") " " + (message "E" (one-or-more digit) (zero-or-more not-newline)) + line-end) + (warning line-start + (file-name) ":" line ":" (optional column ":") " " + (message (or "F" ; Pyflakes in Flake8 >= 2.0 + "W" ; Pyflakes in Flake8 < 2.0 + "C") ; McCabe in Flake >= 2.0 + (one-or-more digit) (zero-or-more not-newline)) + line-end) + (info line-start + (file-name) ":" line ":" (optional column ":") " " + (message "N" ; pep8-naming in Flake8 >= 2.0 + (one-or-more digit) (zero-or-more not-newline)) + line-end) + ;; Syntax errors in Flake8 < 2.0, in Flake8 >= 2.0 syntax errors are caught + ;; by the E.* pattern above + (error line-start (file-name) ":" line ":" (message) line-end)) + :modes python-mode) + +(flycheck-def-config-file-var flycheck-pylintrc python-pylint + ".pylintrc" + :safe #'stringp) + +(flycheck-define-checker python-pylint + "A Python syntax and style checker using Pylint. + +This syntax checker requires Pylint 1.0 or newer. + +See URL `http://www.pylint.org/'." + ;; -r n disables the scoring report + :command ("pylint" "-r" "n" + "--msg-template" "{path}:{line}:{column}:{C}:{msg} ({msg_id})" + (config-file "--rcfile" flycheck-pylintrc) + ;; Need `source-inplace' for relative imports (e.g. `from .foo + ;; import bar'), see https://github.com/flycheck/flycheck/issues/280 + source-inplace) + :error-patterns + ((error line-start (file-name) ":" line ":" column ":" + (or "E" "F") ":" (message) line-end) + (warning line-start (file-name) ":" line ":" column ":" + (or "W" "R") ":" (message) line-end) + (info line-start (file-name) ":" line ":" column ":" + "C:" (message) line-end)) + :modes python-mode) + +(flycheck-define-checker racket + "A Racket syntax checker using the Racket compiler. + +See URL `http://racket-lang.org/'." + :command ("racket" "-f" source-inplace) + :error-patterns + ((error line-start (file-name) ":" line ":" column ":" (message) line-end)) + :modes racket-mode) + +(defun flycheck-locate-sphinx-source-directory () + "Locate the Sphinx source directory for the current buffer. + +Return the source directory, or nil, if the current buffer is not +part of a Sphinx project." + (-when-let* ((filename (buffer-file-name)) + (dir (locate-dominating-file filename "conf.py"))) + (expand-file-name dir))) + +(flycheck-define-checker rst + "A ReStructuredText (RST) syntax checker using Docutils. + +See URL `http://docutils.sourceforge.net/'." + ;; We need to use source-inplace to properly resolve relative paths in + ;; include:: directives + :command ("rst2pseudoxml.py" "--report=2" "--halt=5" source-inplace) + :error-patterns + ((warning line-start (file-name) ":" line ": (WARNING/2) " (message) line-end) + (error line-start + (file-name) ":" line + ": (" (or "ERROR/3" "SEVERE/4") ") " + (message) line-end)) + :modes rst-mode + ;; Don't use the generic ReST checker in Sphinx projects, because it'll + ;; produce a lot of false positives. + :predicate (lambda () (not (flycheck-locate-sphinx-source-directory)))) + +(flycheck-def-option-var flycheck-sphinx-warn-on-missing-references t rst-sphinx + "Whether to warn about missing references in Sphinx. + +When non-nil (the default), warn about all missing references in +Sphinx via `-n'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.17")) + +(flycheck-define-checker rst-sphinx + "A ReStructuredText (RST) syntax checker using Sphinx. + +Requires Sphinx 1.2 or newer. See URL `http://sphinx-doc.org'." + :command ("sphinx-build" "-b" "pseudoxml" + "-q" "-N" ; Reduced output and no colors + (option-flag "-n" flycheck-sphinx-warn-on-missing-references) + (eval (flycheck-locate-sphinx-source-directory)) + temporary-directory ; Redirect the output to a temporary + ; directory + source-original) ; Sphinx needs the original document + :error-patterns + ((warning line-start (file-name) ":" line ": WARNING: " (message) line-end) + (error line-start + (file-name) ":" line + ": " (or "ERROR" "SEVERE") ": " + (message) line-end)) + :modes rst-mode + :predicate (lambda () (and (flycheck-buffer-saved-p) + (flycheck-locate-sphinx-source-directory)))) + +(flycheck-def-config-file-var flycheck-rubocoprc ruby-rubocop ".rubocop.yml" + :safe #'stringp) + +(flycheck-def-option-var flycheck-rubocop-lint-only nil ruby-rubocop + "Whether to only report code issues in Rubocop. + +When non-nil, only report code issues in Rubocop, via `--lint'. +Otherwise report style issues as well.") + +(flycheck-define-checker ruby-rubocop + "A Ruby syntax and style checker using the RuboCop tool. + +See URL `http://batsov.com/rubocop/'." + :command ("rubocop" "--format" "emacs" + (config-file "--config" flycheck-rubocoprc) + (option-flag "--lint" flycheck-rubocop-lint-only) + source) + :error-patterns + ((info line-start + (file-name) ":" line ":" column ": C: " (message) + line-end) + (warning line-start + (file-name) ":" line ":" column ": W: " (message) + line-end) + (error line-start + (file-name) ":" line ":" column ": " (or "E" "F") ": " (message) + line-end)) + :modes (enh-ruby-mode ruby-mode) + :next-checkers ((warnings-only . ruby-rubylint))) + +;; Default to `nil' to let Rubylint find its configuration file by itself, and +;; to maintain backwards compatibility with older Rubylint and Flycheck releases +(flycheck-def-config-file-var flycheck-rubylintrc ruby-rubylint nil + :safe #'stringp) + +(flycheck-define-checker ruby-rubylint + "A Ruby syntax and code analysis checker using ruby-lint. + +Requires ruby-lint 2.0 or newer. To use `flycheck-rubylintrc', +ruby-lint 2.0.2 or newer is required. See URL +`https://github.com/YorickPeterse/ruby-lint'." + :command ("ruby-lint" "--presenter=syntastic" + (config-file "--config" flycheck-rubylintrc) + source) + :error-patterns + ((info line-start + (file-name) ":I:" line ":" column ": " (message) line-end) + (warning line-start + (file-name) ":W:" line ":" column ": " (message) line-end) + (error line-start + (file-name) ":E:" line ":" column ": " (message) line-end)) + :modes (enh-ruby-mode ruby-mode)) + +(flycheck-define-checker ruby + "A Ruby syntax checker using the standard Ruby interpreter. + +Please note that the output of different Ruby versions and +implementations varies wildly. This syntax checker supports +current versions of MRI and JRuby, but may break when used with +other implementations or future versions of these +implementations. + +Please consider using `ruby-rubocop' or `ruby-rubylint' instead. + +See URL `https://www.ruby-lang.org/'." + :command ("ruby" "-w" "-c" source) + :error-patterns + ;; These patterns support output from JRuby, too, to deal with RVM or Rbenv + ((error line-start + "SyntaxError in " (file-name) ":" line ": " (message) + line-end) + (warning line-start + (file-name) ":" line ":" (optional column ":") + " warning: " (message) line-end) + (error line-start (file-name) ":" line ": " (message) line-end)) + :modes (enh-ruby-mode ruby-mode) + :next-checkers ((warnings-only . ruby-rubylint))) + +(flycheck-define-checker ruby-jruby + "A Ruby syntax checker using the JRuby interpreter. + +This syntax checker is very primitive, and may break on future +versions of JRuby. + +Please consider using `ruby-rubocop' or `ruby-rubylint' instead. + +See URL `http://jruby.org/'." + :command ("jruby" "-w" "-c" source) + :error-patterns + ((error line-start + "SyntaxError in " (file-name) ":" line ": " (message) + line-end) + (warning line-start (file-name) ":" line " warning: " (message) line-end) + (error line-start (file-name) ":" line ": " (message) line-end)) + :modes (enh-ruby-mode ruby-mode) + :next-checkers ((warnings-only . ruby-rubylint))) + +(flycheck-def-option-var flycheck-rust-check-tests t rust + "Whether to check test code in Rust. + +When non-nil, `rustc' is passed the `--test' flag, which will +check any code marked with the `#[cfg(test)]' attribute and any +functions marked with `#[test]'. Otherwise, `rustc' is not passed +`--test' and test code will not be checked. Skipping `--test' is +necessary when using `#![no_std]', because compiling the test +runner requires `std'." + :type 'boolean + :safe #'booleanp + :package-version '("flycheck" . "0.19")) + +(flycheck-def-option-var flycheck-rust-crate-root nil rust + "A path to the crate root for the current buffer. + +The value of this variable is either a string with the path to +the crate root for the current buffer, or nil if the current buffer +is a crate. A relative path is relative to the current buffer. + +If this variable is non nil the current buffer will only be checked +if it is not modified, i.e. after it has been saved." + :type 'string + :package-version '(flycheck . "0.20") + :safe #'stringp) + +(flycheck-def-option-var flycheck-rust-crate-type "lib" rust + "The type of the Rust Crate to check. + +The value of this variable is a string denoting the crate type, +for the `--crate-type' flag." + :type 'string + :safe #'stringp + :package-version '("flycheck" . "0.20")) + +(flycheck-def-option-var flycheck-rust-library-path nil rust + "A list of library directories for Rust. + +The value of this variable is a list of strings, where each +string is a directory to add to the library path of Rust. +Relative paths are relative to the file being checked." + :type '(repeat (directory :tag "Library directory")) + :safe #'flycheck-string-list-p + :package-version '(flycheck . "0.18")) + +(flycheck-define-checker rust + "A Rust syntax checker using Rust compiler. + +This syntax checker needs Rust 0.10 or newer. + +See URL `http://www.rust-lang.org'." + :command ("rustc" "--no-trans" + (option "--crate-type" flycheck-rust-crate-type) + (option-flag "--test" flycheck-rust-check-tests) + (option-list "-L" flycheck-rust-library-path concat) + (eval (or flycheck-rust-crate-root + (flycheck-substitute-argument 'source-inplace 'rust)))) + :error-patterns + ((error line-start (file-name) ":" line ":" column ": " + (one-or-more digit) ":" (one-or-more digit) " error: " + (message) line-end) + (warning line-start (file-name) ":" line ":" column ": " + (one-or-more digit) ":" (one-or-more digit) " warning: " + (message) line-end) + (info line-start (file-name) ":" line ":" column ": " + (one-or-more digit) ":" (one-or-more digit) " note: " + (message) line-end)) + :modes rust-mode + :predicate (lambda () + (or (not flycheck-rust-crate-root) (flycheck-buffer-saved-p)))) + +(defvar flycheck-sass-scss-cache-directory nil + "The cache directory for `sass' and `scss'.") + +(defun flycheck-sass-scss-cache-location () + "Get the cache location for `sass' and `scss'. + +If no cache directory exists yet, create one and return it. +Otherwise return the previously used cache directory." + (setq flycheck-sass-scss-cache-directory + (or flycheck-sass-scss-cache-directory + (make-temp-file "flycheck-sass-scss-cache" 'directory)))) + +(flycheck-def-option-var flycheck-sass-compass nil sass + "Whether to enable the Compass CSS framework. + +When non-nil, enable the Compass CSS framework, via `--compass'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.16")) + +(flycheck-define-checker sass + "A Sass syntax checker using the Sass compiler. + +See URL `http://sass-lang.com'." + :command ("sass" + "--cache-location" (eval (flycheck-sass-scss-cache-location)) + (option-flag "--compass" flycheck-sass-compass) + "-c" source) + :error-patterns + ((error line-start "Syntax error on line " line ": " (message)) + (warning line-start "WARNING on line " line " of " (file-name) + ":" (optional "\r") "\n" (message) line-end) + (error line-start + "Syntax error: " + (message (one-or-more not-newline) + (zero-or-more "\n" + (one-or-more " ") + (one-or-more not-newline))) + (optional "\r") "\n on line " line " of " (file-name) + line-end)) + :modes sass-mode) + +(flycheck-define-checker scala + "A Scala syntax checker using the Scala compiler. + +See URL `http://www.scala-lang.org/'." + :command ("scalac" "-Ystop-after:parser" source) + :error-patterns + ((error line-start (file-name) ":" line ": error: " (message) line-end)) + :modes scala-mode + :next-checkers ((warnings-only . scala-scalastyle))) + +(flycheck-def-config-file-var flycheck-scalastylerc scala-scalastyle nil + :safe #'stringp + :package-version '(flycheck . "0.20")) + +(flycheck-def-option-var flycheck-scalastyle-jar nil scala-scalastyle + "The path to the main JAR file of Scalastyle. + +If this option is nil, or points to a non-existing file, +`scala-scalastyle' can not be used." + :type '(file :must-match t) + :safe #'stringp + :package-version '(flycheck . "0.20")) + +(flycheck-define-checker scala-scalastyle + "A Scala style checker using scalastyle. + +Note that this syntax checker is not used if +`flycheck-scalastyle-jar' or `flycheck-scalastylerc' are nil or +point to non-existing files. + +See URL `http://www.scalastyle.org'." + :command ("java" + (option "-jar" flycheck-scalastyle-jar) + (config-file "-c" flycheck-scalastylerc) + source) + :error-patterns + ((error line-start "error file=" (file-name) " message=" + (message) " line=" line (optional " column=" column) line-end) + (warning line-start "warning file=" (file-name) " message=" + (message) " line=" line (optional " column=" column) line-end)) + :modes scala-mode + :predicate + ;; Inhibit this syntax checker if the JAR or the configuration are unset or + ;; missing + (lambda () (and flycheck-scalastyle-jar flycheck-scalastylerc + (file-exists-p flycheck-scalastyle-jar) + (file-exists-p (flycheck-locate-config-file + flycheck-scalastylerc 'scala-scalastyle))))) + +(flycheck-def-option-var flycheck-scss-compass nil scss + "Whether to enable the Compass CSS framework. + +When non-nil, enable the Compass CSS framework, via `--compass'." + :type 'boolean + :safe #'booleanp + :package-version '(flycheck . "0.16")) + +(flycheck-define-checker scss + "A SCSS syntax checker using the SCSS compiler. + +See URL `http://sass-lang.com'." + :command ("scss" + "--cache-location" (eval (flycheck-sass-scss-cache-location)) + (option-flag "--compass" flycheck-scss-compass) + "-c" source) + :error-patterns + ((error line-start "Syntax error on line " line ": " (message)) + (warning line-start "WARNING on line " line " of " (file-name) + ":" (optional "\r") "\n" (message) line-end) + (error line-start + "Syntax error: " + (message (one-or-more not-newline) + (zero-or-more "\n" + (one-or-more " ") + (one-or-more not-newline))) + (optional "\r") "\n" (one-or-more " ") "on line " line " of " (file-name) + line-end)) + :modes scss-mode) + +(flycheck-define-checker sh-bash + "A Bash syntax checker using the Bash shell. + +See URL `http://www.gnu.org/software/bash/'." + :command ("bash" "--norc" "-n" "--" source) + :error-patterns ((error line-start + (file-name) ":" (one-or-more (not (any digit))) + line (zero-or-more " ") ":" (zero-or-more " ") + (message) line-end)) + :modes sh-mode + :predicate (lambda () (eq sh-shell 'bash)) + :next-checkers ((no-errors . sh-shellcheck))) + +(flycheck-define-checker sh-posix-dash + "A POSIX Shell syntax checker using the Dash shell. + +See URL `http://gondor.apana.org.au/~herbert/dash/'." + :command ("dash" "-n" source) + :error-patterns + ((error line-start (file-name) ": " line ": " (backref 1) ": " (message))) + :modes sh-mode + :predicate (lambda () (eq sh-shell 'sh)) + :next-checkers ((no-errors . sh-shellcheck))) + +(flycheck-define-checker sh-posix-bash + "A POSIX Shell syntax checker using the Bash shell. + +See URL `http://www.gnu.org/software/bash/'." + :command ("bash" "--posix" "--norc" "-n" "--" source) + :error-patterns + ((error line-start + (file-name) ":" (one-or-more (not (any digit))) + line (zero-or-more " ") ":" (zero-or-more " ") + (message) line-end)) + :modes sh-mode + :predicate (lambda () (eq sh-shell 'sh)) + :next-checkers ((no-errors . sh-shellcheck))) + +(flycheck-define-checker sh-zsh + "A Zsh syntax checker using the Zsh shell. + +See URL `http://www.zsh.org/'." + :command ("zsh" "-n" "-d" "-f" source) + :error-patterns + ((error line-start (file-name) ":" line ": " (message) line-end)) + :modes sh-mode + :predicate (lambda () (eq sh-shell 'zsh)) + :next-checkers ((no-errors . sh-shellcheck))) + +(defconst flycheck-shellcheck-supported-shells '(bash ksh88 sh zsh) + "Shells supported by Shellcheck.") + +(flycheck-define-checker sh-shellcheck + "A shell script syntax and style checker using Shellcheck. + +See URL `https://github.com/koalaman/shellcheck/'." + :command ("shellcheck" "-f" "checkstyle" + "-s" (eval (symbol-name sh-shell)) + source) + :modes sh-mode + :error-parser flycheck-parse-checkstyle + :predicate (lambda () (memq sh-shell flycheck-shellcheck-supported-shells))) + +(flycheck-define-checker slim + "A Slim syntax checker using the Slim compiler. + +See URL `http://slim-lang.com'." + :command ("slimrb" "-c" source) + :error-patterns + ((error line-start + "Slim::Parser::SyntaxError:" (message) (optional "\r") "\n " + (file-name) ", Line " line (optional ", Column " column) + line-end)) + :modes slim-mode) + +(flycheck-def-config-file-var flycheck-chktexrc tex-chktex ".chktexrc" + :safe #'stringp) + +(flycheck-define-checker tex-chktex + "A TeX and LaTeX syntax and style checker using chktex. + +See URL `http://www.nongnu.org/chktex/'." + :command ("chktex" (config-file "-l" flycheck-chktexrc) "-v0" "-q" "-I" + source-inplace) + :error-patterns + ((warning line-start (file-name) ":" line ":" column ":" (message) line-end)) + :modes (latex-mode plain-tex-mode)) + +(flycheck-define-checker tex-lacheck + "A LaTeX syntax and style checker using lacheck. + +See URL `http://www.ctan.org/pkg/lacheck'." + :command ("lacheck" source-inplace) + :error-patterns + ((warning line-start + "\"" (file-name) "\", line " line ": " (message) + line-end)) + :modes latex-mode) + +(flycheck-define-checker texinfo + "A Texinfo syntax checker using makeinfo. + +See URL `http://www.gnu.org/software/texinfo/'." + :command ("makeinfo" "-o" temporary-file-name source-inplace) + :error-patterns + ((warning line-start (file-name) ":" + line (optional ":" column) ": " + "warning: " (message) line-end) + (error line-start (file-name) ":" + line (optional ":" column) ": " + (message) line-end)) + :modes texinfo-mode) + +(flycheck-define-checker verilog-verilator + "A Verilog syntax checker using the Verilator Verilog HDL simulator. + +See URL `http://www.veripool.org/wiki/verilator'." + :command ("verilator" "--lint-only" "-Wall" source) + :error-patterns + ((warning line-start "%Warning-" (zero-or-more not-newline) ": " + (file-name) ":" line ": " (message) line-end) + (error line-start "%Error: " (file-name) ":" + line ": " (message) line-end)) + :modes (verilog-mode)) + +(flycheck-define-checker xml-xmlstarlet + "A XML syntax checker and validator using the xmlstarlet utility. + +See URL `http://xmlstar.sourceforge.net/'." + :command ("xmlstarlet" "val" "-e" "-q" source) + :error-patterns + ((error line-start (file-name) ":" line "." column ": " (message) line-end)) + :modes (xml-mode nxml-mode)) + +(flycheck-define-checker xml-xmllint + "A XML syntax checker and validator using the xmllint utility. + +The xmllint is part of libxml2, see URL +`http://www.xmlsoft.org/'." + :command ("xmllint" "--noout" source) + :error-patterns + ((error line-start (file-name) ":" line ": " (message) line-end)) + :modes (xml-mode nxml-mode)) + +(flycheck-define-checker yaml-jsyaml + "A YAML syntax checker using JS-YAML. + +See URL `https://github.com/nodeca/js-yaml'." + :command ("js-yaml" source) + :error-patterns + ((error line-start + "JS-YAML: " (message) " at line " line ", column " column ":" + line-end)) + :modes yaml-mode) + +(flycheck-define-checker yaml-ruby + "A YAML syntax checker using Ruby's YAML parser. + +This syntax checker uses the YAML parser from Ruby's standard +library. + +See URL `http://www.ruby-doc.org/stdlib-2.0.0/libdoc/yaml/rdoc/YAML.html'." + :command ("ruby" "-ryaml" "-e" "begin; + file_name = ARGV[0]; \ + YAML.load(ARGF); \ + rescue Exception => e; \ + STDERR.puts \"#{file_name}:#{e}\"; \ + end" source) + :error-patterns + (;; Syck (Ruby <= 1.9.2, unmaintained) + (error line-start (file-name) + ":syntax error on line " line ", col " column ": `" (message) "'" line-end) + ;; Psych (Ruby >= 1.9.3) + (error line-start (file-name) ":" (zero-or-more not-newline) ":" (message) + "at line " line " column " column line-end)) + :modes yaml-mode) + +(provide 'flycheck) + +;; Local Variables: +;; coding: utf-8 +;; indent-tabs-mode: nil +;; End: + +;;; flycheck.el ends here diff --git a/elpa/flycheck-0.20/flycheck.elc b/elpa/flycheck-0.20/flycheck.elc new file mode 100644 index 0000000000000000000000000000000000000000..26ef0d5fed1bbb28a4c72bcfdd5a5f6c38200937 GIT binary patch literal 283800 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 literal 0 HcmV?d00001 diff --git a/elpa/ipython-2927/ipython-autoloads.el b/elpa/ipython-2927/ipython-autoloads.el new file mode 100644 index 000000000..7c2d982f7 --- /dev/null +++ b/elpa/ipython-2927/ipython-autoloads.el @@ -0,0 +1,18 @@ +;;; ipython-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads nil nil ("ipython-pkg.el" "ipython.el") (21566 +;;;;;; 24466 669284 928000)) + +;;;*** + +(provide 'ipython-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; ipython-autoloads.el ends here diff --git a/elpa/ipython-2927/ipython-pkg.el b/elpa/ipython-2927/ipython-pkg.el new file mode 100644 index 000000000..9ed12a013 --- /dev/null +++ b/elpa/ipython-2927/ipython-pkg.el @@ -0,0 +1 @@ +(define-package "ipython" "2927" "Adds support for IPython to python-mode.el" (quote nil)) diff --git a/elpa/ipython-2927/ipython-pkg.elc b/elpa/ipython-2927/ipython-pkg.elc new file mode 100644 index 0000000000000000000000000000000000000000..636a0c2c253efc61f64493644fab0cdb8c498998 GIT binary patch literal 651 zcmbtRO>4qH5cQlt(Cgr-1+&qpSk0v(9)v;*E%aE%-AS^T%!b`f#s2zkq6o#KbJ>sg z_Pv>X+4gnwFc=J?EX!bH>PA|YqJ=qtw#XN4Ar=r`5)``MuCAdYF zB&4aqFnopAZ_>kL4&%jYK3>gINXL^|ubGDQHnV`YOgEZ_hkXxU}&*6sS^~Ywn16iU) z8UE0XdV6FA&VWRQJwavgpUGty2ZXlLWWkq#m`=~WA*Z{lYvA6BqUcdku9@Nn +;; is also enabled (experimental feature!). Please also note that all the +;; terminal functions in py-shell are handled by emacs's comint, **not** by +;; (i)python, so importing readline etc. will have 0 effect. +;; +;; To start an interactive ipython session run `py-shell' with ``M-x py-shell`` +;; (or the default keybinding ``C-c C-!``). +;; +;; You can customize the arguments passed to the IPython instance at startup by +;; setting the ``py-python-command-args`` variable. For example, to start +;; always in ``pylab`` mode with hardcoded light-background colors, you can +;; use:: +;; +;; (setq py-python-command-args '("-pylab" "-colors" "LightBG")) +;; +;; +;; NOTE: This mode is currently somewhat alpha and although I hope that it +;; will work fine for most cases, doing certain things (like the +;; autocompletion and a decent scheme to switch between python interpreters) +;; properly will also require changes to ipython that will likely have to wait +;; for a larger rewrite scheduled some time in the future. +;; +;; +;; Further note that I don't know whether this runs under windows or not and +;; that if it doesn't I can't really help much, not being afflicted myself. +;; +;; +;; Hints for effective usage +;; ------------------------- +;; +;; - IMO the best feature by far of the ipython/emacs combo is how much easier +;; it makes it to find and fix bugs thanks to the ``%pdb on or %debug``/ +;; pdbtrack combo. Try it: first in the ipython to shell do ``%pdb on`` then +;; do something that will raise an exception (FIXME nice example), or type +;; ``%debug`` after the exception has been raised. YOu'll be amazed at how +;; easy it is to inspect the live objects in each stack frames and to jump to +;; the corresponding sourcecode locations as you walk up and down the stack +;; trace (even without ``%pdb on`` you can always use ``C-c -`` +;; (`py-up-exception') to jump to the corresponding source code locations). +;; +;; - emacs gives you much more powerful commandline editing and output searching +;; capabilities than ipython-standalone -- isearch is your friend if you +;; quickly want to print 'DEBUG ...' to stdout out etc. +;; +;; - This is not really specific to ipython, but for more convenient history +;; access you might want to add something like the following to *the beggining* +;; of your ``.emacs`` (if you want behavior that's more similar to stand-alone +;; ipython, you can change ``meta p`` etc. for ``control p``):: +;; +;; (require 'comint) +;; (define-key comint-mode-map [(meta p)] +;; 'comint-previous-matching-input-from-input) +;; (define-key comint-mode-map [(meta n)] +;; 'comint-next-matching-input-from-input) +;; (define-key comint-mode-map [(control meta n)] +;; 'comint-next-input) +;; (define-key comint-mode-map [(control meta p)] +;; 'comint-previous-input) +;; +;; - Be aware that if you customize py-python-command previously, this value +;; will override what ipython.el does (because loading the customization +;; variables comes later). +;; +;; Please send comments and feedback to the ipython-list +;; () where I (a.s.) or someone else will try to +;; answer them (it helps if you specify your emacs version, OS etc; +;; familiarity with might +;; speed up things further). +;; +;; Footnotes: +;; +;; [1] If you don't know what `load-path' is, C-h v load-path will tell +;; you; if required you can also add a new directory. So assuming that +;; ipython.el resides in ~/el/, put this in your emacs: +;; +;; +;; (add-to-list 'load-path "~/el") +;; (setq ipython-command "/some-path/ipython") +;; (require 'ipython) +;; +;; +;; +;; +;; TODO: +;; - do autocompletion properly +;; - implement a proper switching between python interpreters +;; +;; BUGS: +;; - neither:: +;; +;; (py-shell "-c print 'FOOBAR'") +;; +;; nor:: +;; +;; (let ((py-python-command-args (append py-python-command-args +;; '("-c" "print 'FOOBAR'")))) +;; (py-shell)) +;; +;; seem to print anything as they should +;; +;; - look into init priority issues with `py-python-command' (if it's set +;; via custom) + +(require 'python) +;;; Code +(require 'cl) +(require 'shell) +(require 'executable) +(require 'ansi-color) + +(defcustom ipython-command "ipython" + "*Shell command used to start ipython." + :type 'string + :group 'python) + +;; Users can set this to nil +(defvar py-shell-initial-switch-buffers t + "If nil, don't switch to the *Python* buffer on the first call to + `py-shell'.") + +(defvar ipython-backup-of-py-python-command nil + "HACK") + + +(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.") + + +(if (not (executable-find ipython-command)) + (message (format "Can't find executable %s - ipython.el *NOT* activated!!!" + ipython-command)) + ;; XXX load python-mode, so that we can screw around with its variables + ;; this has the disadvantage that python-mode is loaded even if no + ;; python-file is ever edited etc. but it means that `py-shell' works + ;; without loading a python-file first. Obviously screwing around with + ;; python-mode's variables like this is a mess, but well. + (require 'python-mode) + ;; turn on ansi colors for ipython and activate completion + (defun ipython-shell-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) + + (ansi-color-for-comint-mode-on) + (define-key py-shell-map [tab] 'ipython-complete) + ;; Add this so that tab-completion works both in X11 frames and inside + ;; terminals (such as when emacs is called with -nw). + (define-key py-shell-map "\t" 'ipython-complete) + ;;XXX this is really just a cheap hack, it only completes symbols in the + ;;interactive session -- useful nonetheless. + (define-key py-mode-map [(meta tab)] 'ipython-complete) + + ) + (add-hook 'py-shell-hook 'ipython-shell-hook) + ;; Regular expression that describes tracebacks for IPython in context and + ;; verbose mode. + + ;;Adapt python-mode settings for ipython. + ;; (this works for %xmode 'verbose' or 'context') + + ;; XXX putative regexps for syntax errors; unfortunately the + ;; current python-mode traceback-line-re scheme is too primitive, + ;; so it's either matching syntax errors, *or* everything else + ;; (XXX: should ask Fernando for a change) + ;;"^ File \"\\(.*?\\)\", line \\([0-9]+\\).*\n.*\n.*\nSyntaxError:" + ;;^ File \"\\(.*?\\)\", line \\([0-9]+\\)" + + (setq py-traceback-line-re + "\\(^[^\t >].+?\\.py\\).*\n +[0-9]+[^\00]*?\n-+> \\([0-9]+\\)+") + + + ;; Recognize the ipython pdb, whose prompt is 'ipdb>' or 'ipydb>' + ;;instead of '(Pdb)' + (setq py-pdbtrack-input-prompt "\n[(<]*[Ii]?[Pp]y?db[>)]+ ") + (setq pydb-pydbtrack-input-prompt "\n[(]*ipydb[>)]+ ") + + (setq py-shell-input-prompt-1-regexp "^In \\[[0-9]+\\]: *" + py-shell-input-prompt-2-regexp "^ [.][.][.]+: *" ) + ;; select a suitable color-scheme + (unless (member "-colors" py-python-command-args) + (setq py-python-command-args + (nconc py-python-command-args + (list "-colors" + (cond + ((eq frame-background-mode 'dark) + "Linux") + ((eq frame-background-mode 'light) + "LightBG") + (t ; default (backg-mode isn't always set by XEmacs) + "LightBG")))))) + (unless (equal ipython-backup-of-py-python-command py-python-command) + (setq ipython-backup-of-py-python-command py-python-command)) + (setq py-python-command ipython-command)) + + +;; MODIFY py-shell so that it loads the editing history +(defadvice py-shell (around py-shell-with-history) + "Add persistent command-history support (in +$PYTHONHISTORY (or \"~/.ipython/history\", if we use IPython)). Also, if +`py-shell-initial-switch-buffers' is nil, it only switches to *Python* if that +buffer already exists." + (if (comint-check-proc "*Python*") + ad-do-it + (setq comint-input-ring-file-name + (if (string-equal py-python-command ipython-command) + (concat (or (getenv "IPYTHONDIR") "~/.ipython") "/history") + (or (getenv "PYTHONHISTORY") "~/.python-history.py"))) + (comint-read-input-ring t) + (let ((buf (current-buffer))) + ad-do-it + (unless py-shell-initial-switch-buffers + (switch-to-buffer-other-window buf))))) +(ad-activate 'py-shell) +;; (defadvice py-execute-region (before py-execute-buffer-ensure-process) +;; "HACK: test that ipython is already running before executing something. +;; Doing this properly seems not worth the bother (unless people actually +;; request it)." +;; (unless (comint-check-proc "*Python*") +;; (error "Sorry you have to first do M-x py-shell to send something to ipython."))) +;; (ad-activate 'py-execute-region) + +(defadvice py-execute-region (around py-execute-buffer-ensure-process) + "HACK: if `py-shell' is not active or ASYNC is explicitly desired, fall back + to python instead of ipython." + (let ((py-which-shell (if (and (comint-check-proc "*Python*") (not async)) + py-python-command + ipython-backup-of-py-python-command))) + ad-do-it)) +(ad-activate 'py-execute-region) + +(defun ipython-to-doctest (start end) + "Transform a cut-and-pasted bit from an IPython session into something that +looks like it came from a normal interactive python session, so that it can +be used in doctests. Example: + + + In [1]: import sys + + In [2]: sys.stdout.write 'Hi!\n' + ------> sys.stdout.write ('Hi!\n') + Hi! + + In [3]: 3 + 4 + Out[3]: 7 + +gets converted to: + + >>> import sys + >>> sys.stdout.write ('Hi!\n') + Hi! + >>> 3 + 4 + 7 + +" + (interactive "*r\n") + ;(message (format "###DEBUG s:%de:%d" start end)) + (save-excursion + (save-match-data + ;; replace ``In [3]: bla`` with ``>>> bla`` and + ;; ``... : bla`` with ``... bla`` + (goto-char start) + (while (re-search-forward ipython-de-input-prompt-regexp end t) + ;(message "finding 1") + (cond ((match-string 3) ;continued + (replace-match "... \\3" t nil)) + (t + (replace-match ">>> \\1\\2" t nil)))) + ;; replace `` + (goto-char start) + (while (re-search-forward ipython-de-output-prompt-regexp end t) + (replace-match "" t nil))))) + +(defvar ipython-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") + + +;; xemacs doesn't have `comint-preoutput-filter-functions' so we'll try the +;; following wonderful hack to work around this case +(if (featurep 'xemacs) + ;;xemacs + (defun ipython-complete () + "Try to complete the python symbol before point. Only knows about the stuff +in the current *Python* session." + (interactive) + (let* ((ugly-return nil) + (sep ";") + (python-process (or (get-buffer-process (current-buffer)) + ;XXX hack for .py buffers + (get-process py-which-bufname))) + ;; XXX currently we go backwards to find the beginning of an + ;; expression part; a more powerful approach in the future might be + ;; to let ipython have the complete line, so that context can be used + ;; to do things like filename completion etc. + (beg (save-excursion (skip-chars-backward "a-z0-9A-Z_." (point-at-bol)) + (point))) + (end (point)) + (pattern (buffer-substring-no-properties beg end)) + (completions nil) + (completion-table nil) + completion + (comint-output-filter-functions + (append comint-output-filter-functions + '(ansi-color-filter-apply + (lambda (string) + ;(message (format "DEBUG filtering: %s" string)) + (setq ugly-return (concat ugly-return string)) + (delete-region comint-last-output-start + (process-mark (get-buffer-process (current-buffer))))))))) + ;(message (format "#DEBUG pattern: '%s'" pattern)) + (process-send-string python-process + (format ipython-completion-command-string pattern)) + (accept-process-output python-process) + ;(message (format "DEBUG return: %s" ugly-return)) + (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) + (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"))))) + ;; emacs + (defun ipython-complete () + "Try to complete the python symbol before point. Only knows about the stuff +in the current *Python* session." + (interactive) + (let* ((ugly-return nil) + (sep ";") + (python-process (or (get-buffer-process (current-buffer)) + ;XXX hack for .py buffers + (get-process py-which-bufname))) + ;; XXX currently we go backwards to find the beginning of an + ;; expression part; a more powerful approach in the future might be + ;; to let ipython have the complete line, so that context can be used + ;; to do things like filename completion etc. + (beg (save-excursion (skip-chars-backward "a-z0-9A-Z_./" (point-at-bol)) + (point))) + (end (point)) + (pattern (buffer-substring-no-properties beg end)) + (completions nil) + (completion-table nil) + completion + (comint-preoutput-filter-functions + (append comint-preoutput-filter-functions + '(ansi-color-filter-apply + (lambda (string) + (setq ugly-return (concat ugly-return string)) + ""))))) + (process-send-string python-process + (format ipython-completion-command-string pattern)) + (accept-process-output python-process) + (setq completions + (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep)) + ;(message (format "DEBUG completions: %S" completions)) + (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) + (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 "*IPython Completions*" + (display-completion-list (all-completions pattern completion-table))) + (message "Making completion list...%s" "done"))))) + ) + +;;; autoindent support: patch sent in by Jin Liu , +;;; originally written by doxgen@newsmth.net +;;; Minor modifications by fperez for xemacs compatibility. + +(defvar ipython-autoindent t + "If non-nil, enable autoindent for IPython shell through python-mode.") + +(defvar ipython-indenting-buffer-name "*IPython Indentation Calculation*" + "Temporary buffer for indenting multiline statement.") + +(defun ipython-get-indenting-buffer () + "Return a temporary buffer set in python-mode. Create one if necessary." + (let ((buf (get-buffer-create ipython-indenting-buffer-name))) + (set-buffer buf) + (unless (eq major-mode 'python-mode) + (python-mode)) + buf)) + +(defvar ipython-indentation-string nil + "Indentation for the next line in a multiline statement.") + +(defun ipython-send-and-indent () + "Send the current line to IPython, and calculate the indentation for +the next line." + (interactive) + (if ipython-autoindent + (let ((line (buffer-substring (point-at-bol) (point))) + (after-prompt1) + (after-prompt2)) + (save-excursion + (comint-bol t) + (if (looking-at py-shell-input-prompt-1-regexp) + (setq after-prompt1 t) + (setq after-prompt2 (looking-at py-shell-input-prompt-2-regexp))) + (with-current-buffer (ipython-get-indenting-buffer) + (when after-prompt1 + (erase-buffer)) + (when (or after-prompt1 after-prompt2) + (delete-region (point-at-bol) (point)) + (insert line) + (newline-and-indent)))))) + ;; send input line to ipython interpreter + (comint-send-input)) + +(defun ipython-indentation-hook (string) + "Insert indentation string if py-shell-input-prompt-2-regexp +matches last process output." + (let* ((start-marker (or comint-last-output-start + (point-min-marker))) + (end-marker (process-mark (get-buffer-process (current-buffer)))) + (text (ansi-color-filter-apply (buffer-substring start-marker end-marker)))) + ;; XXX if `text' matches both pattern, it MUST be the last prompt-2 + (when (and (string-match py-shell-input-prompt-2-regexp text) + (not (string-match "\n$" text))) + (with-current-buffer (ipython-get-indenting-buffer) + (setq ipython-indentation-string + (buffer-substring (point-at-bol) (point)))) + (goto-char end-marker) + (insert ipython-indentation-string) + (setq ipython-indentation-string nil)))) + +(add-hook 'py-shell-hook + (lambda () + (add-hook 'comint-output-filter-functions + 'ipython-indentation-hook))) + +(define-key py-shell-map (kbd "RET") 'ipython-send-and-indent) +;;; / end autoindent support + +(provide 'ipython) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; ipython.el ends here diff --git a/elpa/ipython-2927/ipython.elc b/elpa/ipython-2927/ipython.elc new file mode 100644 index 0000000000000000000000000000000000000000..109dbdf8a47d91de6171389731c159fc7c3beeef GIT binary patch literal 8743 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 mPyQD>X$ZZWKgf&)_(yv1>czf literal 0 HcmV?d00001 diff --git a/elpa/jedi-0.1.2/Makefile b/elpa/jedi-0.1.2/Makefile new file mode 100644 index 000000000..94ba071de --- /dev/null +++ b/elpa/jedi-0.1.2/Makefile @@ -0,0 +1,168 @@ +ENV = env + +VIRTUALENV_SYSTEM_SITE_PACKAGES ?= true +VIRTUALENV = \ + VIRTUALENV_SYSTEM_SITE_PACKAGES=$(VIRTUALENV_SYSTEM_SITE_PACKAGES) \ + virtualenv --python=$(PYTHON) +PIP_INSTALL = $(ENV)/bin/pip install --use-mirrors +JEDI_DEV_URL = https://github.com/davidhalter/jedi/archive/dev.zip + +PYTHON ?= python +CARTON ?= carton +EMACS ?= emacs + + +EL4T_SCRIPT = tools/el4t/emacs.sh +EL4T_CARTON = EL4T_EMACS=${EMACS} EMACS=${EL4T_SCRIPT} ${CARTON} +EL4T_CARTON_EMACS = ${EL4T_CARTON} exec ${EL4T_SCRIPT} + +.PHONY : test test-1 tryout clean-elpa requirements env clean-env clean \ + print-deps travis-ci doc + +test: elpa requirements + ${MAKE} test-1 + +test-1: + rm -f elpa/mocker-*/*elc # workaround a bug in mocker.el + ${EL4T_CARTON_EMACS} -Q -batch \ + -L . -l test-jedi.el -f ert-run-tests-batch-and-exit + tox + +compile: elpa clean-elc + ${EL4T_CARTON_EMACS} -Q -batch \ + -L . -f batch-byte-compile *.el + +clean-elc: + rm -rf *.elc + +tryout: compile requirements + ${EL4T_CARTON_EMACS} -Q -L . -l tryout-jedi.el + +doc: elpa + make -C doc html + +${EL4T_SCRIPT}: ensure-git + git submodule update --init + +ensure-git: + test -d .git # Running task that can be run only in git repository + +elpa: ${EL4T_SCRIPT} + mkdir -p elpa + ${EL4T_CARTON} install 2> elpa/install.log + +clean-elpa: + rm -rf elpa + +requirements: env + ${PIP_INSTALL} --requirement requirements.txt + +install-jedi-dev: + ${PIP_INSTALL} --upgrade ${JEDI_DEV_URL} + +env: $(ENV)/bin/activate +$(ENV)/bin/activate: + $(VIRTUALENV) $(ENV) + +clean-env: + rm -rf $(ENV) + +clean-el: clean-elpa clean-elc +clean: clean-env clean-el + +print-deps: elpa requirements + @echo "----------------------- Dependencies -----------------------" + $(EMACS) --version + ${EL4T_CARTON_EMACS} -Q -batch -l jedi.el -f jedi:print-jedi-version + ls -d $(ENV)/lib/python*/site-packages/*egg-info + @echo "------------------------------------------------------------" + +travis-ci: print-deps test + + + +# Run test against Emacs listed in ${EL4T_EMACS_LIST}. +# This is for running tests for multiple Emacs versions. +# This is not used in Travis CI. Usage:: +# +# make EL4T_EMACS_LIST="emacs emacs-snapshot emacs23" test-all +# +# See: http://stackoverflow.com/a/12110773/727827 +# +# Use ${EL4T_MET_MAKEFLAGS} to do the tests in parallel. +# +# EL4T_MET_MAKEFLAGS=-j4 + +JOBS := $(addprefix job-,${EL4T_EMACS_LIST}) +.PHONY: ${JOBS} + +${JOBS}: job-%: + ${MAKE} EMACS=$* clean-el elpa + ${MAKE} EMACS=$* ${EL4T_MET_MAKEFLAGS} test-1 + +test-all: requirements ${JOBS} + + + +### Packaging +# +# Create dist/${PACKAGE}-${VERSION}.tar.gz ready for distribution. +# +# See: (info "(elisp) Multi-file Packages") +PACKAGE = jedi +VERSION = $(shell grep ';; Version:' jedi.el | sed 's/^.* \([0-9].*\)$$/\1/') +DIST_FILES = jedi-pkg.el jedi.el jediepcserver.py \ + requirements.txt Makefile tryout-jedi.el + +.PHONY: dist ${PACKAGE}-${VERSION}.tar.gz ${PACKAGE}-${VERSION} \ + clean-dist clean-dist-all + +dist: clean-dist + ${MAKE} dist-1 + +dist-1: dist/${PACKAGE}-${VERSION}.tar dist/${PACKAGE}-${VERSION}.tar.gz + +dist/${PACKAGE}-${VERSION}.tar: ${PACKAGE}-${VERSION}.tar +${PACKAGE}-${VERSION}.tar: ${PACKAGE}-${VERSION} + tar --directory dist -cvf dist/$@ $< + +dist/${PACKAGE}-${VERSION}.tar.gz: ${PACKAGE}-${VERSION}.tar.gz +${PACKAGE}-${VERSION}.tar.gz: ${PACKAGE}-${VERSION} + tar --directory dist -cvzf dist/$@ $< + +${PACKAGE}-${VERSION}: dist/${PACKAGE}-${VERSION} +dist/${PACKAGE}-${VERSION}: + mkdir -p $@ + cp -v ${DIST_FILES} $@ + +clean-dist: + rm -rf dist/${PACKAGE}-${VERSION}* + +clean-dist-all: + rm -rf dist + + + +### Package installation +PACKAGE_USER_DIR = +TEST_PACKAGE_DIR = dist/test + +install-dist: + test -d '${PACKAGE_USER_DIR}' + ${EMACS} --batch -Q \ + -l package \ + --eval " \ + (add-to-list 'package-archives \ + '(\"marmalade\" . \"http://marmalade-repo.org/packages/\") t)" \ + --eval '(setq package-user-dir "${PWD}/${PACKAGE_USER_DIR}")' \ + --eval '(package-list-packages)' \ + --eval '(package-install-file "${PWD}/dist/${PACKAGE}-${VERSION}.tar")' + +test-install: dist/${PACKAGE}-${VERSION}.tar + rm -rf ${TEST_PACKAGE_DIR} + mkdir -p ${TEST_PACKAGE_DIR} + ${MAKE} install-dist PACKAGE_USER_DIR=${TEST_PACKAGE_DIR} + +test-install-requirement: test-install + ${MAKE} --directory ${TEST_PACKAGE_DIR}/${PACKAGE}-${VERSION} \ + requirements diff --git a/elpa/jedi-0.1.2/jedi-autoloads.el b/elpa/jedi-0.1.2/jedi-autoloads.el new file mode 100644 index 000000000..eec23a819 --- /dev/null +++ b/elpa/jedi-0.1.2/jedi-autoloads.el @@ -0,0 +1,73 @@ +;;; jedi-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads (jedi:setup anything-jedi-related-names helm-jedi-related-names +;;;;;; jedi:ac-setup jedi:complete jedi:start-dedicated-server) +;;;;;; "jedi" "jedi.el" (21566 24344 289977 248000)) +;;; Generated autoloads from jedi.el + +(autoload 'jedi:start-dedicated-server "jedi" "\ +Start Jedi server dedicated to this buffer. +This is useful, for example, when you want to use different +`sys.path' for some buffer. When invoked as an interactive +command, it asks you how to start the Jedi server. You can edit +the command in minibuffer to specify the way Jedi server run. + +If you want to setup how Jedi server is started programmatically +per-buffer/per-project basis, make `jedi:server-command' and +`jedi:server-args' buffer local and set it in `python-mode-hook'. +See also: `jedi:server-args'. + +\(fn COMMAND)" t nil) + +(autoload 'jedi:complete "jedi" "\ +Complete code at point. + +\(fn &key (expand ac-expand-on-auto-complete))" t nil) + +(autoload 'jedi:ac-setup "jedi" "\ +Add Jedi AC sources to `ac-sources'. + +\(fn)" t nil) + +(autoload 'helm-jedi-related-names "jedi" "\ +Find related names of the object at point using `helm' interface. + +\(fn)" t nil) + +(autoload 'anything-jedi-related-names "jedi" "\ +Find related names of the object at point using `anything' interface. + +\(fn)" t nil) + +(autoload 'jedi:setup "jedi" "\ +Fully setup jedi.el for current buffer. +It setups `ac-sources' (calls `jedi:ac-setup') and turns +`jedi-mode' on. + +This function is intended to be called from `python-mode-hook', +like this:: + + (add-hook 'python-mode-hook 'jedi:setup) + +You can also call this function as a command, to quickly test +what jedi can do. + +\(fn)" t nil) + +;;;*** + +;;;### (autoloads nil nil ("jedi-pkg.el") (21566 24344 300270 432000)) + +;;;*** + +(provide 'jedi-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; jedi-autoloads.el ends here diff --git a/elpa/jedi-0.1.2/jedi-pkg.el b/elpa/jedi-0.1.2/jedi-pkg.el new file mode 100644 index 000000000..bcc33fb57 --- /dev/null +++ b/elpa/jedi-0.1.2/jedi-pkg.el @@ -0,0 +1,6 @@ +(define-package "jedi" "0.1.2" "Python auto-completion for Emacs" + '((epc "0.1.0") + (auto-complete "1.4"))) +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/elpa/jedi-0.1.2/jedi.el b/elpa/jedi-0.1.2/jedi.el new file mode 100644 index 000000000..be6a47de0 --- /dev/null +++ b/elpa/jedi-0.1.2/jedi.el @@ -0,0 +1,1067 @@ +;;; jedi.el --- a Python auto-completion for Emacs + +;; Copyright (C) 2012 Takafumi Arakaki + +;; Author: Takafumi Arakaki +;; Package-Requires: ((epc "0.1.0") (auto-complete "1.4")) +;; Version: 0.1.2 + +;; This file is NOT part of GNU Emacs. + +;; jedi.el 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. + +;; jedi.el 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 jedi.el. +;; If not, see . + +;;; Commentary: + +;; + +;;; Code: + +(require 'ring) + +(require 'epc) +(require 'auto-complete) +(declare-function pos-tip-show "pos-tip") + + +(defgroup jedi nil + "Auto-completion for Python." + :group 'completion + :prefix "jedi:") + +(defconst jedi:version "0.1.2") + +(defvar jedi:source-dir (if load-file-name + (file-name-directory load-file-name) + default-directory)) + +(defvar jedi:epc nil) +(make-variable-buffer-local 'jedi:epc) + +(defvar jedi:server-script + (convert-standard-filename + (expand-file-name "jediepcserver.py" jedi:source-dir)) + "Full path to Jedi server script file ``jediepcserver.py``.") + + +;;; Configuration variables + +(defcustom jedi:server-command + (list (let ((py (expand-file-name "env/bin/python" jedi:source-dir))) + (if (file-exists-p py) py "python")) + jedi:server-script) + "Command used to run Jedi server. + +If you setup Jedi requirements using ``make requirements`` command, +`jedi:server-command' should be automatically set to:: + + '(\"JEDI:SOURCE-DIR/env/bin/python\" + \"JEDI:SOURCE-DIR/jediepcserver.py\") + +Otherwise, it should be set to:: + + '(\"python\" \"JEDI:SOURCE-DIR/jediepcserver.py\") + +If you want to use your favorite Python executable, set +`jedi:server-command' using:: + + (setq jedi:server-command + (list \"YOUR-FAVORITE-PYTHON\" jedi:server-script)) + +If you want to pass some arguments to the Jedi server command, +use `jedi:server-command'." + :group 'jedi) + +(defcustom jedi:server-args nil + "Command line arguments to be appended to `jedi:server-command'. + +If you want to add some special `sys.path' when starting Jedi +server, do something like this:: + + (setq jedi:server-args + '(\"--sys-path\" \"MY/SPECIAL/PATH\" + \"--sys-path\" \"MY/OTHER/SPECIAL/PATH\")) + +If you want to include some virtualenv, do something like this. +Note that actual `VIRTUAL_ENV' is treated automatically. Also, +you need to start Jedi EPC server with the same python version +that you use for the virtualenv.:: + + (setq jedi:server-args + '(\"--virtual-env\" \"SOME/VIRTUAL_ENV_1\" + \"--virtual-env\" \"SOME/VIRTUAL_ENV_2\")) + +To see what other arguments Jedi server can take, execute the +following command:: + + python jediepcserver.py --help + + +**Advanced usage** + +Sometimes you want to configure how Jedi server is started per +buffer. To do that, you should make this variable buffer local +in `python-mode-hook' and set it to some buffer specific variable, +like this:: + + (defun my-jedi-server-setup () + (let ((cmds (GET-SOME-PROJECT-SPECIFIC-COMMAND)) + (args (GET-SOME-PROJECT-SPECIFIC-ARGS))) + (when cmds (set (make-local-variable 'jedi:server-command) cmds)) + (when args (set (make-local-variable 'jedi:server-args) args)))) + + (add-hook 'python-mode-hook 'my-jedi-server-setup) + +Note that Jedi server run by the same command is pooled. So, +there is only one Jedi server for the same set of command. If +you want to check how many EPC servers are running, use the EPC +GUI: M-x `epc:controller'. You will see a table of EPC connections +for Jedi.el and other EPC applications. + +If you want to start a new ad-hoc server for the current buffer, +use the command `jedi:start-dedicated-server'." + :group 'jedi) + +(defcustom jedi:complete-on-dot nil + "Non-`nil' means automatically start completion after inserting a dot. +To make this option work, you need to use `jedi:setup' instead of +`jedi:ac-setup' to start Jedi." + :group 'jedi) + +(defcustom jedi:tooltip-method '(pos-tip popup) + "Configuration for `jedi:tooltip-show'. +This is a list which may contain symbol(s) `pos-tip' and/or +`popup'. It determines tooltip method to use. Setting this +value to nil means to use minibuffer instead of tooltip." + :group 'jedi) + +(defcustom jedi:get-in-function-call-timeout 3000 + "Cancel request to server for call signature after this period +specified in in millisecond." + :group 'jedi) + +(defcustom jedi:get-in-function-call-delay 1000 + "How long Jedi should wait before showing call signature +tooltip in millisecond." + :group 'jedi) + +(defcustom jedi:goto-definition-config + '((nil nil nil) + (t nil nil) + (nil definition nil) + (t definition nil) + (nil nil t ) + (t nil t ) + (nil definition t ) + (t definition t )) + "Configure how prefix argument modifies `jedi:goto-definition' behavior. + +Each element of the list is arguments (list) passed to +`jedi:goto-definition'. Note that this variable has no effect on +`jedi:goto-definition' when it is used as a lisp function + +The following setting is default (last parts are omitted). +Nth element is used as the argument when N universal prefix +arguments (``C-u``) are given.:: + + (setq jedi:goto-definition-config + '((nil nil nil) ; C-. + (t nil nil) ; C-u C-. + (nil definition nil) ; C-u C-u C-. + (t definition nil) ; C-u C-u C-u C-. + ...)) + +For example, if you want to follow \"substitution path\" by default, +use the setting like this:: + + (setq jedi:goto-definition-config + '((nil definition nil) + (t definition nil) + (nil nil nil) + (t nil nil) + (nil definition t ) + (t definition t ) + (nil nil t ) + (t nil t ))) + +You can rearrange the order to have most useful sets of arguments +at the top." + :group 'jedi) + +(defcustom jedi:doc-mode 'rst-mode + "Major mode to use when showing document." + :group 'jedi) + +(defcustom jedi:doc-hook '(view-mode) + "The hook that's run after showing a document." + :type 'hook + :group 'jedi) + +(defcustom jedi:doc-display-buffer 'display-buffer + "A function to be called with a buffer to show document." + :group 'jedi) + +(defcustom jedi:install-imenu nil + "[EXPERIMENTAL] If `t', use Jedi to create `imenu' index. +To use this feature, you need to install the developmental +version (\"dev\" branch) of Jedi." + :group 'jedi) + +(defcustom jedi:imenu-create-index-function 'jedi:create-nested-imenu-index + "`imenu-create-index-function' for Jedi.el. +It must be a function that takes no argument and return an object +described in `imenu--index-alist'. +This can be set to `jedi:create-flat-imenu-index'. +Default is `jedi:create-nested-imenu-index'." + :group 'jedi) + +(defcustom jedi:setup-keys nil + "Setup recommended keybinds. + +.. admonition:: Default keybinds + + ```` : = `jedi:key-complete' + Complete code at point. (`jedi:complete') + + ``C-.`` : = `jedi:key-goto-definition' + Goto the definition of the object at point. (`jedi:goto-definition') + + ``C-c d`` : = `jedi:key-show-doc' + Goto the definition of the object at point. (`jedi:show-doc') + + ``C-c r`` : = `jedi:key-related-names' + Find related names of the object at point. + (`helm-jedi-related-names' / `anything-jedi-related-names') + +When `jedi:setup-keys' is non-`nil', recommended keybinds are set +in `jedi-mode-map' when **loading** jedi.el. Therefore, you must +set this value before jedi.el is loaded. As recommended usage of +jedi.el is to call `jedi:setup' via `python-mode-hook' where +`jedi:setup' is autloaded, setting `jedi:setup-keys' to `t' in +you emacs setup (e.g., ``.emacs.d/init.el``) works fine.:: + + (setq jedi:setup-keys t) + (add-hook 'python-mode-hook 'jedi:setup) + +If you want to require jedi.el explicitly when loading Emacs, +make sure to set `jedi:setup-keys' before loading jedi.el:: + + (setq jedi:setup-keys t) + (require 'jedi) + +Byte compiler warns about unbound variable if you set +`jedi:setup-keys' before loading jedi.el. The proper way to +suppress this warning is the following:: + + (eval-when-compile (require 'jedi nil t)) + (setq jedi:setup-keys t) + +You can change these keybinds by changing `jedi:key-complete', +`jedi:key-goto-definition', `jedi:key-show-doc', and +`jedi:key-related-names'. For example, default keybind for +ropemacs's `rope-show-doc' is same as `jedi:show-doc'. You can +avoid collision by something like this:: + + (setq jedi:key-show-doc (kbd \"C-c D\"))" + :group 'jedi) + +(defcustom jedi:key-complete (kbd "") + "Keybind for command `jedi:complete'." + :group 'jedi) + +(defcustom jedi:key-goto-definition (kbd "C-.") + "Keybind for command `jedi:goto-definition'." + :group 'jedi) + +(defcustom jedi:key-show-doc (kbd "C-c d") + "Keybind for command `jedi:show-doc'." + :group 'jedi) + +(defcustom jedi:key-related-names (kbd "C-c r") + "Keybind for command `helm-jedi-related-names' or +`anything-jedi-related-names'." + :group 'jedi) + +(defcustom jedi:key-goto-definition-pop-marker (kbd "C-,") + "Keybind for command `jedi:goto-definition-pop-marker'." + :group 'jedi) + +(defcustom jedi:import-python-el-settings t + "Automatically import setting from python.el variables." + :group 'jedi) + +(defcustom jedi:goto-definition-marker-ring-length 16 + "Length of marker ring to store `jedi:goto-definition' call positions" + :group 'jedi) + + +;;; Internal variables + +(defvar jedi:get-in-function-call--d nil + "Bounded to deferred object while requesting get-in-function-call.") + +(defvar jedi:defined-names--singleton-d nil + "Bounded to deferred object while requesting defined_names.") + + +;;; Jedi mode + +(defvar jedi-mode-map (make-sparse-keymap)) + +(defun jedi:handle-post-command () + (jedi:get-in-function-call-when-idle)) + +(define-minor-mode jedi-mode + "Jedi mode. +When `jedi-mode' is on, call signature is automatically shown as +toolitp when inside of function call. + +\\{jedi-mode-map}" + :keymap jedi-mode-map + :group 'jedi + (let ((map jedi-mode-map)) + (if jedi:complete-on-dot + (define-key map "." 'jedi:dot-complete) + (define-key map "." nil))) + (if jedi-mode + (progn + (when jedi:install-imenu + (add-hook 'after-change-functions 'jedi:after-change-handler nil t) + (jedi:defined-names-deferred) + (setq imenu-create-index-function jedi:imenu-create-index-function)) + (add-hook 'post-command-hook 'jedi:handle-post-command nil t) + (add-hook 'kill-buffer-hook 'jedi:server-pool--gc-when-idle nil t)) + (remove-hook 'post-command-hook 'jedi:handle-post-command t) + (remove-hook 'after-change-functions 'jedi:after-change-handler t) + (remove-hook 'kill-buffer-hook 'jedi:server-pool--gc-when-idle t) + (jedi:server-pool--gc-when-idle))) + +(when jedi:setup-keys + (let ((map jedi-mode-map)) + (define-key map jedi:key-complete 'jedi:complete) + (define-key map jedi:key-goto-definition 'jedi:goto-definition) + (define-key map jedi:key-show-doc 'jedi:show-doc) + (define-key map jedi:key-goto-definition-pop-marker + 'jedi:goto-definition-pop-marker) + (let ((command (cond + ((featurep 'helm) 'helm-jedi-related-names) + ((featurep 'anything) 'anything-jedi-related-names)))) + (when command + (define-key map jedi:key-related-names command))))) + + +;;; EPC utils + +(defun jedi:epc--live-p (mngr) + "Return non-nil when MNGR is an EPC manager object with a live +connection." + (let ((proc (ignore-errors + (epc:connection-process (epc:manager-connection mngr))))) + (and (processp proc) + ;; Same as `process-live-p' in Emacs >= 24: + (memq (process-status proc) '(run open listen connect stop))))) + +(defun jedi:epc--start-epc (server-prog server-args) + "Same as `epc:start-epc', but set query-on-exit flag for +associated processes to nil." + (let ((mngr (epc:start-epc server-prog server-args))) + (set-process-query-on-exit-flag (epc:connection-process + (epc:manager-connection mngr)) + nil) + (set-process-query-on-exit-flag (epc:manager-server-process mngr) nil) + mngr)) + + +;;; Server pool + +(defvar jedi:server-pool--table (make-hash-table :test 'equal) + "A hash table that holds a pool of EPC server instances.") + +(defun jedi:server-pool--start (command) + "Get an EPC server instance from server pool by COMMAND as a +key, or start new one if there is none." + (let ((cached (gethash command jedi:server-pool--table))) + (if (and cached (jedi:epc--live-p cached)) + cached + (let* ((default-directory jedi:source-dir) + (mngr (jedi:epc--start-epc (car command) (cdr command)))) + (puthash command mngr jedi:server-pool--table) + (jedi:server-pool--gc-when-idle) + mngr)))) + +(defun jedi:-get-servers-in-use () + "Return a list of non-nil `jedi:epc' in all buffers." + (loop with mngr-list + for buffer in (buffer-list) + for mngr = (with-current-buffer buffer jedi:epc) + when (and mngr (not (memq mngr mngr-list))) + collect mngr into mngr-list + finally return mngr-list)) + +(defvar jedi:server-pool--gc-timer nil) + +(defun jedi:server-pool--gc () + "Stop unused servers." + (let ((servers-in-use (jedi:-get-servers-in-use))) + (maphash + (lambda (key mngr) + (unless (memq mngr servers-in-use) + (remhash key jedi:server-pool--table) + (epc:stop-epc mngr))) + jedi:server-pool--table)) + ;; Clear timer so that GC is started next time + ;; `jedi:server-pool--gc-when-idle' is called. + (setq jedi:server-pool--gc-timer nil)) + +(defun jedi:server-pool--gc-when-idle () + "Run `jedi:server-pool--gc' when idle." + (unless jedi:server-pool--gc-timer + (setq jedi:server-pool--gc-timer + (run-with-idle-timer 10 nil 'jedi:server-pool--gc)))) + + +;;; Server management + +(defun jedi:start-server () + (if (jedi:epc--live-p jedi:epc) + (message "Jedi server is already started!") + (setq jedi:epc (jedi:server-pool--start + (append jedi:server-command jedi:server-args)))) + jedi:epc) + +(defun jedi:stop-server () + "Stop Jedi server. Use this command when you want to restart +Jedi server (e.g., when you changed `jedi:server-command' or +`jedi:server-args'). Jedi srever will be restarted automatically +later when it is needed." + (interactive) + (if jedi:epc + (epc:stop-epc jedi:epc) + (message "Jedi server is already killed.")) + (setq jedi:epc nil) + ;; It could be non-nil due to some error. Rescue it in that case. + (setq jedi:get-in-function-call--d nil) + (setq jedi:defined-names--singleton-d nil)) + +(defun jedi:get-epc () + (if (jedi:epc--live-p jedi:epc) + jedi:epc + (jedi:start-server))) + +;;;###autoload +(defun jedi:start-dedicated-server (command) + "Start Jedi server dedicated to this buffer. +This is useful, for example, when you want to use different +`sys.path' for some buffer. When invoked as an interactive +command, it asks you how to start the Jedi server. You can edit +the command in minibuffer to specify the way Jedi server run. + +If you want to setup how Jedi server is started programmatically +per-buffer/per-project basis, make `jedi:server-command' and +`jedi:server-args' buffer local and set it in `python-mode-hook'. +See also: `jedi:server-args'." + (interactive + (list (split-string-and-unquote + (read-string "Run Jedi server: " + (mapconcat + #'identity + (append jedi:server-command + jedi:server-args) + " "))))) + ;; Reset `jedi:epc' so that a new server is created when COMMAND is + ;; new. If it is already in the server pool, the server instance + ;; already in the pool is picked up by `jedi:start-server'. + (setq jedi:epc nil) + ;; Set `jedi:server-command', so that this command is used + ;; when restarting EPC server of this buffer. + (set (make-local-variable 'jedi:server-command) command) + (set (make-local-variable 'jedi:server-args) nil) + (jedi:start-server)) + +(defun jedi:-buffer-file-name () + "Return `buffer-file-name' without text properties. +See: https://github.com/tkf/emacs-jedi/issues/54" + (when (stringp buffer-file-name) + (substring-no-properties buffer-file-name))) + +(defun jedi:call-deferred (method-name) + "Call ``Script(...).METHOD-NAME`` and return a deferred object." + (let ((source (buffer-substring-no-properties (point-min) (point-max))) + (line (count-lines (point-min) (min (1+ (point)) (point-max)))) + (column (current-column)) + (source-path (jedi:-buffer-file-name))) + (epc:call-deferred (jedi:get-epc) + method-name + (list source line column source-path)))) + + +;;; Completion + +(defvar jedi:complete-reply nil + "Last reply to `jedi:complete-request'.") + +(defvar jedi:complete-request-point 0 + ;; It is passed to `=', so do not initialize this value by `nil'. + "The point where `jedi:complete-request' is called.") + +(defun jedi:complete-request () + "Request ``Script(...).complete`` and return a deferred object. +`jedi:complete-reply' is set to the reply sent from the server." + (setq jedi:complete-request-point (point)) + (deferred:nextc (jedi:call-deferred 'complete) + (lambda (reply) + (setq jedi:complete-reply reply)))) + +;;;###autoload +(defun* jedi:complete (&key (expand ac-expand-on-auto-complete)) + "Complete code at point." + (interactive) + (lexical-let ((expand expand)) + (deferred:nextc (jedi:complete-request) + (lambda () + (let ((ac-expand-on-auto-complete expand)) + (ac-start)))))) +;; Calling `auto-complete' or `ac-update-greedy' instead of `ac-start' +;; here did not work. + +(defun jedi:dot-complete () + "Insert dot and complete code at point." + (interactive) + (insert ".") + (unless (ac-cursor-on-diable-face-p) + (jedi:complete :expand nil))) + + +;;; AC source + +(defun jedi:ac-direct-matches () + (mapcar + (lambda (x) + (destructuring-bind (&key word doc description symbol) + x + (popup-make-item word + :symbol symbol + :document (unless (equal doc "") doc) + :summary description))) + jedi:complete-reply)) + +(defun jedi:ac-direct-prefix () + (or (ac-prefix-default) + (when (= jedi:complete-request-point (point)) + jedi:complete-request-point))) + +;; (makunbound 'ac-source-jedi-direct) +(ac-define-source jedi-direct + '((candidates . jedi:ac-direct-matches) + (prefix . jedi:ac-direct-prefix) + (init . jedi:complete-request) + (requires . -1))) + +;;;###autoload +(defun jedi:ac-setup () + "Add Jedi AC sources to `ac-sources'." + (interactive) + (add-to-list 'ac-sources 'ac-source-jedi-direct)) + + +;;; Call signature (get_in_function_call) + +(defface jedi:highlight-function-argument + '((t (:inherit bold))) + "Face used for the argument at point in a function's argument list" + :group 'jedi) + +(defun* jedi:get-in-function-call--construct-call-signature + (&key params index call_name) + (let ((current-arg (nth index params))) + (when (and current-arg (null jedi:tooltip-method)) + (setf (nth index params) + (propertize current-arg 'face 'jedi:highlight-function-argument))) + (concat call_name "(" (mapconcat #'identity params ", ") ")"))) + +(defun jedi:get-in-function-call--tooltip-show (args) + (when (and args (not ac-completing)) + (jedi:tooltip-show + (apply #'jedi:get-in-function-call--construct-call-signature args)))) + +(defun jedi:get-in-function-call () + "Manually show call signature tooltip." + (interactive) + (deferred:nextc + (jedi:call-deferred 'get_in_function_call) + #'jedi:get-in-function-call--tooltip-show)) + +(defun jedi:get-in-function-call-when-idle () + "Show tooltip when Emacs is ilde." + (unless jedi:get-in-function-call--d + (setq jedi:get-in-function-call--d + (deferred:try + (deferred:$ + (deferred:wait-idle jedi:get-in-function-call-delay) + (deferred:nextc it + (lambda () + (when jedi-mode ; cursor may be moved + (deferred:timeout + jedi:get-in-function-call-timeout + nil + (jedi:call-deferred 'get_in_function_call))))) + (deferred:nextc it #'jedi:get-in-function-call--tooltip-show)) + :finally + (lambda () + (setq jedi:get-in-function-call--d nil)))))) + +(defun jedi:tooltip-show (string) + (cond + ((and (memq 'pos-tip jedi:tooltip-method) window-system + (featurep 'pos-tip)) + (pos-tip-show (jedi:string-fill-paragraph string) + 'popup-tip-face nil nil 0)) + ((and (memq 'popup jedi:tooltip-method) + (featurep 'popup)) + (popup-tip string)) + (t (when (stringp string) + (let ((message-log-max nil)) + (message string)))))) + +(defun jedi:string-fill-paragraph (string &optional justify) + (with-temp-buffer + (erase-buffer) + (insert string) + (goto-char (point-min)) + (fill-paragraph justify) + (buffer-string))) + + +;;; Goto + +(defvar jedi:goto-definition--index nil) +(defvar jedi:goto-definition--cache nil) +(defvar jedi:goto-definition--marker-ring + (make-ring jedi:goto-definition-marker-ring-length) + "Marker ring that stores `jedi:goto-definition' call positions") + +(defun jedi:goto-definition (&optional other-window deftype use-cache index) + "Goto the definition of the object at point. + +See `jedi:goto-definition-config' for how this function works +when universal prefix arguments \(``C-u``) are given. If +*numeric* prefix argument(s) \(e.g., ``M-0``) are given, goto +point of the INDEX-th result. Note that you cannot mix universal +and numeric prefixes. It is Emacs's limitation. If you mix both +kinds of prefix, you get numeric prefix. + +When used as a lisp function, popup a buffer when OTHER-WINDOW is +non-nil. DEFTYPE must be either `assignment' (default) or +`definition'. When USE-CACHE is non-nil, use the locations of +the last invocation of this command. If INDEX is specified, goto +INDEX-th result." + (interactive + (if (integerp current-prefix-arg) + (list nil nil nil current-prefix-arg) + (nth (let ((i (car current-prefix-arg))) + (if i (floor (log i 4)) 0)) + jedi:goto-definition-config))) + (cond + ((and (or use-cache index) + jedi:goto-definition--cache) + (setq jedi:goto-definition--index (or index 0)) + (jedi:goto-definition--nth other-window)) + ((and (eq last-command 'jedi:goto-definition) + (> (length jedi:goto-definition--cache) 1)) + (jedi:goto-definition-next other-window)) + (t + (setq jedi:goto-definition--index (or index 0)) + (lexical-let ((other-window other-window)) + (deferred:nextc (jedi:call-deferred + (case deftype + ((assignment nil) 'goto) + (definition 'get_definition) + (t (error "Unsupported deftype: %s" deftype)))) + (lambda (reply) + (jedi:goto-definition--callback reply other-window))))))) + +(defun jedi:goto-definition-push-marker () + "Push point onto goto-definition marker ring." + (ring-insert jedi:goto-definition--marker-ring (point-marker))) + +(defun jedi:goto-definition-pop-marker () + "Goto the last point where `jedi:goto-definition' was called." + (interactive) + (if (ring-empty-p jedi:goto-definition--marker-ring) + (error "Jedi marker ring is empty, can't pop") + (let ((marker (ring-remove jedi:goto-definition--marker-ring 0))) + (switch-to-buffer (or (marker-buffer marker) + (error "Buffer has been deleted"))) + (goto-char (marker-position marker)) + ;; Cleanup the marker so as to avoid them piling up. + (set-marker marker nil nil)))) + +(defun jedi:goto-definition-next (&optional other-window) + "Goto the next cached definition. See: `jedi:goto-definition'." + (interactive "P") + (let ((len (length jedi:goto-definition--cache)) + (n (1+ jedi:goto-definition--index))) + (setq jedi:goto-definition--index (if (>= n len) 0 n)) + (jedi:goto-definition--nth other-window))) + +(defun jedi:goto-definition--callback (reply other-window) + (if (not reply) + (message "Definition not found.") + (setq jedi:goto-definition--cache reply) + (jedi:goto-definition--nth other-window t))) + +(defun jedi:goto--line-column (line column) + "Like `goto-char' but specify the position by LINE and COLUMN." + (goto-char (point-min)) + (forward-line (1- line)) + (forward-char column)) + +(defun jedi:goto-definition--nth (other-window &optional try-next) + (let* ((len (length jedi:goto-definition--cache)) + (n jedi:goto-definition--index) + (next (lambda () + (when (< n (1- len)) + (incf jedi:goto-definition--index) + (jedi:goto-definition--nth other-window) + t)))) + (destructuring-bind (&key line_nr column module_path module_name + &allow-other-keys) + (nth n jedi:goto-definition--cache) + (cond + ((equal module_name "__builtin__") + (unless (and try-next (funcall next)) + (message "Cannot see the definition of __builtin__."))) + ((not (and module_path (file-exists-p module_path))) + (unless (and try-next (funcall next)) + (message "File '%s' does not exist." module_path))) + (t + (jedi:goto-definition-push-marker) + (funcall (if other-window #'find-file-other-window #'find-file) + module_path) + (jedi:goto--line-column line_nr column) + (jedi:goto-definition--notify-alternatives len n)))))) + +(defun jedi:goto-definition--notify-alternatives (len n) + (unless (= len 1) + (message + "%d-th point in %d candidates.%s" + (1+ n) + len + ;; Note: It must be `last-command', not `last-command' because + ;; this function is called in deferred at the first time. + (if (eq last-command 'jedi:goto-definition) + (format " Type %s to go to the next point." + (key-description + (car (where-is-internal 'jedi:goto-definition)))) + "")))) + + +;;; Full name + +(defun jedi:get-full-name-deferred () + (deferred:$ + (jedi:call-deferred 'get_definition) + (deferred:nextc it + (lambda (reply) + (loop for def in reply + do (destructuring-bind (&key full_name &allow-other-keys) + def + (when full_name + (return full_name)))))))) + +(defun* jedi:get-full-name-sync (&key (timeout 500)) + (epc:sync + (jedi:get-epc) + (deferred:timeout timeout nil (jedi:get-full-name-deferred)))) + + +;;; Related names + +(defun jedi:related-names--source (name candidates) + `((name . ,name) + (candidates . ,candidates) + (recenter) + (type . file-line))) + +(defun jedi:related-names--to-file-line (reply) + (mapcar + (lambda (x) + (destructuring-bind + (&key line_nr column module_name module_path description) + x + (format "%s:%s: %s - %s" module_path line_nr + module_name description))) + reply)) + +(defun jedi:related-names--helm (helm) + (lexical-let ((helm helm)) + (deferred:nextc + (let ((to-file-line #'jedi:related-names--to-file-line)) + (deferred:parallel + (deferred:nextc (jedi:call-deferred 'related_names) to-file-line) + (deferred:nextc (jedi:call-deferred 'goto) to-file-line))) + (lambda (candidates-list) + (funcall + helm + :sources (list (jedi:related-names--source "Jedi Related Names" + (car candidates-list)) + (jedi:related-names--source "Jedi Goto" + (cadr candidates-list))) + :buffer (format "*%s jedi:related-names*" helm)))))) + +;;;###autoload +(defun helm-jedi-related-names () + "Find related names of the object at point using `helm' interface." + (interactive) + (jedi:related-names--helm 'helm)) + +;;;###autoload +(defun anything-jedi-related-names () + "Find related names of the object at point using `anything' interface." + (interactive) + (jedi:related-names--helm 'anything)) + + +;;; Show document (get-definition) + +(defvar jedi:doc-buffer-name "*jedi:doc*") + +(defun jedi:show-doc () + "Show the documentation of the object at point." + (interactive) + (deferred:nextc (jedi:call-deferred 'get_definition) + (lambda (reply) + (with-current-buffer (get-buffer-create jedi:doc-buffer-name) + (loop with has-doc = nil + with first = t + with inhibit-read-only = t + initially (erase-buffer) + for def in reply + do (destructuring-bind + (&key doc desc_with_module line_nr module_path + &allow-other-keys) + def + (unless (or (null doc) (equal doc "")) + (if first + (setq first nil) + (insert "\n\n---\n\n")) + (insert "Docstring for " desc_with_module "\n\n" doc) + (setq has-doc t))) + finally do + (if (not has-doc) + (message "Document not found.") + (progn + (goto-char (point-min)) + (when (fboundp jedi:doc-mode) + (funcall jedi:doc-mode)) + (run-hooks 'jedi:doc-hook) + (funcall jedi:doc-display-buffer (current-buffer))))))))) + + +;;; Defined names (imenu) + +(defvar jedi:defined-names--cache nil) +(make-variable-buffer-local 'jedi:defined-names--cache) + +(defun jedi:defined-names-deferred () + (deferred:nextc + (epc:call-deferred + (jedi:get-epc) + 'defined_names + (list (buffer-substring-no-properties (point-min) (point-max)) + (jedi:-buffer-file-name))) + (lambda (reply) + (setq jedi:defined-names--cache reply)))) + +(defun jedi:defined-names--singleton-deferred () + "Like `jedi:defined-names-deferred', but make sure that only +one request at the time is emitted." + (unless jedi:defined-names--singleton-d + (setq jedi:defined-names--singleton-d + (deferred:watch (jedi:defined-names-deferred) + (lambda (_) (setq jedi:defined-names--singleton-d nil)))))) + +(defun jedi:defined-names--sync () + (unless jedi:defined-names--cache + (epc:sync (jedi:get-epc) (jedi:defined-names--singleton-deferred))) + jedi:defined-names--cache) + +(defun jedi:after-change-handler (&rest _) + (unless (or (ac-menu-live-p) (ac-inline-live-p)) + (jedi:defined-names--singleton-deferred))) + +(defun jedi:imenu-make-marker (def) + (destructuring-bind (&key line_nr column &allow-other-keys) def + (save-excursion (jedi:goto--line-column line_nr column) + (point-marker)))) + +(defun jedi:create-nested-imenu-index--item (def) + (cons (plist-get def :name) (jedi:imenu-make-marker def))) + +(defun jedi:create-nested-imenu-index () + "`imenu-create-index-function' for Jedi.el. +See also `jedi:imenu-create-index-function'." + (when (called-interactively-p 'interactive) (jedi:defined-names--sync)) + (jedi:create-nested-imenu-index-1)) + +(defun jedi:create-nested-imenu-index-1 (&optional items) + (loop for (def . subdefs) in (or items jedi:defined-names--cache) + if subdefs + collect (append + (list (plist-get def :local_name) + (jedi:create-nested-imenu-index--item def)) + (jedi:create-nested-imenu-index-1 subdefs)) + else + collect (jedi:create-nested-imenu-index--item def))) + +(defun jedi:create-flat-imenu-index () + "`imenu-create-index-function' for Jedi.el to create flatten index. +See also `jedi:imenu-create-index-function'." + (when (called-interactively-p 'interactive) (jedi:defined-names--sync)) + (jedi:create-flat-imenu-index-1)) + +(defun jedi:create-flat-imenu-index-1 (&optional items) + (loop for (def . subdefs) in (or items jedi:defined-names--cache) + collect (cons (plist-get def :local_name) (jedi:imenu-make-marker def)) + when subdefs + append (jedi:create-flat-imenu-index-1 subdefs))) + + +;;; Meta info + +(defun jedi:get-jedi-version-request () + "Request version of Python modules and return a deferred object." + (epc:call-deferred (jedi:get-epc) 'get_jedi_version nil)) + +(defun jedi:show-jedi-version () + (interactive) + (deferred:nextc (jedi:get-jedi-version-request) + (lambda (reply) + (let ((standard-output (get-buffer-create "*jedi:version*"))) + (with-current-buffer standard-output + (emacs-lisp-mode) + (erase-buffer) + (pp reply) + (display-buffer standard-output)))))) + +(defun jedi:print-jedi-version () + (pp (epc:sync (jedi:get-epc) (jedi:get-jedi-version-request)))) + + +;;; Setup + +(defun jedi:import-python-el-settings-setup () + "Make jedi aware of python.el virtualenv and path settings. +This is automatically added to the `jedi-mode-hook' when +`jedi:import-python-el-settings' is non-nil." + (let ((args)) + (when (bound-and-true-p python-shell-extra-pythonpaths) + (mapc + (lambda (path) + (setq args (append (list "--sys-path" path) args))) + python-shell-extra-pythonpaths)) + (when (bound-and-true-p python-shell-virtualenv-path) + (setq args + (append + (list "--virtual-env" python-shell-virtualenv-path) + args))) + (when args + (set (make-local-variable 'jedi:server-args) + (append args jedi:server-args))))) + +;;;###autoload +(defun jedi:setup () + "Fully setup jedi.el for current buffer. +It setups `ac-sources' (calls `jedi:ac-setup') and turns +`jedi-mode' on. + +This function is intended to be called from `python-mode-hook', +like this:: + + (add-hook 'python-mode-hook 'jedi:setup) + +You can also call this function as a command, to quickly test +what jedi can do." + (interactive) + (jedi:ac-setup) + (when jedi:import-python-el-settings + ;; Hack to access buffer/dir-local vars: http://bit.ly/Y5IfMV. + ;; Given that `jedi:setup' is added to the `python-mode-hook' + ;; this will modify `hack-local-variables-hook' on python + ;; buffers only and will allow us to access buffer/directory + ;; local variables in `jedi:import-python-el-settings-setup'. + (add-hook 'hack-local-variables-hook + #'jedi:import-python-el-settings-setup nil t)) + (jedi-mode 1)) + + +;;; Debugging + + +(defvar jedi:server-command--backup nil) +(defvar jedi:server-args--backup nil) + +(defun jedi:toggle-debug-server () + "Setup `jedi:server-command' and `jedi:server-args' to debug +server using pdb or ipdb. + +When this command is called, it essentially execute the following +code:: + + (jedi:stop-server) + (setq jedi:server-command (list \"cat\" \"jedi-port.log\" ) + jedi:server-args nil) + +It means to pass the port number recorded in the file +jedi-port.log to EPC client. + +To start Jedi server in terminal and record port to the file, +use the following command:: + + python jediepcserver.py --port-file jedi-port.log --pdb + +This command will be copied in the kill-ring (clipboard) when +this command is called. You can use `--ipdb` instead of `--pdb` +to use ipdb instead of pdb. + +Calling this command again restores the original setting of +`jedi:server-command' and `jedi:server-args' then stops the +running server." + (interactive) + (if jedi:server-command--backup + (progn + (setq jedi:server-command jedi:server-command--backup + jedi:server-command--backup nil + jedi:server-args jedi:server-args--backup) + (jedi:stop-server) + (message "Quit debugging. Original setting restored.")) + (setq jedi:server-command--backup jedi:server-command + jedi:server-args--backup jedi:server-args + jedi:server-command (list "cat" (expand-file-name + "jedi-port.log" jedi:source-dir)) + jedi:server-args nil) + (jedi:stop-server) + (kill-new "python jediepcserver.py --port-file jedi-port.log --ipdb") + (message "Now, start server with: --port-file jedi-port.log --ipdb.\ + (command is copied in the kill-ring)"))) + + +(provide 'jedi) + +;; Local Variables: +;; coding: utf-8 +;; indent-tabs-mode: nil +;; End: + +;;; jedi.el ends here diff --git a/elpa/jedi-0.1.2/jedi.elc b/elpa/jedi-0.1.2/jedi.elc new file mode 100644 index 0000000000000000000000000000000000000000..d189a5b6b4c3e049cf11ad4a30cd5e4f591d112d GIT binary patch literal 36095 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 + +This file is NOT part of GNU Emacs. + +Jedi EPC server 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. + +Jedi EPC server 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 Jedi EPC server. +If not, see . + +""" + +import os +import sys +import re +import itertools +import logging +import site + +jedi = None # I will load it later + + +PY3 = (sys.version_info[0] >= 3) +NEED_ENCODE = not PY3 + + +def jedi_script(source, line, column, source_path): + if NEED_ENCODE: + source = source.encode('utf-8') + source_path = source_path and source_path.encode('utf-8') + return jedi.Script(source, line, column, source_path or '') + + +def candidate_symbol(comp): + """ + Return a character representing completion type. + + :type comp: jedi.api.Completion + :arg comp: A completion object returned by `jedi.Script.complete`. + + """ + try: + return comp.type[0].lower() + except (AttributeError, TypeError): + return '?' + + +def candidates_description(comp): + """ + Return `comp.description` in an appropriate format. + + * Avoid return a string 'None'. + * Strip off all newlines. This is required for using + `comp.description` as candidate summary. + + """ + desc = comp.description + return _WHITESPACES_RE.sub(' ', desc) if desc and desc != 'None' else '' +_WHITESPACES_RE = re.compile(r'\s+') + + +def complete(*args): + reply = [] + for comp in jedi_script(*args).complete(): + reply.append(dict( + word=comp.word, + doc=comp.doc, + description=candidates_description(comp), + symbol=candidate_symbol(comp), + )) + return reply + + +def get_in_function_call(*args): + call_def = jedi_script(*args).get_in_function_call() + if call_def: + return dict( + # p.get_code(False) should do the job. But jedi-vim use replace. + # So follow what jedi-vim does... + params=[p.get_code().replace('\n', '') for p in call_def.params], + index=call_def.index, + call_name=call_def.call_name, + ) + else: + return [] # nil + + +def _goto(method, *args): + """ + Helper function for `goto` and `related_names`. + + :arg method: `jedi.Script.goto` or `jedi.Script.related_names` + :arg args: Arguments to `jedi_script` + + """ + # `definitions` is a list. Each element is an instances of + # `jedi.api_classes.BaseOutput` subclass, i.e., + # `jedi.api_classes.RelatedName` or `jedi.api_classes.Definition`. + definitions = method(jedi_script(*args)) + return [dict( + column=d.column, + line_nr=d.line_nr, + module_path=d.module_path if d.module_path != '__builtin__' else [], + module_name=d.module_name, + description=d.description, + ) for d in definitions] + + +def goto(*args): + return _goto(jedi.Script.goto, *args) + + +def related_names(*args): + return _goto(jedi.Script.related_names, *args) + + +def definition_to_dict(d): + return dict( + doc=d.doc, + description=d.description, + desc_with_module=d.desc_with_module, + line_nr=d.line_nr, + column=d.column, + module_path=d.module_path, + name=getattr(d, 'name', []), + full_name=getattr(d, 'full_name', []), + type=getattr(d, 'type', []), + ) + + +def get_definition(*args): + definitions = jedi_script(*args).get_definition() + return list(map(definition_to_dict, definitions)) + + +def get_names_recursively(definition, parent=None): + """ + Fetch interesting defined names in sub-scopes under `definition`. + + :type names: jedi.api_classes.Definition + + """ + d = definition_to_dict(definition) + try: + d['local_name'] = parent['local_name'] + '.' + d['name'] + except (AttributeError, TypeError): + d['local_name'] = d['name'] + if definition.type == 'class': + ds = definition.defined_names() + return [d] + [get_names_recursively(c, d) for c in ds] + else: + return [d] + + +def defined_names(*args): + return list(map(get_names_recursively, jedi.api.defined_names(*args))) + + +def get_module_version(module): + try: + from pkg_resources import get_distribution, DistributionNotFound + try: + return get_distribution(module.__name__).version + except DistributionNotFound: + pass + except ImportError: + pass + + notfound = object() + for key in ['__version__', 'version']: + version = getattr(module, key, notfound) + if version is not notfound: + return version + + +def get_jedi_version(): + import epc + import sexpdata + return [dict( + name=module.__name__, + file=getattr(module, '__file__', []), + version=get_module_version(module) or [], + ) for module in [sys, jedi, epc, sexpdata]] + + +def jedi_epc_server(address='localhost', port=0, port_file=sys.stdout, + sys_path=[], virtual_env=[], + debugger=None, log=None, log_level=None): + add_virtualenv_path() + for p in virtual_env: + add_virtualenv_path(p) + sys_path = map(os.path.expandvars, map(os.path.expanduser, sys_path)) + sys.path = [''] + list(filter(None, itertools.chain(sys_path, sys.path))) + # Workaround Jedi's module cache. Use this workaround until Jedi + # got an API to set module paths. + # See also: https://github.com/davidhalter/jedi/issues/36 + import_jedi() + import epc.server + server = epc.server.EPCServer((address, port)) + server.register_function(complete) + server.register_function(get_in_function_call) + server.register_function(goto) + server.register_function(related_names) + server.register_function(get_definition) + server.register_function(defined_names) + server.register_function(get_jedi_version) + + port_file.write(str(server.server_address[1])) # needed for Emacs client + port_file.write("\n") + port_file.flush() + if port_file is not sys.stdout: + port_file.close() + + if log: + server.log_traceback = True + handler = logging.FileHandler(filename=log, mode='w') + if log_level: + log_level = getattr(logging, log_level.upper()) + handler.setLevel(log_level) + server.logger.setLevel(log_level) + server.logger.addHandler(handler) + if debugger: + server.set_debugger(debugger) + handler = logging.StreamHandler() + handler.setLevel(logging.DEBUG) + server.logger.addHandler(handler) + server.logger.setLevel(logging.DEBUG) + + server.serve_forever() + server.logger.info('exit') + return server + + +def import_jedi(): + global jedi + import jedi + import jedi.parsing + import jedi.evaluate + import jedi.api + return jedi + + +def add_virtualenv_path(venv=os.getenv('VIRTUAL_ENV')): + """Add virtualenv's site-packages to `sys.path`.""" + if not venv: + return + venv = os.path.abspath(venv) + path = os.path.join( + venv, 'lib', 'python%d.%d' % sys.version_info[:2], 'site-packages') + sys.path.insert(0, path) + site.addsitedir(path) + + +def main(args=None): + import argparse + parser = argparse.ArgumentParser( + formatter_class=argparse.RawTextHelpFormatter, + description=__doc__) + parser.add_argument( + '--address', default='localhost') + parser.add_argument( + '--port', default=0, type=int) + parser.add_argument( + '--port-file', '-f', default='-', type=argparse.FileType('wt'), + help='file to write port on. default is stdout.') + parser.add_argument( + '--sys-path', '-p', default=[], action='append', + help='paths to be inserted at the top of `sys.path`.') + parser.add_argument( + '--virtual-env', '-v', default=[], action='append', + help='paths to be used as if VIRTUAL_ENV is set to it.') + parser.add_argument( + '--log', help='save server log to this file.') + parser.add_argument( + '--log-level', + choices=['CRITICAL', 'ERROR', 'WARN', 'INFO', 'DEBUG'], + help='logging level for log file.') + parser.add_argument( + '--pdb', dest='debugger', const='pdb', action='store_const', + help='start pdb when error occurs.') + parser.add_argument( + '--ipdb', dest='debugger', const='ipdb', action='store_const', + help='start ipdb when error occurs.') + ns = parser.parse_args(args) + jedi_epc_server(**vars(ns)) + + +if __name__ == '__main__': + main() diff --git a/elpa/jedi-0.1.2/setup.py b/elpa/jedi-0.1.2/setup.py new file mode 100644 index 000000000..7dec1de2b --- /dev/null +++ b/elpa/jedi-0.1.2/setup.py @@ -0,0 +1,3 @@ +# Dummy setup.py to run tox +from distutils.core import setup +setup(name='jediepcserver') diff --git a/elpa/jedi-readme.txt b/elpa/jedi-readme.txt new file mode 100644 index 000000000..e69de29bb diff --git a/elpa/python-mode-6.1.3/INSTALL b/elpa/python-mode-6.1.3/INSTALL new file mode 100644 index 000000000..375bd860c --- /dev/null +++ b/elpa/python-mode-6.1.3/INSTALL @@ -0,0 +1,24 @@ +Put the respective lines into your Emacs initialisation file: + +(add-to-list 'load-path "PATH/TO/PYTHON-MODE/") +(setq py-install-directory "PATH/TO/PYTHON-MODE/") +(require 'python-mode) + +To change the Python default shell use + +M-x customize-variable py-shell-name + +or write + +(setq py-shell-name "MY-PYTHON") +resp. +(setq py-shell-name "PATH/TO/MY-PYTHON") + +IPython users for example may insert "ipython" with +M-x customize-variable py-shell-name + +or in init-file + +(setq py-shell-name "ipython") +resp. +(setq py-shell-name "PATH/TO/ipython") diff --git a/elpa/python-mode-6.1.3/LICENSE b/elpa/python-mode-6.1.3/LICENSE new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/elpa/python-mode-6.1.3/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/elpa/python-mode-6.1.3/NEWS b/elpa/python-mode-6.1.3/NEWS new file mode 100644 index 000000000..540d1d424 --- /dev/null +++ b/elpa/python-mode-6.1.3/NEWS @@ -0,0 +1,915 @@ +Python Mode News +================ + +New in version 6.1.3 +--------------------- + +PEP8 indent-alternatives when closing a list implemented + +Boolean `py-close-at-start-column-p', default is nil + +my_list = [ + 1, 2, 3, + 4, 5, 6, + ] +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', + ) + +When non-nil, it will be lined up under the first character of the line that starts the multi-line construct, as in: + +my_list = [ + 1, 2, 3, + 4, 5, 6, +] + +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', +) + +- Keys C-M-a, C-M-e usable for all top-level form, lp:1191078 + + Boolean `py-defun-use-top-level-p' + If non-nil, beginning- end-of-defun forms will use + `py-beginning-of-top-level', `py-end-of-top-level', + mark-defun marks top-level form at point etc. + +Keys C-M-a, C-M-e usable for all top-level form, lp:1191078 + +- New commands: + py-beginning-of-block-current-column + "Reach the beginning of block which starts at current column " + + py-beginning-of-top-level + py-beginning-of-top-level + py-end-of-top-level + py-mark-top-level + py-copy-top-level + py-delete-top-level + py-kill-top-level + py-execute-top-level + py-top-level-form-p + py-comment-top-level + py-beginning-of-top-level-p + +- `minor-block' commands added + A minor block is started by a `for', `if', `try' or `with', + while block covers also `def' or `class' + +- variable `py-keep-windows-configuration', default is nil + Setting `py-keep-windows-configuration' to `t' will + restore windows-configuration regardless of + `py-switch-buffers-on-execute-p' and + `py-split-windows-on-execute-p' settings. However, if + an error occurs, it's displayed. + + To suppres window-changes due to error-signaling + also, set `py-keep-windows-configuration' onto 'force + +- boolean empty-line-closes-p, default is nil + When non-nil, dedent after empty line following block + If non-nil, a C-j from empty line would dedent. + + if True: + print("Part of the if-statement") + + print("Not part of the if-statement") + +- boolean py-debug-p, default is nil + When non-nil, keep resp. store information useful for + debugging. Temporary files are not deleted. Other + functions might implement some logging etc. + +- heuristic exit + new var `py-max-specpdl-size', default is `max-specpdl-size' + py-end-of-statement will error if number of + `py-max-specpdl-size' loops is completed, thus avoiding + a hang from a possibly eternal loop. + +- `py-statement' no longer refferred to `py-copy-statement' + Same with block, def, expression etc. `py-statement' made + own command, which returns statement, a string. + +- boolean `py-max-help-buffer-p', default is nil + If "*Python-Help*"-buffer be the only visible. + +New in version 6.1.2 +--------------------- +- simplified menu + +- `py-execute-...'-commands return result as string + Controlled by boolean `py-store-result-p', Default is nil + When non-nil, put resulting string of `py-execute-...' into kill-ring, so it might be yanked. + +- commands deleting all commented lines: + `py-delete-comments-in-def-or-class' + `py-delete-comments-in-class' + `py-delete-comments-in-block' + `py-delete-comments-in-region' + +- boolean `py-indent-paren-spanned-multilines-p, default is nil + If non-nil, indents elements of list a value of `py-indent-offset' to first element: + def foo(): + if (foo && + baz): + bar() + + Default lines up with first element: + + def foo(): + if (foo && + baz): + bar() + +- `py-output-buffer' made customizable + See boolean `py-enforce-output-buffer-p' + +- exceptions following executed regions made point to source + +- command `py-empty-out-list-backward' + Deletes all elements from list before point + With when cursor after + mystring[0:1] + -------------^ + ==> + mystring[] + ---------^ + In result cursor is insided emptied delimited form." + +- `py-minor-expression' reconsidered, numeric args dropped + grasps keyword-arguments + +- boolean `py-electric-kill-backward-p', default is nil. + If behind a delimited form of braces, brackets or parentheses, + `py-electric-backspace' runs `py-empty-out-list-backward' + +- py-flake8-run, flake8 API + +- customizable `py-backslashed-lines-indent-offset' + +- boolean `py-pylint-offer-current-p' + If current buffers file should be offered for check. + Otherwise `py-pylint-run' looks up filename from history + +- boolean `py-prompt-on-changed-p' + When called interactively, ask for save before a + changed buffer is sent to interpreter. + +- customizable `py-closing-list-space' + Number of chars, closing parentesis outdent from opening + +- customizable `py-uncomment-indents-p' + When non-nil, after uncomment indent lines. + +- boolean `py-load-skeletons-p' + If skeleton definitions should be loaded + +- boolean `py-if-name-main-permission-p' + Allows execution of code inside blocks started by + if __name__== '__main__' + +- boolean `py-highlight-error-source-p', default is nil + When py-execute-... commands raise an error, respective code in source-buffer will be highlighted. + +- `py-remove-overlays-at-point', command + Remove overlays as set when `py-highlight-error-source-p' is non-nil. + +- `py-which-def-or-class', command, now used `which-function-mode' + +- unused variable `py-backspace-function' removed + +- Bundled third-party-stuff removed as reported conflicting at emacs-mirror, lp:1153998 + affects autopair.el, smart-operator.el + Kept menu switches resp. commands will issue a warning + +- dropped `py-paragraph-fill-docstring-p'; just `fill-paragraph' should DTRT + +- `py-set-pager-cat-p', default is nil + If non-nil, $PAGER is set to 'cat' + +- in directory doc customizable variables are listed: + variables-python-mode.org, variables-python-mode.rst + +New in version 6.1.1 +--------------------- + +- comment-related commands: + py-uncomment + py-comment-block, py-comment-clause, + py-comment-block-or-clause, py-comment-def, + py-comment-class, py-comment-def-or-class, + py-comment-statement + +- boolean `py-set-fill-column-p' + If `t', enables use Python specific `fill-column' according to + `py-docstring-fill-column', default is 72 + and `py-comment-fill-column, default is 79 + +- boolean `py-tab-shifts-region-p' + when `t', TAB will indent/cycle the region, not just the current line. + +- boolean `py-tab-indents-region-p' + when `t', when first TAB doesn't shift, `indent-region' is called + +- command from RET customizable via `py-return-key': + `py-newline-and-indent', `newline' or `py-newline-and-dedent' + +- boolean `py-use-font-lock-doc-face-p', default is nil + If non-nil, documention strings get `font-lock-doc-face' + +- boolean `py-newline-delete-trailing-whitespace-p' + Delete trailing whitespace maybe left by `py-newline-and-indent' + +- `py-electric-comment-p' new default nil + +- py-up minor API change + If inside a delimited form --string or list-- go to it's beginning + If not at beginning of a statement or block, go to it's beginning + If at beginning of a statement or block, go to beginning one level above of c + +- py-down minor API change: + Go to beginning of one level below of compound statement or definition at point. + If no statement or block below, but a delimited form --string or list-- go to it's beginning. + Repeated call from there will behave like down-list. + +- commands make underscore syntax changes easier: + toggle-py-underscore-word-syntax-p + py-underscore-word-syntax-p-on + py-underscore-word-syntax-p-off + +- py-update-imports removed + Do not maintain a static variable containing needed imports + Determine imports on the fly rather, as it might have changed + +- variable `py-fill-docstring-style' renamed `py-docstring-style' + +New in version 6.1.0 +--------------------- + +- py-up + Go to beginning one level above of compound statement or definition at point. +- py-down + Go to beginning one level below of compound statement or definition at point. + +- Customizable output directory + After checking for a remote shell, the following variables are consulted: + + py-use-current-dir-when-execute-p, default t + When `t', current directory is used by Python-shell for output of `py-execute-buffer' and related commands + + py-fileless-buffer-use-default-directory-p, default t + When `py-use-current-dir-when-execute-p' is non-nil and no buffer-file exists, value of `default-directory' sets current working directory of Python output shell" + + py-keep-shell-dir-when-execute-p, default nil + Don't change Python shell's current working directory when sending code. + + `py-execute-directory', default nil + + If nothing was set so far, $VIRTUAL_ENV and $HOME are queried. + +- Set of commands calling Python3.3 + +- fill docstrings according to style, commands + py-fill-string-django + py-fill-string-onetwo + py-fill-string-pep-257 + py-fill-string-pep-257-nn + py-fill-string-symmetric + + Customizable variable `py-fill-docstring-style' provides default value + used by `py-fill-string', `py-fill-paragraph' + + DJANGO: + + \"\"\" + Process foo, return bar. + \"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + + ONETWO: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + + PEP-257: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + + PEP-257-NN: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + + SYMMETRIC: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\"" + + Built upon code seen at python.el, thanks Fabian + +- `py-down-statement', `py-up-statement' + +- toggle-py-split-windows-on-execute-p +- py-split-windows-on-execute-p-off +- py-split-windows-on-execute-p-on + +- toggle-py-switch-buffers-on-execute-p +- py-switch-buffers-on-execute-p-on +- py-switch-buffers-on-execute-p-off + +- `py-shell-switch-buffers-on-execute-p' renamed `py-switch-buffers-on-execute-p' + +New in version 6.0.12 +--------------------- + +- py-sexp-function, + When set, it's value is called instead of `forward-sexp', `backward-sexp + Choices are py-partial-expression, py-expression, default nil + +- `py-partial-expression' reconsidered. + Beside common moves like `defun', `statement' specific Python-mode edits are delivered: + + `py-expression' and `py-partial-expression'. + + Statement below is considered composed of two `py-expression' + + a = ['spam', 'eggs', 100, 1234] + |_| |_________________________| + + Assigment operator and all inside comments is ignored. + + `py-partial-expression' would match six sections + + a = ['spam', 'eggs', 100, 1234] + |_| |_____| |____| |__| |__| + |_________________________| + + When traversing code, `py-partial-expression' climbs down and up + all levels encountered, i.e. at opening `[' `py-expression' would return ['spam', 'eggs', 100, 1234], while one char behind at `'' + it yields `'spam',' + +- `py-find-definition' also detects non-imported definition in current buffer + +- Choice between `py-imenu-create-index-new' and series 5. + py-imenu-create-index-function made easier. + Customizable variable `py-imenu-create-index-function' provided, see also + command in PyTools + +- New commands addressing BOL as start/end: + py-beginning-of-block-bol + py-end-of-block-bol + py-mark-block-bol + py-copy-block-bol + py-kill-block-bol + py-delete-block-bol + py-end-of-clause-bol + etc. + +- While commands "py-beginning..." resp. "py-end..." compute the context, + selecting the corresponding beginning or end, + new "py-up...", "py-down..." jump regexp-based to the + next element in buffer. + See also menu PyEdit. + +New in version 6.0.11 +--------------------- + +- improved Pymacs based code completion: + - Completion of symbols from imported modules, functions, classes, + module/class-level data members and instance variables in the current + buffer. The information for this completion is updated whenever the file + is saved. + - Completion of local variables and function parameters. + - Type deduction from constructor calls and literals. + - Show help for modules, classes and functions. + - Go to definition of modules, classes and functions. + - Show signature of functions. + - Support for auto-complete and company. + +- remote shell support + +- extended version of smart-operator added + original smart-operator.el authored by + William Xu + Url: http://xwl.appspot.com/ref/smart-operator.el + +- py-electric-colon extended + if `py-electric-colon-newline-and-indent-p' is non-nil, + `py-electric-colon' calls `newline-and-indent' + +- boolean `py-no-completion-calls-dabbrev-expand-p' + If completion function should call dabbrev-expand + when no completion found. Default is `t' + +- boolean `py-shell-prompt-read-only', default t + sets `comint-prompt-read-only', avoid unintentional edits + +- customizable history variables/files + py-python-history defaults to "~/.python_history" + py-ipython-history defaults to "~/.ipython/history" + + If py-honor-PYTHONHISTORY-p is `t', $PYTHONHISTORY takes precedence, default is nil + If py-honor-IPYTHONDIR-p is `t', $IPYTHONHISTORY precedes, default is nil + +- customizable boolean `py-trailing-whitespace-smart-delete-p' + Default is nil. Some commands may delete trailing + whitespaces by the way. When editing other peoples + code, this may produce a larger diff than expected + +New in version 6.0.10 +-------------------- + +addresses bugs and speed issues + +New in version 6.0.9 +-------------------- + +- autopair-mode delivered + Credits to Joao Tavora http://autopair.googlecode.com + see README-AUTOPAIR.org for details + +- Syntax highlighting in Python-shell buffers enabled + boolean `py-fontify-shell-buffer-p', default is nil + +- py-add-abbrev, new command + 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. + +- py-edit-abbrevs + Jumps to `python-mode-abbrev-table' + +- modeline enhanced + when a path/to/my/favoured/Python is given with `py-shell-name' + the Python-shell buffer before would display + + *ND path/to/my/favoured/Python* + + now: + + *ptmfP Python* + + boolean `py-modeline-display-full-path-p' + boolean `py-modeline-acronym-display-home-p' + If the modeline acronym should contain chars indicating the home-directory. + +- mode-line indicates "Py" by default + customize `python-mode-modeline-display' + +- Pymacs intergration dropped from trunk + conflicts with classic install being reported + +New in version 6.0.8 + +-------------------- + +- `py-pep8-run', new command checking formatting + `py-pep8-help' + +- `py-pyflake-run', new command + 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. + `py-pyflake-help' + +- `py-pylint-run', new command calls Pylint, + a Python source code analyzer which looks for + programming errors, helps enforcing a coding standard + and sniffs for some code smells (as defined in Martin + Fowler's Refactoring book) . + + 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. + `py-pylint-doku', `py-pylint-help' + +- py-pyflakespep8-run, combines calls to pyflakes and pep8 + +- respective flymake-modes, + `pyflakespep8-flymake-mode', `pylint-flymake-mode' + etc. See meny PyTools + +New in version 6.0.7 +-------------------- + +- make every Python shell acces its own history-file + .python3_history + .python_history + .ipython_history etc. + +- related to shell used + `toggle-force-py-shell-name-p' + `force-py-shell-name-p-on'/off + + making it easier to enforce default py-shell upon execution + + `toggle-force-local-shell' + `py-force-local-shell-on'/off + + If locally indicated Python shell should be taken and + enforced upon sessions execute commands, lp:988091 + +- specific completion: + py-python2-shell-complete, py-python3-shell-complete, + py-python2-script-complete, py-python3-script-complete + +New in version 6.0.6 +-------------------- + +- files inside a virtual machine made visible for pdbtrack + +- new commands `py-toggle-split-windows-on-execute', ...-on, ...-off + `py-toggle-shell-switch-buffers-on-execute', ...-on, ...-off + allow `py-execute-buffer' etc. to split/not-split windows, + move cursor onto output or not + +- Behavior of C-u M-x `py-shell' closer to common shell + + C-u 4 prompts for a buffer, + i.e. when a "*Python*" shell is running, + C-u M-x `py-shell' opens a "*Python<2>*" per default + C-u 2 M-x py-shell promts for command-arguments as known from 5th-series + +- `py-intend-tabs-mode' sets default of `indent-tabs-mode', lp:953765 + +-- New boolean variable `py-intend-tabs-mode' + Permits value independent from Emacs-wide `indent-tabs-mode' + Commands `py-toggle-indent-tabs-mode', ...-on, ...-off + menu PyTools "Toggle indent-tabs-mode" + +- Extended py-execute-... forms provided for "line" + +- new commands py-beginning/end-of-line + while introduced for internal reasons --because of it's + return values-- they allow repeats, i.e. when already + at end-of-line, jumping to next end etc. + +- new boolean `py-force-py-shell-name-p' + When `t', execution with Python specified in `py-shell-name' is en forced, shebang will have no effect. Default is nil. + +- customizable `py-separator-char', a string, see report lp:975539 + Precedes guessing when not empty, is returned by + function `py-separator-char' + +- nicer `org-cycle' behavior: when new `py-org-cycle-p' it `t', + command `org-cycle' is available at shift-TAB, + +New in version 6.0.5 +-------------------- + +- Menu reworked and extended + +- extended commands combine executing statement/block... with dedidi cated/switch... etc. This may remove some need of customization. + +- local environments support started + If calls to common `py-shell' should use local executable + instead of default system Python set + `py-use-local-default' alongside with + `py-shell-local-path' + +- `py-toggle-shells' alias of more powerful `py-switch-shells' + 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. + +- `py-shell-name' accepts PATH/TO/EXECUTABLE + in addition to name of an installed default Python-Shell. + Permits installing commands like + (defun python-XYZ-shell (&optional argprompt) + "Start an Python-XYZ interpreter ... " + (interactive) + (let ((py-shell-name "PATH/TO/PYTHON-XYZ")) + (py-shell argprompt))) + +- new commands `indent-tabs-mode', `toggle-indent-tabs-mode', + `indent-tabs-mode-on', `indent-tabs-mode-off' + + feature after a request at Stack Exchange asked Jul + 13 '11 at 13:23 saying + `tab-width' now follows `py-indent-offset' + +- new command `py-execute-region-default' forces the + systems default Python interpreter to execute, ignores + shebang + + related functions redesigned, `async' argument dropped + `py-execute-region' now reads: + + (defun py-execute-region (start end &optional shell dedicated) + "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. " + [ ... ] + +- new `py-number-face', + visible only when customized and `py-use-number-face-p' is `t', + inherits default face + With large files fontifying numbers may cause a delay + Credits to github.com/fgallina/python.el/issues42 + +- new boolean `py-verbose-p' + if `t', reached indent level etc. is messaged + +- new commands py-execute-buffer-dedicated, py-execute-buffer-switch -dedicated + +- `toggle-py-smart-indentation' new command + also `py-smart-indentation-on', -off + +New in version 6.0.4 +-------------------- + +- Python shell starts with `python-mode' + that's needed by completion for now + boolean customizable `py-start-run-py-shell' + +- outline-(minor-)mode enabled providing regular + expressions. Customize `py-outline-minor-mode-p' to + switch it on with python-mode + +- Hook delivered to start hs-minor-mode from python-mode + Customize `py-hide-show-minor-mode-p' + Key setting example: + (global-set-key [(super s)] 'hs-hide-all) + (global-set-key [(super S)] 'hs-show-all) + +- Listing of available commands in org-mode and reST + format in directory "doc" + +- Python shells and executing forms may be called as + dedicated process. See commands available \w suffix + "-dedicated". + +- completion fixed: M-TAB completes in Python buffer, TAB + completes in Python shells + +- py-down-FORM-lc commands + Goto beginning of line following end of FORM. + \"-lc\" stands for \"left-corner\" - a complementary command travelling left, whilst `py-end-of-FORM' stops at right corner. + Implemented forms are "block", "clause", "def", "class", "statement". + +- py-down-FORM commands + + like py-down-block introduced in version 6.0.3, + implemented also for "clause", "def", "class", + "statement". + Go to the beginning of next block below + current level. + +New in version 6.0.3 +-------------------- + +- ipython integration started + +- commands `ipython', `python2', `python3', `jython', `python' + opening a respective python shell + +- py-shift-block-left, py-shift-block-right etc. + Implemented forms that way are + "paragraph" "block" "clause" "def" "class" "line" "statement" + +- py-dedent + Dedent line according to `py-indent-offset'. With + arg, do it that many times. If point is between + indent levels, dedent to next level. Stops at BOL. + Returns column reached, if dedent done, nil otherwise. + +- py-indent-forward-line + Indent line and move one line forward. 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. Returns position. + +- py-close-block, -clause, -def, class + Set indent level to that of beginning of definition. + If final line isn't empty and + `py-close-block-provides-newline' non-nil, insert a + newline. Returns column. + +- new commands specifying the shell override + `py-shell-name' for execution + implemented shells are "python" "python2" "python2.7" + "python3" "python3.2" "jython" + + available with default, -switch and -no-switch + option, i.e. + py-execute-region-python3.2 + py-execute-region-python3.2-switch + py-execute-region-python3.2-no-switch etc. + + Docstring of py-execute-region-python3.2-switch for + example: "Send the region to a common shell calling the + python3.2 interpreter. Ignores setting of + `py-shell-switch-buffers-on-execute', output-buffer + will being switched to." + +- Declarations + Deal with assigments resp. statements in current + level which don't open blocks. Provides common edit + functions as copy, mark, kill, goto beg/end. + + Functions will be used typically to grasp + initialisations resp. assignements of variables + between the definition of a class or method and it's + body, likewise global stuff at the head of a file. + +- column-marker.el + Commands `column-marker-1', `column-marker-2', and + `column-marker-3' each highlight a given column + (using different background colors by default). + + M-x column-marker-1 highlights the column where the + cursor is, in face `column-marker-1'. + + C-u 70 M-x column-marker-2 highlights column 70 in + face `column-marker-2'. + + C-u 70 M-x column-marker-3 highlights column 70 in + face `column-marker-3'. The face `column-marker-2' + highlighting no longer shows. + + C-u M-x column-marker-3 turns off highlighting for + column-marker-3, so face `column-marker-2' + highlighting shows again for column 70. + + C-u C-u M-x column-marker-1 (or -2 or -3) erases all + column highlighting. + + ;; + + Thanks a lot to it's author Rick Bielawski , + to Drew Adams for his care and Emacs Wiki hosting it. + +New in version 6.0.2 +-------------------- + +- py-electric-comment + + "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-prefix-key C-u a \"#\" Electric behavior + is inhibited inside a string or comment." + +- New commands `py-partial-expression': + + "." operators delimit a partial-expression on it's + level. + + 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) + + which will mark, copy and return. + +- Commands implementing a behavior which customizing of + `py-shell-switch-buffers-on-execute' would do: + + py-execute-buffer-no-switch + py-execute-buffer-switch + py-execute-region-no-switch + py-execute-region-switch + +- Several bugfixes. + +New in version 6.0.1 +-------------------- + +- New commands py-expression: + + py-copy-expression + py-mark-expression + py-beginning-of-expression + py-end-of-expression + py-kill-expression + + Also several of bugfixes are done. + +New in version 6.0 +-------------------- + +- Finer grained commands, core re-write. + + As shown below for the `mark'-command, delete, + copy, jump to beginning and end of the respective + programming-expressions: + + py-mark-statement + py-mark-block + py-mark-block-or-clause + py-mark-def + py-mark-def-or-class + py-mark-class + py-mark-clause + +- Also a couple of bugfixes are done. + +New in version 5.2.1 +-------------------- + +- Syntax highlight as a keyword "lambda:" just like "lambda x:". Given by Dan + Davison. +- Add "python3" as a key for python-mode in interpreter-mode-alist and + auto-mode-alist. + +New in version 5.2.0 +-------------------- + +- Fixed filling of triple-quoted strings. + +- Add new font-lock faces for class names and exception names. + +- Do not fill when calling fill-paragraph with point in a region of code. + +- Fixed font-locking of exception names in parenthesized lists. + +- Fixed font-locking of decorators with arguments. + +- Fixed font-locking of triple-quoted strings; single quotes appearing in + triple-quoted strings no longer upset font-locking. + +- Fixed the stack-entry regexp used by pdbtrack so that it now works with + module-level frames. + +- Do not bind C-c C-h; `py-help-at-point' is now on C-c C-e by default. + +- hide-show mode is now supported. + +- When shifting regions right and left, keep the region active in Emacs. diff --git a/elpa/python-mode-6.1.3/PKG-INFO b/elpa/python-mode-6.1.3/PKG-INFO new file mode 100644 index 000000000..492231c7c --- /dev/null +++ b/elpa/python-mode-6.1.3/PKG-INFO @@ -0,0 +1,11 @@ +Metadata-Version: 1.1 +Name: python-mode.el +Version: 6.1.3 +Summary: Major mode for editing Python programs +Home-page: http://launchpad.net/python-mode +Author: Andreas Roehler +Author-email: andreas.roehler@online.de +License: GNU GPLv3, Python License +Download-URL: http://launchpad.net/python-mode/trunk/6.1.3/+download/python-mode.el-6.1.3.tar.gz +Description: UNKNOWN +Platform: UNKNOWN diff --git a/elpa/python-mode-6.1.3/README b/elpa/python-mode-6.1.3/README new file mode 100644 index 000000000..76e4af0dc --- /dev/null +++ b/elpa/python-mode-6.1.3/README @@ -0,0 +1,197 @@ +Put the following into your initialization file: + + (setq py-install-directory "PATH/TO/PYTHON-MODE/") + (add-to-list 'load-path py-install-directory) + (require 'python-mode) + + +Unless other libraries depend on python.el, unloading 'python is recommended, as it seems to destroy python-mode user defined abbreviations: + + (when (featurep 'python) (unload-feature 'python t)) + + + +;;;;;;;;; + +Customize default Python shell as `py-shell-name' + +`py-shell-name' might be an installed executable as +shell command `type' would display, but also a +PATH/TO/(I)PYTHON, of a virtualenv for example + +To change the Python default shell see also INSTALL + +Most python-mode.el commands start with prefix `py-' + +`M-x py- TAB' +displays a list of them in completion-buffer. +See also commands list delivered in directory doc. + +List virtualenv related `M-x virtualenv- TAB' +resp. Pymacs commands `M-x pymacs-' + +Commands related to a specific shell start with +it's name as `ipython-complete'. +Open an installed shell by + +M-x SHELL + +With prefix C-u user is prompted to specify a PATH-TO-LOCAL-SHELL +Also evaluating + +(py-shell nil DEDICATED PATH-TO-LOCAL-SHELL) + +if DEDICATED is set to `t', shell will get an unique name. + +Install a local shell by evaluating + +(defun MY-LOCAL-SHELL () + (interactive) + (py-shell nil DEDICATED PATH-TO-LOCAL-SHELL)) + +;;;;;;;;; + +When code is executed from current buffer, either + +- python-mode-v5-behavior, a quite simple and effective way. + Setting `python-mode-v5-behavior-p' to `t' makes it the default. + +- if a buffer-file exists and buffer is unchanged, it's file is executed as is. + +- in all other cases a temporary file is created. + Setback: in case of error, returned error code points + here, i.e. indicated error-line-numbers are not that of + orginal buffer. + +;;;;;;;;; +To enable code auto-completion: + + (setq py-load-pymacs-p t) + +To use auto-complete, just prepend the following lines: + + (require 'auto-complete-config) + (ac-config-default) + +or for company: + + (autoload 'company-mode "company" nil t) + +If you do not use one of those visual completion interfaces, key bindings exist: + - C-tab complete symbol + - f1 show help + - S-f1 show signature + - f2 go to + +If `py-complete-function' is set, it takes precedence + +;;;;;;;;; + +smart-operator minor mode + +for example with key "+" +inserts " + " + +smart-operator extended by augmented-assigments +C-u + +inserts " += " + +customizable boolean `py-smart-operator-mode-p' + +;;;;;;;;; + +Beside common moves like `defun', `statement' specific Python-mode edits are delivered: + +`py-expression' and `py-partial-expression'. + +Statement below is considered composed of two `py-expression' + +a = ['spam', 'eggs', 100, 1234] +|_| |_________________________| + +Assigment operator and all inside comments is ignored. + +`py-partial-expression' would match six sections + + a = ['spam', 'eggs', 100, 1234] +|_| |_____| |____| |__| |__| + |_________________________| + +When traversing code, `py-partial-expression' climbs down and up +all levels encountered, i.e. at opening `[' `py-expression' would return ['spam', 'eggs', 100, 1234], while one char behind at `'' +it yields `'spam',' + +- py-sexp-function, + When set, it's value is called instead of `forward-sexp', `backward-sexp + Choices are py-partial-expression, py-expression, default nil + +;;;;;;;;; + +Moving, copying, deleting + +When moving over or mark code, commands with suffix +"-bol" take the correspond beginning of line as start +resp. end. Commands without that suffix take the +indentation at the beginning resp. the last printable +character the end - see in menu PyEdit whats implemented. + +While commands "py-beginning..." resp. "py-end..." compute the context, +selecting the corresponding beginning or end +new "py-up...", "py-down..." jump regexp-based to the +next element in buffer. +Listed in PyMenu. + +;;;;;;;;; + +Customize boolean `py-set-fill-column-p' + +If `t', enables use Python specific `fill-column' according to + +`py-docstring-fill-column', default is 72 + +and `py-comment-fill-column, default is 79 + +Comment- and docstring settings might be disabled by +any non-integer value, which means: do not use a +different value of `fill-column' than emacs-wide + +;;;;;;;;; + +- customizable `py-output-buffer'. + + `py-execute-...'-commands arrive in buffer created by + `py-shell'. It's name is composed WRT to Python + version used, it's path etc. If boolean + `py-enforce-output-buffer-p' is non-nil, value of + `py-output-buffer' is taken instead. + +;;;;;;;;; + +Python and IPython + +Start IPython shell after loading python-mode via M-x +ipython, not from plain shell. + +Executing code through IPython should work as with +regular Python, also getting completions from. However, +with IPython, it feels a demi-second slower. Also when +starting a session, first completion might fail, while +succeeding afterwards. Any bug reports, which might +help truck down the issue, are highly appreciated. + +;;;;;;;;; + +Troubleshooting + +Start with Emacs -Q from the directory where python-mode.el lives. +Open python-mode.el and evaluate it. + +Open a file with ending ".py". + +M-x python RET + +a regular Python-shell should appear + +M-x IPython RET + +an IPython-shell should be opened diff --git a/elpa/python-mode-6.1.3/byte-compile-directory.sh b/elpa/python-mode-6.1.3/byte-compile-directory.sh new file mode 100644 index 000000000..2447de6a2 --- /dev/null +++ b/elpa/python-mode-6.1.3/byte-compile-directory.sh @@ -0,0 +1,40 @@ +#!/bin/bash + # -- byte-compile Emacs Lisp files delivered with python-mode.el + +# Author: Andreas Roehler + +# 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 . + +# Commentary: Edit the vars pointing to the directories/files +# holding your python-mode for test +# assumes python-mode files in or below current directory + +# Code: + + +# the path +PDIR=`pwd` + +# python-mode file to load +if [ -s "python-components-mode.el" ]; + then + PYTHONMODE='python-components-mode.el' + else + PYTHONMODE='python-mode.el' +fi + +EMACS=emacs +PYMACSDIR=Pymacs + +$EMACS -Q --batch --eval "(message (emacs-version))" --eval "(when (featurep 'python-mode)(unload-feature 'python-mode t))" --eval "(add-to-list 'load-path \"$PDIR/\")" --eval "(add-to-list 'load-path \"$PYMACSDIR/\")" -load "$PDIR/$PYTHONMODE" --eval '(byte-recompile-directory default-directory 1 t)' + + diff --git a/elpa/python-mode-6.1.3/completion/auto-complete-pycomplete.el b/elpa/python-mode-6.1.3/completion/auto-complete-pycomplete.el new file mode 100644 index 000000000..9b14bc009 --- /dev/null +++ b/elpa/python-mode-6.1.3/completion/auto-complete-pycomplete.el @@ -0,0 +1,47 @@ +;;; auto-complete-pycomplete.el --- an auto-complete source for pycomplete.el + +;; Copyright (C) 2012 Urs Fleisch + +;; Author: Urs Fleisch +;; Keywords: languages, processes, python, 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 . + +;;; Commentary: + +;; The ac-source can be enabled solely using +;; (setq ac-sources '(ac-source-pycomplete)) +;; or before the other sources using +;; (add-to-list 'ac-sources 'ac-source-pycomplete). + +;;; Code: + +(require 'pycomplete) +(require 'auto-complete) + +(defun ac-pycomplete-document (symbol) + (let* ((full-prefix (py-complete-enhanced-symbol-before-point)) + (full-symbol (concat (substring full-prefix 0 (- (length ac-prefix))) symbol))) + (py-complete-docstring-for-symbol full-symbol))) + +(defun ac-pycomplete-candidates () + (py-complete-completions-for-symbol + (py-complete-enhanced-symbol-before-point))) + +(ac-define-source pycomplete + '((candidates . ac-pycomplete-candidates) + (document . ac-pycomplete-document))) + +(provide 'auto-complete-pycomplete) +;;; auto-complete-pycomplete.el ends here diff --git a/elpa/python-mode-6.1.3/completion/company-pycomplete.el b/elpa/python-mode-6.1.3/completion/company-pycomplete.el new file mode 100644 index 000000000..802cfb413 --- /dev/null +++ b/elpa/python-mode-6.1.3/completion/company-pycomplete.el @@ -0,0 +1,74 @@ +;;; company-pycomplete.el --- a company-mode completion back-end for pycomplete.el + +;; Copyright (C) 2012 Urs Fleisch + +;; Author: Urs Fleisch +;; Keywords: languages, processes, python, 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 . + +;;; Commentary: + +;; The backend can be enabled using +;; (setq company-backends '((company-pycomplete))) + +;;; Code: + +(require 'pycomplete) +(require 'company) + +(defun company-pycomplete--grab-symbol () + ;; stolen from company-pysmell--grab-symbol + (let ((symbol (company-grab-symbol))) + (when symbol + (cons symbol + (save-excursion + (let ((pos (point))) + (goto-char (- (point) (length symbol))) + (while (eq (char-before) ?.) + (goto-char (1- (point))) + (skip-syntax-backward "w_")) + (- pos (point)))))))) + + +(defun company-pycomplete-doc-buffer (candidate) + "Return buffer with docstring of CANDIDATE if it is available." + (let* ((full-prefix (py-complete-enhanced-symbol-before-point)) + (full-symbol (concat full-prefix (company-strip-prefix candidate))) + (doc (py-complete-docstring-for-symbol full-symbol))) + (when (and (stringp doc) (> (length doc) 0)) + (with-current-buffer (company-doc-buffer) + (insert doc) + (current-buffer))))) + +(defun company-pycomplete-location (candidate) + "Return location of CANDIDATE in cons form (FILE . LINE) if it is available." + (let* ((full-prefix (py-complete-enhanced-symbol-before-point)) + (full-symbol (concat full-prefix (company-strip-prefix candidate)))) + (py-complete-location full-symbol))) + +(defun company-pycomplete (command &optional arg &rest ignored) + "A `company-mode' completion back-end for pycomplete." + (interactive (list 'interactive)) + (case command + ('interactive (company-begin-backend 'company-pycomplete)) + ('prefix (and (derived-mode-p 'python-mode) + (not (company-in-string-or-comment)) + (company-pycomplete--grab-symbol))) + ('candidates (py-complete-completions)) + ('doc-buffer (company-pycomplete-doc-buffer arg)) + ('location (company-pycomplete-location arg)))) + +(provide 'company-pycomplete) +;;; company-pycomplete.el ends here diff --git a/elpa/python-mode-6.1.3/completion/pycomplete.el b/elpa/python-mode-6.1.3/completion/pycomplete.el new file mode 100644 index 000000000..4acfc4d25 --- /dev/null +++ b/elpa/python-mode-6.1.3/completion/pycomplete.el @@ -0,0 +1,436 @@ +;;; Complete symbols at point using Pymacs. + +;; Copyright (C) 2007 Skip Montanaro + +;; Original Author: Skip Montanaro +;; Maintainer: Urs Fleisch +;; Created: Oct 2004 +;; Keywords: python pymacs emacs + +;; 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 . + +;;; Commentary: +;; Along with pycomplete.py this file allows programmers to complete Python +;; symbols within the current buffer. See pycomplete.py for the Python side +;; of things and a short description of what to expect. + +;; BAW 2012-09-28: pymacs may not be installed on Debian. +(condition-case nil + (require 'pymacs) + (file-error nil)) + +(eval-when-compile (require 'cl)) + +(pymacs-load "pycomplete") + +(defcustom py-complete-set-keymap-p nil + "If keys shall be defined when calling `py-complete-initialize'. +Default is nil. + +See also `py-complete-set-keymap'" + :type 'boolean + :group 'python-mode) + +(defvar py-complete-variable-index nil + "An alist with mappings of local variable names to types.") +(defvar py-complete-variable-index-position 0 + "The line-beginning-position when py-complete-variable-index was last updated. +This can be used to skip updating the index when still on the same line.") + +(defun py-complete-type-for-value (val) + "Return name of type for variable assignment value. +If the type cannot be deduced, nil is returned." + (let ((firstchar (string-to-char val)) + (case-fold-search nil)) + (cond + ((or (equal 0 firstchar) (string= val "None")) nil) + ((equal ?\[ firstchar) "list") + ((equal ?{ firstchar) "dict") + ((or (equal ?' firstchar) (equal ?\" firstchar)) "str") + ((string-match "^[rR]['\"]" val) "str") + ((string-match "^[uU][rR]?['\"]" val) "unicode") + ((or (string= val "True") (string= val "False")) "bool") + ((string-match "^[+\\-]?[0-9]+$" val) "int") + ((string-match "^[+\\-]?[0-9]+[lL]$" val) "long") + ((string-match "^[+\\-]?[0-9]+\\(?:\\.[0-9]+\\)?" val) "float") + ((string-match "^\\(\\(?:[[:word:]\\.]+\\.\\)?_?[A-Z][A-Za-z0-9]+\\)($" val) + (match-string-no-properties 1 val)) + ((string= "(" (substring-no-properties val -1)) + (concat "_PYCFRT(" (substring-no-properties val 0 -1) ")"))))) + +(defun py-complete-variables-in-def (&optional limit) + "Return an alist with mappings of local variable names to types. +Local variable assignments and parameters of the current function are +parsed. If limit is given, it limits the size of the returned alist." + (let ((pos (point)) + (i 0) + (beg 0) + candidates + (variable-assignment-re (concat "^[ \t]+\\(\\w+\\)[ \t]*\\(?:=\\|+=\\|*=\\|%=\\|&=\\|^=\\|<<=\\|-=\\|/=\\|**=\\||=\\|>>=\\|//=\\)[ \t]*\\([({[]\\|[rRuU]*['\"]\\|[+\\-]?[[:word:].]+(?\\)"))) + (save-excursion + ;; First get the current def and its parameters + (py-beginning-of-def) + (when (looking-at (concat py-def-re " *\\([^( ]+\\) *\\(([^:]+\\) *:")) + (setq beg (match-end 0)) + (let ((params (replace-regexp-in-string + "[ )]+$" "" + (replace-regexp-in-string + "^[ (]+" "" + (match-string-no-properties 3))))) + (dolist (param (split-string params "[ \t\r\n]*,[ \t\r\n]*")) + ;; Transform param into an assignment string + (setq param (concat " " param + (unless (memq ?= (string-to-list param)) + "=None"))) + (if (string-match variable-assignment-re param) + (push `(,(match-string-no-properties 1 param) . + ,(py-complete-type-for-value (match-string-no-properties 2 param))) + candidates))))) + ;; Search backward + (goto-char pos) + (while (and (or (not (integerp limit)) (< i limit)) + (re-search-backward variable-assignment-re nil t) + (> (point) beg)) + (let* ((candidate (match-string-no-properties 1)) + (entry (assoc candidate candidates))) + (cond ((null entry) + (push `(,(match-string-no-properties 1) . + ,(py-complete-type-for-value (match-string-no-properties 2))) + candidates) + (incf i)) + ((not (cdr entry)) + (setcdr entry (py-complete-type-for-value (match-string-no-properties 2))))))) + (nreverse candidates)))) + +(defun py-complete-update-variable-index (&optional limit) + "Update py-complete-variable-index from the local variables of the current +function. An update is only performed if point was on a different line for +the last update. If limit is given, it limits the size of the index." + (unless (local-variable-p 'py-complete-variable-index) + (make-local-variable 'py-complete-variable-index)) + (unless (local-variable-p 'py-complete-variable-index-position) + (make-local-variable 'py-complete-variable-index-position)) + (let ((linebeg (line-beginning-position))) + (unless (eq linebeg py-complete-variable-index-position) + (setq py-complete-variable-index (py-complete-variables-in-def limit)) + (setq py-complete-variable-index-position linebeg)))) + +(defun py-complete-variable-completions-for-symbol (sym) + "Get completions for local variables in current def. +If sym is an empty string, all local variables are returned, +else those starting with sym." + (when (and (stringp sym) (string-match "^\\w*$" sym)) + (py-complete-update-variable-index) + (let ((symlen (length sym))) + (if (zerop symlen) + (mapcar 'car py-complete-variable-index) + (remove-if-not + #'(lambda (s) (and (>= (length s) symlen) (string= sym (substring s 0 symlen)))) + (mapcar 'car py-complete-variable-index)))))) + +(defun py-complete-which-class () + "Return current class name based on point. +If no class name is found, return nil." + (interactive) + (let (classname) + (save-excursion + (save-restriction + (py-beginning-of-class) + (when (looking-at (concat py-class-re " *\\([^( ]+\\)")) + (setq classname (match-string-no-properties 2)) + (if (interactive-p) + (message "%s" classname))))) + classname)) + +(defun py-complete-type-before-dotexpr (&optional pos) + "Get type for expression before dot expression. +The character after pos (point if omitted) must be a dot. +Returns list, str or dict if such an expression is before +the dot, else nil." + (let ((dotchar (char-after pos))) + (if (and dotchar (char-equal ?. dotchar)) + (save-excursion + (if pos + (goto-char pos)) + (cond + ((looking-back "\\(\\[\\|,[^[]*\\)\\]") "list") + ((looking-back "['\"]") "str") + ((looking-back "}") "dict")))))) + +(defun py-complete-substitute-type-for-var (word) + "Substitute the type for the variable starting the dot-expression word. +Returns the word with replaced variable if known, else the unchanged word." + (let* (type + (firstsym (car (split-string word "\\."))) + (firstlen (length firstsym))) + (if (string= firstsym "self") + (setq type (py-complete-which-class)) + (py-complete-update-variable-index) + (setq type (cdr (assoc firstsym py-complete-variable-index)))) + (if (stringp type) + (concat type (substring word firstlen)) + word))) + +(defun py-complete-python-dotexpr-begin nil + (re-search-backward "[^a-zA-Z_0-9\\.]") + (forward-char)) + +(defun py-complete-python-dotexpr-end nil + (re-search-forward "[a-zA-Z_0-9\\.]*")) + +(put 'python-dotexpr 'beginning-op 'py-complete-python-dotexpr-begin) +(put 'python-dotexpr 'end-op 'py-complete-python-dotexpr-end) + +(defun py-complete-enhanced-dotexpr-at-point () + "Enhanced (thing-at-point 'python-dotexpr). +The returned word starts with a type if an expression is found before the dot +or if the dot-expression starts with a variable for which the type is known." + (require 'thingatpt) + (let ((bounds (bounds-of-thing-at-point 'python-dotexpr))) + (if bounds + (let* ((beg (car bounds)) + (end (cdr bounds)) + (word (buffer-substring-no-properties beg end)) + (prefix (py-complete-type-before-dotexpr beg))) + (if prefix + (concat prefix word) + (py-complete-substitute-type-for-var word)))))) + +(defun py-complete-enhanced-symbol-before-point () + "Return the dotted python symbol before point. +The returned word starts with a type if an expression is found before the dot +or if the dot-expression starts with a variable for which the type is known." + (let* (prefix + (word (buffer-substring-no-properties + (save-excursion + (skip-chars-backward "a-zA-Z0-9_.") + (setq prefix (py-complete-type-before-dotexpr)) + (point)) + (point)))) + (if prefix + (concat prefix word) + (py-complete-substitute-type-for-var word)))) + +;; Not used anymore +(defun py-find-global-imports () + "Find Python import statements in buffer." + (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)) + (setq imports nil) + (while (re-search-forward + "^\\(import \\|from \\([A-Za-z_\\.][A-Za-z_0-9\\.]*\\) import \\).*" + first-class-or-def t) + (setq imports (cons (buffer-substring-no-properties + (match-beginning 0) + (match-end 0)) + imports))) + (nreverse imports)))) + +(defun py-complete () + "Complete symbol before point using Pymacs. " + (interactive) + (setq py-completion-last-window-configuration + (current-window-configuration)) + (let ((symbol (py-complete-enhanced-symbol-before-point))) + (if (string= "" symbol) + (tab-to-tab-stop) + (let ((completions + (py-complete-completions-for-symbol symbol))) + (if completions + (let* (completion + (lastsym (car (last (split-string symbol "\\.")))) + (lastlen (length lastsym))) + (cond ((null (cdr completions)) + (setq completion (car completions))) + (t + (setq completion (try-completion lastsym completions)) + (message "Making completion list...") + (with-output-to-temp-buffer "*PythonCompletions*" + (display-completion-list completions)) + (message "Making completion list...%s" "done"))) + (when (and (stringp completion) + (> (length completion) lastlen)) + (insert (substring completion lastlen)))) + (message "Can't find completion for \"%s\"" symbol) + (ding)))))) + +(defun py-complete-completions-for-symbol (sym &optional imports) + "Get possible completions for symbol using statements given in imports." + (let ((pymacs-forget-mutability t)) + (append + (py-complete-variable-completions-for-symbol sym) + (pycomplete-pycompletions + sym (buffer-file-name) + imports)))) + +(defun py-complete-docstring-for-symbol (sym &optional imports) + "Get docstring for symbol using statements given in imports." + (let ((pymacs-forget-mutability t)) + (pycomplete-pydocstring + sym (buffer-file-name) + imports))) + +(defun py-complete-completions () + "Get possible completions for current statement." + (py-complete-completions-for-symbol + (py-complete-enhanced-symbol-before-point))) + +(defun py-complete-completion-at-point () + "Return a (start end collection) list, so that this function +can be used as a hook for completion-at-point-functions." + (setq py-completion-last-window-configuration + (current-window-configuration)) + (let ((symbol (py-complete-enhanced-symbol-before-point))) + (when (not (string= "" symbol)) + (let ((completions (py-complete-completions-for-symbol symbol))) + (when completions + (when (> (length completions) 1) + ;; this-command is changed to avoid the following situation: + ;; This function is invoked via indent-for-tab-command (because + ;; tab-always-indent is complete) and there is a "Complete, but + ;; not unique" case (e.g. "for" is completed and the next TAB key + ;; press shall display a list with "for", "format"). In such a + ;; case, py-indent-line would detect a repeated indentation + ;; request and thus change the indentation. The changed + ;; indentation would then prevent indent-for-tab-command + ;; from calling the completion function. + (setq this-command 'py-complete-completion-at-point)) + (list (- (point) (length (car (last (split-string symbol "\\."))))) + (point) + completions)))))) + +(defun py-complete-show (string) + (display-message-or-buffer string "*PythonHelp*")) + +(defun py-complete-help (string) + "get help on a python expression" + (interactive "sHelp: ") + (let* ((pymacs-forget-mutability t) + (help-string + (pycomplete-pyhelp string (buffer-file-name)))) + (if (and help-string (> (length help-string) 300)) + (with-output-to-temp-buffer "*Python Help*" + (princ help-string)) + (py-complete-show help-string)))) + +(defun py-complete-help-thing-at-point nil + (interactive) + (let ((sym (py-complete-enhanced-dotexpr-at-point))) + (if sym + (py-complete-help sym)))) + +(set 'py-complete-current-signature nil) + +(defun py-complete-signature (function) + "get signature of a python function or method" + (let ((pymacs-forget-mutability t)) + (set 'py-complete-current-signature + (pycomplete-pysignature function (buffer-file-name))))) + +(defun py-complete-signature-show nil + (let ((sym (py-complete-enhanced-dotexpr-at-point))) + (if sym + (progn + (py-complete-show (py-complete-signature sym)))))) + +(defun py-complete-signature-expr nil + (interactive) + (let ((dotexpr (read-string "signature on: " + (py-complete-enhanced-dotexpr-at-point)))) + (if dotexpr + (py-complete-show + (py-complete-signature dotexpr))))) + +(defun py-complete-electric-lparen nil + "electricly insert '(', and try to get a signature for the stuff to the left" + (interactive) + (py-complete-signature-show) + (self-insert-command 1)) + +(defun py-complete-electric-comma nil + "electricly insert ',', and redisplay latest signature" + (interactive) + (self-insert-command 1) + (if py-complete-current-signature + (py-complete-show (format "%s" py-complete-current-signature)))) + +(defun py-complete-location (sym) + "Get definition location of sym in cons form (FILE . LINE)." + (let ((location (pycomplete-pylocation sym (buffer-file-name)))) + (when (and location (vectorp location) (= (length location) 2)) + (cons (aref location 0) (aref location 1))))) + +(defun py-complete-goto-definition nil + "Got to definition of Python function." + (interactive) + (let ((sym (py-complete-enhanced-dotexpr-at-point))) + (if sym + (let ((location + (pycomplete-pylocation sym (buffer-file-name)))) + (if (and location (vectorp location) (= (length location) 2)) + (progn + (find-file (aref location 0)) + (goto-line (aref location 1))) + (message "Cannot find the definition!")))))) + +(defun py-complete-parse-source () + "Parse source code of Python file to get imports and completions." + (let ((errstr (pycomplete-pyparse (buffer-file-name) t))) + (if errstr + (message "%s" errstr)))) + +(defun py-complete-set-keymap () + "Define key map with pycomplete functions." + (interactive) + (define-key python-mode-map [C-tab] 'py-complete) + (define-key python-mode-map [f1] 'py-complete-help-thing-at-point) + (define-key python-mode-map "(" 'py-complete-electric-lparen) + (define-key python-mode-map "," 'py-complete-electric-comma) + (define-key python-mode-map [S-f1] 'py-complete-signature-expr) + (define-key python-mode-map [f2] 'py-complete-goto-definition) + (define-key python-mode-map [f3] 'py-complete-help)) + +(defun py-complete-initialize () + "Initialize pycomplete hooks. +Should be called from python-mode-hook. Keys are set when +`py-complete-set-keymap-p' is non-nil." + (interactive) + (when py-set-complete-keymap-p + (py-complete-set-keymap)) + (when py-complete-set-keymap-p + (py-complete-set-keymap)) + ;; Parse source file after it is saved + (add-hook 'after-save-hook 'py-complete-parse-source nil 'local) + ;; Set up auto-complete or company if enabled + (cond + ((fboundp 'auto-complete-mode) + (require 'auto-complete-pycomplete) + (setq ac-sources + (if (boundp 'py-complete-ac-sources) + py-complete-ac-sources + '(ac-source-pycomplete)))) + ((fboundp 'company-mode) + (company-mode t) + (require 'company-pycomplete) + (set (make-local-variable 'company-backends) + '((company-pycomplete)))) + ((or py-set-complete-keymap-p py-complete-set-keymap-p) + (set (make-local-variable 'tab-always-indent) 'complete) + (define-key python-mode-map [tab] 'indent-for-tab-command)))) + +(provide 'pycomplete) diff --git a/elpa/python-mode-6.1.3/completion/pycomplete.elc b/elpa/python-mode-6.1.3/completion/pycomplete.elc new file mode 100644 index 0000000000000000000000000000000000000000..e294cec69f52657f8375501171fe205f9f8a5e36 GIT binary patch literal 14647 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 literal 0 HcmV?d00001 diff --git a/elpa/python-mode-6.1.3/completion/pycomplete.py b/elpa/python-mode-6.1.3/completion/pycomplete.py new file mode 100644 index 000000000..a7a118bf1 --- /dev/null +++ b/elpa/python-mode-6.1.3/completion/pycomplete.py @@ -0,0 +1,776 @@ +""" +Python dot expression completion using Pymacs. + +This almost certainly needs work, but if you add + + (require 'pycomplete) + +to your init.el file and have Pymacs installed, when you hit M-TAB it will +try to complete the dot expression before point. For example, given this +import at the top of the file: + + import time + +typing "time.cl" then hitting M-TAB should complete "time.clock". + +This is unlikely to be done the way Emacs completion ought to be done, but +it's a start. Perhaps someone with more Emacs mojo can take this stuff and +do it right. + +See pycomplete.el for the Emacs Lisp side of things. + +Most of the public functions in this module have the signature + +(s, fname=None, imports=None) + +where s is the symbol to complete, fname is the file path and imports +the list of import statements to use. The fname parameter is used as a +key to cache the global and local context and the symbols imported or +evaluated so far. The cache for an fname is cleared when its imports +are changed. When not passing a list of imports (or None), the currently +used imports are preserved. The caching should make subsequent operations +(e.g. another completion or signature lookup after a completion) less +expensive. +""" + +# Original Author: Skip Montanaro +# Maintainer: Urs Fleisch +# Created: Oct 2004 +# Keywords: python pymacs emacs + +# This software is provided as-is, without express or implied warranty. +# Permission to use, copy, modify, distribute or sell this software, without +# fee, for any purpose and by any individual or organization, is hereby +# granted, provided that the above copyright notice and this paragraph +# appear in all copies. + +# Along with pycomplete.el this file allows programmers to complete Python +# symbols within the current buffer. + +import sys +import types +import inspect +import keyword +import os +import pydoc +import ast +import re + +if sys.version_info[0] >= 3: # Python 3 + import io +else: # Python 2 + import StringIO + +try: + x = set +except NameError: + from sets import Set as set +else: + del x + + +class _PyCompleteDocument(object): + """Completion data for Python source file.""" + + if sys.version_info[0] >= 3: # Python 3 + _helpout = io.StringIO + @staticmethod + def is_num_or_str(obj): + return isinstance(obj, (int, float, str)) + @staticmethod + def is_class_type(obj): + return type(obj) == type + @staticmethod + def get_unbound_function(unbound): + return unbound + @staticmethod + def get_method_function(meth): + return meth.__func__ + @staticmethod + def get_function_code(func): + return func.__code__ + @staticmethod + def update_with_builtins(keys): + import builtins + keys.update(dir(builtins)) + else: # Python 2 + _helpout = StringIO.StringIO + @staticmethod + def is_num_or_str(obj): + return isinstance(obj, (int, long, float, basestring)) + @staticmethod + def is_class_type(obj): + return type(obj) in (types.ClassType, types.TypeType) + @staticmethod + def get_unbound_function(unbound): + return unbound.im_func + @staticmethod + def get_method_function(meth): + return meth.im_func + @staticmethod + def get_function_code(func): + return func.func_code + @staticmethod + def update_with_builtins(keys): + import __builtin__ + keys.update(dir(__builtin__)) + + _sre_SRE_Pattern = type(re.compile('')) + _sre_SRE_Match = type(re.match('', '')) + + # Class name in CapCase, as suggested by PEP8 Python style guide + _class_name_re = re.compile(r'(?:^|\.)_?[A-Z][A-Za-z0-9]+$') + + _return_type_of_func = { + 'bin': 'str', + 'bytearray': 'bytearray', + 'bytes': 'bytes', + 'compile': 'types.CodeType', + 'complex': 'complex', + 'dict': 'dict', + 'frozenset': 'frozenset', + 'oct': 'str', + 'open': 'io.BufferedIOBase' if sys.version_info[0] >= 3 else 'file', + 'list': 'list', + 'repr': 'str', + 'set': 'set', + 'sorted': 'list', + 'str': 'str', + 'tuple': 'tuple', + 'vars': 'dict', + 're.compile': '_PyCompleteDocument._sre_SRE_Pattern', + 're.escape': 'str', + 're.findall': 'list', + 're.match': '_PyCompleteDocument._sre_SRE_Match', + 're.search': '_PyCompleteDocument._sre_SRE_Match', + 're.split': 'list', + 're.sub': 'str', + 're.subn': 'tuple', + 'datetime.datetime': 'datetime.datetime', + 'datetime.date': 'datetime.date', + 'datetime.time': 'datetime.time', + 'datetime.timedelta': 'datetime.timedelta', + 'sys.exc_info': 'tuple', + 'os.getcwd': 'str', + 'os.getenv': 'str', + 'os.urandom': 'bytes', + 'os.path.abspath': 'str', + 'os.path.basename': 'str', + 'os.path.commonprefix': 'str', + 'os.path.dirname': 'str', + 'os.path.expanduser': 'str', + 'os.path.expandvars': 'str', + 'os.path.join': 'str', + 'os.path.normcase': 'str', + 'os.path.normpath': 'str', + 'os.path.realpath': 'str', + 'os.path.relpath': 'str', + 'os.path.split': 'tuple', + 'os.path.splitdrive': 'tuple', + 'os.path.splitext': 'tuple', + 'collections.defaultdict': 'collections.defaultdict', + 'collections.deque': 'collections.deque', + 'collections.namedtuple': 'collections.namedtuple', + 'socket.socket': 'socket.socket', + 'csv.excel': 'csv.excel', + 'csv.excel_tab': 'csv.excel_tab' + } + + @staticmethod + def _get_type_for_function(funcname): + typename = _PyCompleteDocument._return_type_of_func.get(funcname) + if not typename and \ + _PyCompleteDocument._class_name_re.search(funcname): + typename = funcname + return typename + + @staticmethod + def _replace_pycfrt_with_typename(s): + """Replace _PYCFRT(..) expressions with function return type. + + The names of variables assigned from function calls can be replaced by + _PYCFRT(name.of.function). This function tries to replace such expressions + with the corresponding function return type (PYCFRT = pycomplete function + return type). If no such expression can be found, s is returned unchanged. + If the type cannot be deduced, None is returned, else the substituted + string.""" + pycfrt_re = re.compile(r'_PYCFRT\(([^()]+)\)') + return pycfrt_re.sub(lambda m: _PyCompleteDocument._get_type_for_function(m.group(1)), s) + + class ImportExtractor(ast.NodeVisitor): + """NodeVisitor to extract the top-level import statements from an AST. + + To generate code containing all imports in try-except statements, + call get_import_code(node), where node is a parsed AST. + """ + def visit_FunctionDef(self, node): + # Ignore imports inside functions or methods. + pass + + def visit_ClassDef(self, node): + # Ignore imports inside classes. + pass + + def generic_visit(self, node): + # Store import statement nodes. + if isinstance(node, (ast.Import, ast.ImportFrom)): + self._import_nodes.append(node) + ast.NodeVisitor.generic_visit(self, node) + + def get_import_code(self, node, fname=''): + """Get compiled code of all top-level import statements found in the + AST of node.""" + self._import_nodes = [] + self.visit(node) + body = [] + for imp_node in self._import_nodes: + if isinstance(imp_node, ast.ImportFrom) and \ + imp_node.module == '__future__': + # 'SyntaxError: from __future__ imports must occur at the + # beginning of the file' is raised if a 'from __future__ import' + # is wrapped in try-except, so use only the import statement. + body.append(imp_node) + else: + body.append(ast.TryExcept(body=[imp_node], handlers=[ + ast.ExceptHandler(type=None, name=None, body=[ast.Pass()])], + orelse=[])) + node = ast.Module(body=body) + ast.fix_missing_locations(node) + code = compile(node, fname, 'exec') + return code + + + class CodeRemover(ast.NodeTransformer): + """NodeTransformer which replaces function statements with 'pass' + and keeps only safe assignments, so that the resulting code can + be used for code completion. + + To reduce the code from the node of a parsed AST, call + get_transformed_code(node). + """ + def visit_FunctionDef(self, node): + # Replace all function statements except doc string by 'pass'. + if node.body: + if isinstance(node.body[0], ast.Expr) and \ + isinstance(node.body[0].value, ast.Str): + # Keep doc string. + first_stmt = node.body[1] if len(node.body) > 1 else node.body[0] + node.body = [node.body[0]] + else: + first_stmt = node.body[0] + node.body = [] + node.body.append(ast.copy_location(ast.Pass(), first_stmt)) + return node + return None + + def visit_Expr(self, node): + # Remove all expressions except strings to keep doc strings. + if isinstance(node.value, ast.Str): + return node + return None + + @staticmethod + def _get_type_node_for_function_node(node): + # Convert node to dot expression + attrs = [] + while isinstance(node, ast.Attribute): + attrs.insert(0, node.attr) + node = node.value + if isinstance(node, ast.Name): + attrs.insert(0, node.id) + funcname = '.'.join(attrs) + typename = _PyCompleteDocument._get_type_for_function(funcname) + if typename: + # Convert dot expression to node + attrs = typename.split('.') + node = None + if attrs: + node = ast.Name(id=attrs.pop(0), ctx=ast.Load()) + while attrs: + node = ast.Attribute(value=node, attr=attrs.pop(0), + ctx=ast.Load()) + return node + return None + + @staticmethod + def replace_unsafe_value(node, replace_self=None): + """Modify value from assignment if unsafe. + + If replace_self is given, only assignments starting with 'self.' are + processed, the assignment node is returned with 'self.' replaced by + the value of replace_self (typically the class name). + For other assignments, None is returned.""" + for i, target in enumerate(node.targets): + if not isinstance(target, (ast.Name, ast.Attribute)): + # Only process assignments to names and attributes, + # not tuples. + return None + if replace_self: + if isinstance(target, ast.Attribute) and \ + isinstance(target.value, ast.Name) and \ + target.value.id == 'self' and \ + isinstance(target.value.ctx, ast.Load): + node.targets[i].value.id = replace_self + if target.attr == '__name__': + node.value = ast.copy_location(ast.Str(s=''), + node.value) + elif target.attr in ('__dict__', '__class__', '__bases__', + '__doc__'): + return None + else: + return None + elif isinstance(target, ast.Name) and \ + isinstance(target.ctx, ast.Store): + if target.id == '__metaclass__': + # Do not modify __metaclass__ assignments + return node + elif target.id == '__slots__': + node.value = ast.copy_location( + ast.List(elts=[], ctx=ast.Load()), node.value) + if isinstance(node.value, (ast.Str, ast.Num)): + pass + elif isinstance(node.value, (ast.List, ast.Tuple)): + node.value.elts = [] + elif isinstance(node.value, ast.Dict): + node.value.keys = [] + node.value.values = [] + elif isinstance(node.value, ast.ListComp): + node.value = ast.copy_location(ast.List(elts=[], ctx=ast.Load()), node.value) + elif isinstance(node.value, ast.Call): + type_node = _PyCompleteDocument.CodeRemover._get_type_node_for_function_node(node.value.func) + if type_node: + # Wrap class lookup in try-except because it is not fail-safe. + node.value = ast.copy_location(type_node, node.value) + node = ast.copy_location(ast.TryExcept(body=[node], handlers=[ + ast.ExceptHandler(type=None, name=None, body=[ast.Pass()])], + orelse=[]), node) + ast.fix_missing_locations(node) + else: + node.value = ast.copy_location( + ast.Name(id='None', ctx=ast.Load()), node.value) + else: + node.value = ast.copy_location(ast.Name(id='None', ctx=ast.Load()), node.value) + return node + + def visit_Assign(self, node): + # Replace unsafe values of assignements by None. + return self.replace_unsafe_value(node) + + def visit_Name(self, node): + # Pass names for bases in ClassDef. + return node + + def visit_Attribute(self, node): + # Pass attributes for bases in ClassDef. + return node + + def visit_ClassDef(self, node): + # Visit nodes of class. + # Store instance member assignments to be added later to generated code. + self_assignments = {} + for child in ast.walk(node): + if isinstance(child, ast.Assign): + new_child = self.replace_unsafe_value(child, + replace_self=node.name) + if new_child: + new_var = child.targets[0].attr + old_assign = self_assignments.get(new_var) + if not old_assign or ( + isinstance(old_assign, ast.Assign) and + isinstance(old_assign.value, ast.Name) and + old_assign.value.id == 'None'): + self_assignments[new_var] = new_child + self._class_assignments.extend(list(self_assignments.values())) + return ast.NodeTransformer.generic_visit(self, node) + + def visit_Module(self, node): + # Visit nodes of module + return ast.NodeTransformer.generic_visit(self, node) + + def generic_visit(self, node): + # Remove everything which is not handled by the methods above + return None + + def get_transformed_code(self, node, fname=''): + """Get compiled code containing only empty functions and methods + and safe assignments found in the AST of node.""" + self._class_assignments = [] + node = self.visit(node) + # The self members are added as attributes to the class objects + # rather than included as class variables inside the class definition + # so that names starting with '__' are not mangled. + node.body.extend(self._class_assignments) + code = compile(node, fname, 'exec') + return code + + _stdout = sys.stdout + + _instances = {} + + def __init__(self, fname=None): + """Constructor for internal use. + The factory method instance() shall be used instead. + """ + self._fname = fname + self._imports = None + self._globald = globals().copy() + self._symnames = [] + self._symobjs = {} + self._parse_source_called = False + + @classmethod + def instance(cls, fname): + """Get _PyCompleteDocument object for fname. + If no object for this file name exists, a new object is created and + registered. + """ + obj = cls._instances.get(fname) + if obj is None: + obj = _PyCompleteDocument(fname) + cls._instances[fname] = obj + return obj + + def _import_modules(self, imports): + """Import modules using the statements in imports. + If the imports are the same as in the last call, the methods + immediately returns, also if imports is None. + """ + if imports is None and not self._parse_source_called: + self.parse_source() + if imports is None or imports == self._imports: + return + # changes to where the file is + if self._fname: + os.chdir(os.path.dirname(self._fname)) + self._globald = globals().copy() + self._symnames = [] + self._symobjs = {} + for stmt in imports: + try: + exec(stmt, self._globald) + except TypeError: + raise TypeError('invalid type: %s' % stmt) + except Exception: + continue + self._imports = imports + + def _collect_symbol_names(self): + """Collect the global, local, builtin symbols in _symnames. + If _symnames is already set, the method immediately returns. + """ + if not self._symnames: + keys = set(keyword.kwlist) + keys.update(list(self._globald.keys())) + self.update_with_builtins(keys) + self._symnames = list(keys) + self._symnames.sort() + + def _get_symbol_object(self, s): + """Get a symbol by evaluating its name or importing a module + or submodule with the name s. + """ + sym = self._symobjs.get(s) + if sym is not None: + return sym + # changes to where the file is + if self._fname: + os.chdir(os.path.dirname(self._fname)) + try: + sym = eval(s, self._globald) + except NameError: + try: + sym = __import__(s, self._globald) + self._globald[s] = sym + except ImportError: + pass + except AttributeError: + try: + sym = __import__(s, self._globald) + except ImportError: + pass + except SyntaxError: + pass + if sym is not None: + self._symobjs[s] = sym + return sym + + def _load_symbol(self, s, strict=False): + """Get a symbol for a dotted expression. + + Returns the last successfully found symbol object in the + dotted chain. If strict is set True, it returns True as + soon as a symbol is not found. Therefore strict=True can + be used to find exactly the symbol for s, otherwise a + symbol for a parent can be returned, which may be enough + if searching for help on symbol. + """ + s = self._replace_pycfrt_with_typename(s) + sym = self._symobjs.get(s) + if sym is not None: + return sym + dots = s.split('.') + if not s or len(dots) == 1: + sym = self._get_symbol_object(s) + else: + for i in range(1, len(dots) + 1): + s = '.'.join(dots[:i]) + if not s: + continue + sym_i = self._get_symbol_object(s) + if sym_i is not None: + sym = sym_i + elif strict: + return None + return sym + + def _get_help(self, s, imports=None): + """Return string printed by help function.""" + if not s: + return '' + if s == 'pydoc.help': + # Prevent pydoc from going into interactive mode + s = 'pydoc.Helper' + obj = None + if not keyword.iskeyword(s): + try: + self._import_modules(imports) + obj = self._load_symbol(s, strict=False) + except Exception as ex: + return '%s' % ex + if not obj: + obj = str(s) + out = self._helpout() + try: + sys.stdout = out + pydoc.help(obj) + finally: + sys.stdout = self._stdout + return out.getvalue() + + @staticmethod + def _find_constructor(class_ob): + """Given a class object, return a function object used for the + constructor (ie, __init__() ) or None if we can't find one.""" + try: + return _PyCompleteDocument.get_unbound_function(class_ob.__init__) + except AttributeError: + for base in class_ob.__bases__: + rc = _PyCompleteDocument._find_constructor(base) + if rc is not None: + return rc + return None + + def get_all_completions(self, s, imports=None): + """Return contextual completion of s (string of >= zero chars). + + If given, imports is a list of import statements to be executed + first. + """ + self._import_modules(imports) + + s = self._replace_pycfrt_with_typename(s) + last_dot_pos = s.rfind('.') + if last_dot_pos == -1: + self._collect_symbol_names() + if s: + return [k for k in self._symnames if k.startswith(s)] + else: + return self._symnames + + sym = self._load_symbol(s[:last_dot_pos], strict=True) + if sym is not None: + s = s[last_dot_pos + 1:] + return [k for k in dir(sym) if k.startswith(s)] + return [] + + def complete(self, s, imports=None): + """Complete symbol if unique, else return list of completions.""" + if not s: + return '' + + completions = self.get_all_completions(s, imports) + if len(completions) == 0: + return None + else: + dots = s.split(".") + prefix = os.path.commonprefix([k for k in completions]) + if len(completions) == 1 or len(prefix) > len(dots[-1]): + return [prefix[len(dots[-1]):]] + return completions + + def help(self, s, imports=None): + """Return help on object.""" + try: + return self._get_help(s, imports) + except Exception as ex: + return '%s' % ex + + def get_docstring(self, s, imports=None): + """Return docstring for symbol s.""" + if s and not keyword.iskeyword(s): + try: + self._import_modules(imports) + obj = self._load_symbol(s, strict=True) + if obj and not self.is_num_or_str(obj): + doc = inspect.getdoc(obj) + if doc: + return doc + except: + pass + return '' + + def get_signature(self, s, imports=None): + """Return info about function parameters.""" + if not s or keyword.iskeyword(s): + return '' + obj = None + sig = "" + + try: + self._import_modules(imports) + obj = self._load_symbol(s, strict=False) + except Exception as ex: + return '%s' % ex + + if self.is_class_type(obj): + # Look for the highest __init__ in the class chain. + ctr = self._find_constructor(obj) + if ctr is not None and type(ctr) in ( + types.MethodType, types.FunctionType, types.LambdaType): + obj = ctr + elif type(obj) == types.MethodType: + # bit of a hack for methods - turn it into a function + # but we drop the "self" param. + obj = self.get_method_function(obj) + + if type(obj) in [types.FunctionType, types.LambdaType]: + (args, varargs, varkw, defaults) = inspect.getargspec(obj) + sig = ('%s: %s' % (obj.__name__, + inspect.formatargspec(args, varargs, varkw, + defaults))) + doc = getattr(obj, '__doc__', '') + if doc and not sig: + doc = doc.lstrip() + pos = doc.find('\n') + if pos < 0 or pos > 70: + pos = 70 + sig = doc[:pos] + return sig + + def get_location(self, s, imports=None): + """Return file path and line number of symbol, None if not found.""" + if not s or keyword.iskeyword(s): + return None + try: + self._import_modules(imports) + obj = self._load_symbol(s, strict=False) + if obj is not None: + if self.is_class_type(obj): + obj = obj.__init__ + if type(obj) == types.MethodType: + obj = self.get_method_function(obj) + if type(obj) in [types.FunctionType, types.LambdaType]: + code = self.get_function_code(obj) + return (os.path.abspath(code.co_filename), code.co_firstlineno) + # If not found, try using inspect. + return (inspect.getsourcefile(obj), inspect.getsourcelines(obj)[1]) + except: + pass + return None + + def parse_source(self, only_reload=False): + """Parse source code to get imports and completions. + + If this method is called, the imports parameter for the other methods + must be omitted (or None), so that the imports are taken from the + parsed source code. If only_reload is True, the source is only parsed + if it has been parsed before. + None is returned if OK, else a string describing the error. + """ + if only_reload and not self._parse_source_called: + return None + self._parse_source_called = True + if not self._fname: + return None + + try: + with open(self._fname) as fh: + src = fh.read() + except IOError as ex: + return '%s' % ex + + # changes to where the file is + os.chdir(os.path.dirname(self._fname)) + + try: + node = ast.parse(src, self._fname) + import_code = self.ImportExtractor().get_import_code(node, self._fname) + except (SyntaxError, TypeError) as ex: + return '%s' % ex + + old_globald = self._globald.copy() + self._globald = globals().copy() + try: + exec(import_code, self._globald) + except Exception as ex: + self._globald = old_globald + return '%s' % ex + + self._symnames = [] + self._symobjs = {} + + reduced_code = self.CodeRemover().get_transformed_code(node, self._fname) + try: + exec(reduced_code, self._globald) + except Exception as ex: + return '%s' % ex + return None + +def pycompletions(s, fname=None, imports=None): + """Get a list of possible completions for s. + + The completions extend the expression s after the last dot. + """ + return _PyCompleteDocument.instance(fname).get_all_completions( + s, imports) + +def pycomplete(s, fname=None, imports=None): + """Complete the Python expression s. + + If multiple completions are found, a list of possible completions + (names after the last dot) is returned. + If one completion is found, a list with a string containing the + remaining characters is returned. + If no completion is found, None is returned. + """ + return _PyCompleteDocument.instance(fname).complete(s, imports) + +def pyhelp(s, fname=None, imports=None): + """Return help on object s.""" + return _PyCompleteDocument.instance(fname).help(s, imports) + +def pydocstring(s, fname=None, imports=None): + """Return docstring of symbol.""" + return _PyCompleteDocument.instance(fname).get_docstring(s, imports) + +def pysignature(s, fname=None, imports=None): + """Return info about function parameters.""" + return _PyCompleteDocument.instance(fname).get_signature(s, imports) + +def pylocation(s, fname=None, imports=None): + """Return file path and line number of symbol, None if not found.""" + return _PyCompleteDocument.instance(fname).get_location(s, imports) + +def pyparse(fname, only_reload=False): + """Parse source code to get imports and completions. + + If this function is called, the imports parameter for the other functions + must be omitted (or None), so that the imports are taken from the + parsed source code. If only_reload is True, the source is only parsed if + it has been parsed before. + """ + return _PyCompleteDocument.instance(fname).parse_source(only_reload) + +# Local Variables : +# pymacs-auto-reload : t +# End : diff --git a/elpa/python-mode-6.1.3/completion/test_pycomplete.py b/elpa/python-mode-6.1.3/completion/test_pycomplete.py new file mode 100755 index 000000000..68a1a89a3 --- /dev/null +++ b/elpa/python-mode-6.1.3/completion/test_pycomplete.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python + +import os +import linecache +import tempfile +from pycomplete import * + +def test_signature(): + assert pysignature('') == '' + assert pysignature('os.path.join') == 'join: (a, *p)' + assert pysignature('json.dump').startswith( + 'dump: (obj, fp, skipkeys=False, ensure_ascii=True, ') + assert pysignature('json.JSONEncoder.encode') == 'encode: (self, o)' + assert pysignature('json.JSONEncoder').startswith( + '__init__: (self, skipkeys=False, ensure_ascii=True, ') + assert pysignature('xml.dom.minidom.parse') == \ + 'parse: (file, parser=None, bufsize=None)' + assert pysignature('csv.reader') == \ + 'csv_reader = reader(iterable [, dialect=\'excel\']' + assert pysignature('super') in ( + 'super(type) -> unbound super object', + 'super() -> same as super(__class__, )') + +def test_help(): + assert pyhelp('os.path.join').startswith('Help on function join') + assert pyhelp('logging', imports=('import logging',)).startswith( + 'Help on package logging:\n\nNAME\n logging\n') + assert pyhelp('csv', imports=('import csv',)).startswith( + 'Help on module csv:\n\nNAME\n csv - CSV parsing and writing.\n') + assert pyhelp('import').startswith( + 'The ``import`` statement\n************************\n') + assert pyhelp('pydoc.help').startswith( + 'Help on class Helper in module pydoc') + assert pyhelp('') == '' + +def test_complete(): + assert pycomplete('') == '' + assert pycomplete('sys.getd') == ['getdefaultencoding', 'getdlopenflags'] + assert pycomplete('set') == ['set', 'setattr'] + assert pycomplete('settr') is None + assert pycomplete('settr', imports=['from sys import settrace']) == [ + 'ace'] + # Test with cached imports + assert pycomplete('settr') == ['ace'] + # Not cached for other files + fpath = os.path.abspath(__file__) + assert pycomplete('settr', fname=fpath) is None + assert pycomplete('settr', fname=fpath, + imports=['from sys import settrace']) == ['ace'] + assert pycomplete('foo.') is None + assert pycomplete('JSONEnc') is None + assert pycomplete('JSONEnc', imports=['from json import *']) == ['oder'] + assert pycomplete('A') == [ + 'ArithmeticError', 'AssertionError', 'AttributeError'] + +def test_completions(): + all_completions = pycompletions('') + assert all_completions[0] == 'ArithmeticError' + assert all_completions[-1] == 'zip' + assert pycompletions('os.path.jo') == ['join'] + assert pycompletions('settr', imports=['']) == [] + assert pycompletions('settr', + imports=['from sys import settrace']) == ['settrace'] + # Check if imports are still cached. + assert pycompletions('settr', imports=None) == ['settrace'] + # Change list of imports, so that cache is invalidated. + assert pycompletions('settr', imports=['']) == [] + +def test_location(): + fn, line = pylocation('os.path.join') + assert os.path.exists(fn) + assert linecache.getline(fn, line).startswith('def join') + assert pylocation('io.StringIO') is None + fn, line = pylocation('json') + assert os.path.exists(fn) + assert pylocation('for') is None + +def test_docstring(): + assert pydocstring('os.path.abspath') == 'Return an absolute path.' + assert pydocstring('os.path').startswith( + 'Common operations on Posix pathnames.\n') + assert pydocstring('json.JSONEncoder.encode').startswith( + 'Return a JSON string representation of a Python data structure.\n') + assert pydocstring('yield') == '' + assert pydocstring('numbers.Real.real') == \ + 'Real numbers are their real component.' + assert pydocstring('notexisting') == '' + assert pydocstring('re.IGNORECASE') == '' + +def test_parse_source(): + tmp_file = tempfile.NamedTemporaryFile(suffix='.py', mode='w') + name = tmp_file.name + with tmp_file.file as fh: + assert pyparse('not_existing', only_reload=True) == None + assert pyparse('not_existing') == \ + "[Errno 2] No such file or directory: 'not_existing'" + assert pyparse(name) is None + # Nothing imported so far + assert pycompletions('dat' , name) == [] + src = """ +"Doc for module." +from __future__ import print_function +import sys, os, io, re +from datetime import date, \ +time +import argparse +if os.getenv('LC'): + import linecache + +modvar = 1 +mod_re = re.compile(r'^test') + +def testfunc(): + "Doc for testfunc." + import urllib + +def emptyfunc(): + "Function with only docstring." + +class TestClass(date): + "Doc for TestClass." + CONST1 = 7 + CONST2 = 'abc' + CONST3 = ['a', ] + + def __init__(self): + self._member1 = 'string member' + self._member2 = None + self.__member3 = [ None, open('not_existing') ] + self.member4 = argparse.ArgumentParser() + self.member4 = None + self.member5 = open('not_existing') + self.member6 = self.member7 = { 'multiple': 'targets' } + self.member8, self.member9 = 'tuple', 'assignment' + self.member10 = [ n for n in range(3) ] + self.member11 = SyntaxError() + self.member12 = testfunc() + def testmeth(self, arg1=modvar): + "Doc for testmeth." + sys.stdout.write('From testmeth %d' % arg1) + if arg1 == 2: + self._member1 = None + @staticmethod + def teststaticmeth(arg1=2): + "Doc for teststaticmeth." + sys.stdout.write('From teststaticmeth %d' % arg1) + @classmethod + def testclassmeth(cls, arg1=3): + "Doc for testclassmeth." + open('not_existing') + @property + def testprop(self): + "Doc for testprop." + return 4 * 8 + +if __name__ == '__main__': + testfunc() +""" + num_src_lines = len(src.splitlines()) + fh.write(src) + fh.flush() + assert pyparse(name) == None + # Check if only global imports are visible + assert pycompletions('dat' , name) == ['date'] + assert pycompletions('tim' , name) == ['time'] + assert pycompletions('url' , name) == [] + assert pycompletions('line' , name) == ['linecache'] + assert pycompletions('os' , name) == ['os'] + # Check for definitions in local file + assert pycompletions('test' , name) == ['testfunc'] + assert pycompletions('TestClass.CO' , name) == \ + ['CONST1', 'CONST2', 'CONST3'] + assert pycompletions('TestClass.test' , name) == \ + ['testclassmeth', 'testmeth', 'testprop', 'teststaticmeth'] + # Check for instance members + assert pycompletions('TestClass._mem', name) == \ + ['_member1', '_member2'] + assert pycompletions('TestClass.__mem', name) == ['__member3'] + assert pycompletions('TestClass._member1.start', name) == \ + ['startswith'] + assert pycompletions('TestClass._member2.', name) == [] + assert pycompletions('TestClass.__member3.ext', name) == \ + ['extend'] + assert pycompletions('TestClass.member4.prin', name) == \ + ['print_help', 'print_usage', 'print_version'] + assert pycompletions('TestClass.member5.writel', name) == \ + ['writelines'] + assert pycompletions('TestClass.member6.from', name) == \ + ['fromkeys'] + assert pycompletions('TestClass.member7.from', name) == \ + ['fromkeys'] + assert pycompletions('TestClass.member10.ext', name) == \ + ['extend'] + assert pycompletions('TestClass.member11.ar', name) == \ + ['args'] + assert pycompletions('modvar.num', name) == ['numerator'] + assert pycompletions('mod_re.ma', name) == ['match'] + assert pydocstring('TestClass._member1', name) == '' + assert pydocstring('TestClass._member2', name) == '' + assert pydocstring('TestClass.__member3', name) == '' + # Check for super class + assert pycompletions('TestClass.week' , name) == ['weekday'] + assert pycompletions('TestClass.utc' , name) == [] + # Check signature, documentation and location + assert pysignature('TestClass.testmeth', name) == \ + 'testmeth: (self, arg1=1)' + assert pydocstring('testfunc', name) == \ + 'Doc for testfunc.' + assert pylocation('TestClass.testclassmeth', name) == \ + (name, num_src_lines - 10) + # Verify that loaded symbols are not affected by transient + # syntax error + fh.write('while') + fh.flush() + assert pyparse(name) == \ + 'invalid syntax (%s, line %d)' % (os.path.basename(name), + num_src_lines + 1) + assert pycompletions('dat' , name) == ['date'] + # Replace file contents and check new imports + fh.seek(0) + fh.truncate(0) + fh.write('import urllib\n') + fh.flush() + assert pyparse(name) == None + assert pycompletions('dat' , name) == [] + assert pycompletions('url' , name) == ['urllib'] + +def run_tests(): + test_complete() + test_completions() + test_help() + test_signature() + test_location() + test_docstring() + test_parse_source() + +if __name__ == "__main__": + run_tests() diff --git a/elpa/python-mode-6.1.3/doc/commands-python-mode.org b/elpa/python-mode-6.1.3/doc/commands-python-mode.org new file mode 100644 index 000000000..cc17a53c9 --- /dev/null +++ b/elpa/python-mode-6.1.3/doc/commands-python-mode.org @@ -0,0 +1,5088 @@ +python-mode.el commands + +** py-smart-operator-check + Check, if smart-operator-mode is loaded resp. available. + +Give some hints, if not. + +** py-autopair-check + Check, if autopair-mode is available. + +Give some hints, if not. + +** (defun p + + +* Toggle +** toggle-py-nil-docstring-style + If nil docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +** py-nil-docstring-style-on + Make sure, nil docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** py-nil-docstring-style-off + Make sure, nil docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** toggle-py-onetwo-docstring-style + If onetwo docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +** py-onetwo-docstring-style-on + Make sure, onetwo docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** py-onetwo-docstring-style-off + Make sure, onetwo docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** toggle-py-pep-257-docstring-style + If pep-257 docstring-style should be on or off. + + Returns value of `py-pep-257-docstring-style' switched to. + +** py-pep-257-docstring-style-on + Make sure, pep-257 docstring-style' is on. + +Returns value of `py-pep-257-docstring-style'. + +** py-pep-257-docstring-style-off + Make sure, pep-257 docstring-style is off. + +Returns value of `py-pep-257-docstring-style'. + +** toggle-py-pep-257-nn-docstring-style + If pep-257-nn docstring-style should be on or off. + + Returns value of `py-pep-257-nn-docstring-style' switched to. + +** py-pep-257-nn-docstring-style-on + Make sure, pep-257-nn docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** py-pep-257-nn-docstring-style-off + Make sure, pep-257-nn docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** toggle-py-symmetric-docstring-style + If symmetric docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +** py-symmetric-docstring-style-on + Make sure, symmetric docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** py-symmetric-docstring-style-off + Make sure, symmetric docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** toggle-py-django-docstring-style + If django docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +** py-django-docstring-style-on + Make sure, django docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** py-django-docstring-style-off + Make sure, django docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +** toggle-py-underscore-word-syntax-p + If `py-underscore-word-syntax-p' should be on or off. + + Returns value of `py-underscore-word-syntax-p' switched to. + +** py-underscore-word-syntax-p-on + Make sure, py-underscore-word-syntax-p' is on. + +Returns value of `py-underscore-word-syntax-p'. + +** py-underscore-word-syntax-p-off + Make sure, `py-underscore-word-syntax-p' is off. + +Returns value of `py-underscore-word-syntax-p'. + +** toggle-py-electric-comment-p + If `py-electric-comment-p' should be on or off. + + Returns value of `py-electric-comment-p' switched to. + +** py-electric-comment-p-on + Make sure, py-electric-comment-p' is on. + +Returns value of `py-electric-comment-p'. + +** py-electric-comment-p-off + Make sure, `py-electric-comment-p' is off. + +Returns value of `py-electric-comment-p'. + +** toggle-force-local-shell + 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' + + +** 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 + +** py-force-local-shell-off + Restore `py-shell-name' default value and `behaviour'. + +** toggle-force-py-shell-name-p + 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. + + +** force-py-shell-name-p-on + 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. + + +** 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'. + +** py-toggle-indent-tabs-mode + Toggle `indent-tabs-mode'. + +Returns value of `indent-tabs-mode' switched to. + +** py-indent-tabs-mode-on + Switch `indent-tabs-mode' on. + +** py-indent-tabs-mode-off + Switch `indent-tabs-mode' on. + +** toggle-py-jump-on-exception + If `py-jump-on-exception' should be on or off. + + Returns value of `py-jump-on-exception' switched to. + +** py-jump-on-exception-on + Make sure, py-jump-on-exception' is on. + +Returns value of `py-jump-on-exception'. + +** py-jump-on-exception-off + Make sure, `py-jump-on-exception' is off. + +Returns value of `py-jump-on-exception'. + +** toggle-python-mode-v5-behavior-p + If `python-mode-v5-behavior-p' should be on or off. + + Returns value of `python-mode-v5-behavior-p' switched to. + +** python-mode-v5-behavior-p-on + Make sure, `python-mode-v5-behavior-p' is on. + +Returns value of `python-mode-v5-behavior-p'. + +** python-mode-v5-behavior-p-off + Make sure, `python-mode-v5-behavior-p' is off. + +Returns value of `python-mode-v5-behavior-p'. + +** py-toggle-shell-switch-buffers-on-execute + If `py-switch-buffers-on-execute-p' should be on or off. + + Returns value of `py-switch-buffers-on-execute-p' switched to. + +** py-shell-switch-buffers-on-execute-on + Make sure, `py-switch-buffers-on-execute-p' is on. + +Returns value of `py-switch-buffers-on-execute-p'. + +** 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'. + +** py-toggle-split-windows-on-execute + If `py-split-windows-on-execute-p' should be on or off. + + Returns value of `py-split-windows-on-execute-p' switched to. + +** py-split-windows-on-execute-on + Make sure, `py-split-windows-on-execute-p' is on. + +Returns value of `py-split-windows-on-execute-p'. + +** 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'. + +** py-toggle-highlight-indentation + If `highlight-indentation-p' should be on or off. + +** py-highlight-indentation-off + If `highlight-indentation-p' should be on or off. + +** py-highlight-indentation-on + If `highlight-indentation-p' should be on or off. + +** py-toggle-smart-indentation + If `py-smart-indentation' should be on or off. + +Returns value of `py-smart-indentation' switched to. + +** py-smart-indentation-on + Make sure, `py-smart-indentation' is on. + +Returns value of `py-smart-indentation'. + +** py-smart-indentation-off + Make sure, `py-smart-indentation' is off. + +Returns value of `py-smart-indentation'. + +** toggle-py-smart-operator-mode-p + If `py-smart-operator-mode-p' should be on or off. + + Returns value of `py-smart-operator-mode-p' switched to. + +** py-smart-operator-mode-p-on + Make sure, py-smart-operator-mode-p' is on. + +Returns value of `py-smart-operator-mode-p'. + +** py-smart-operator-mode-p-off + Make sure, py-smart-operator-mode-p' is off. + +Returns value of `py-smart-operator-mode-p'. + +** toggle-py-use-current-dir-when-execute-p + If `py-use-current-dir-when-execute-p' should be on or off. + + Returns value of `py-use-current-dir-when-execute-p' switched to. + +** py-use-current-dir-when-execute-p-on + Make sure, py-use-current-dir-when-execute-p' is on. + +Returns value of `py-use-current-dir-when-execute-p'. + +** py-use-current-dir-when-execute-p-off + Make sure, `py-use-current-dir-when-execute-p' is off. + +Returns value of `py-use-current-dir-when-execute-p'. + +** py-toggle-autopair-mode + If `py-autopair-mode' should be on or off. + + Returns value of `py-autopair-mode' switched to. + +** py-autopair-mode-on + Make sure, py-autopair-mode' is on. + +Returns value of `py-autopair-mode'. + +** py-autopair-mode-off + Make sure, py-autopair-mode' is off. + +Returns value of `py-autopair-mode'. + +** toggle-py-switch-buffers-on-execute-p + If `py-switch-buffers-on-execute-p' should be on or off. + + Returns value of `py-switch-buffers-on-execute-p' switched to. + +** py-switch-buffers-on-execute-p-on + Make sure, `py-py-switch-buffers-on-execute-p' is on. + +Returns value of `py-switch-buffers-on-execute-p'. + +** py-switch-buffers-on-execute-p-off + Make sure, `py-switch-buffers-on-execute-p' is off. + +Returns value of `py-switch-buffers-on-execute-p'. + +** toggle-py-split-windows-on-execute-p + If `py-split-windows-on-execute-p' should be on or off. + + Returns value of `py-split-windows-on-execute-p' switched to. + +** py-split-windows-on-execute-p-on + Make sure, `py-py-split-windows-on-execute-p' is on. + +Returns value of `py-split-windows-on-execute-p'. + +** py-split-windows-on-execute-p-off + Make sure, `py-split-windows-on-execute-p' is off. + +Returns value of `py-split-windows-on-execute-p'. + +** py-toggle-sexp-function + Opens customization + +** py-shell-get-process + Get appropriate Python process for current buffer and return it. + +** py-shell-send-string + Send STRING to inferior Python PROCESS. +When `py-verbose-p' and MSG is non-nil messages the first line of STRING. + +** py-shell-send-file + 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. + +** py-switch-to-shell + Switch to inferior Python process buffer. + +** 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. + +* Helper commands +** py-guess-pdb-path + If py-pdb-path isn't set, find location of pdb.py. + +** (defun s + + +** py-forward-line + Goes to end of line after forward move. + +Travels right-margin comments. + +** 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 + +** py-leave-comment-or-string-backward + If inside a comment or string, leave it backward. + +** py-beginning-of-list-pps + Go to the beginning of a list. +Optional ARG indicates a start-position for `parse-partial-sexp'. +Return beginning position, nil if not inside. + +** empty-line-p + Returns t if cursor is at an line with nothing but whitespace-characters, nil otherwise. + +** py-count-lines + Count lines in accessible part until current line. + +See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7115 + +** py-send-region + Send the region to the inferior Python process. + +** py-send-region-and-go + Send the region to the inferior Python process. + +Then switch to the process buffer. + +** python-send-string + Evaluate STRING in inferior Python process. + +** py-switch-to-python + Switch to the Python process buffer, maybe starting new process. + +With prefix arg, position cursor at end of buffer. + +** py-proc + Return the current Python process. + +Start a new process if necessary. + +* Keymap and syntax +** py-insert-default-shebang + Insert in buffer shebang of installed default Python. + +** py-electric-comment + Insert a comment. If starting a comment, indent accordingly. + +If a numeric argument ARG is provided, that many "#" are inserted +non-electrically. +With C-u "#" electric behavior is inhibited inside a string or comment. + +** py-electric-colon + 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. + +Switched by `py-electric-colon-active-p', default is nil +See also `py-electric-colon-greedy-p' + +** py-empty-out-list-backward + Deletes all elements from list before point. + +** py-electric-backspace + Delete preceding character or level of indentation. + +With ARG do that ARG times. +Returns column reached. + +** py-electric-delete + Delete following character or levels of whitespace. + +With ARG do that ARG times. + +** py-indent-line-outmost + Indent the current line to the outmost reasonable indent. + +With optional C-u an indent with length `py-indent-offset' is inserted unconditionally + +** py-indent-line + Indent the current line according to Python rules. + +When called interactivly with C-u, ignore dedenting rules for block closing statements +(e.g. return, raise, break, continue, pass) + +An optional C-u 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. +TAB. +Returns current indentation + +When `py-tab-shifts-region-p' is `t', not just the current line, +but the region is shiftet that way. + +If `py-tab-indents-region-p' is `t' and first TAB doesn't shift +--as indent is at outmost reasonable--, indent-region is called. + +** 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. + +** py-newline-and-dedent + Add a newline and indent to one level below current. +Returns column. + +** py-indent-tabs-mode + With positive ARG switch `indent-tabs-mode' on. + +With negative ARG switch `indent-tabs-mode' off. +Returns value of `indent-tabs-mode' switched to. + +** py-guess-indent-forward + Called when moving to end of a form and `py-smart-indentation' is on. + +** py-guess-indent-offset + Guess `py-indent-offset'. + +Set local value of `py-indent-offset', return it + +Might change local value of `py-indent-offset' only when called +downwards from beginning of block followed by a statement. Otherwise default-value is returned. + + +** py-narrow-to-defun + Make text outside current def or class invisible. + +The defun visible is the one that contains point or follows point. + +* Shifting +** py-shift-left + Dedent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is dedented. +Returns indentation reached. + +** py-shift-right + Indent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is indented. +Returns indentation reached. + +** py-shift-paragraph-right + Indent paragraph by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-paragraph-left + Dedent paragraph by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-block-right + Indent block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-block-left + Dedent block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-minor-block-left + Dedent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. +A minor block is started by a `for', `if', `try' or `with'. + +** py-shift-minor-block-right + Indent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. +A minor block is started by a `for', `if', `try' or `with'. + +** py-shift-clause-right + Indent clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-clause-left + Dedent clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-block-or-clause-right + Indent block-or-clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-block-or-clause-left + Dedent block-or-clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-def-right + Indent def by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-def-left + Dedent def by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-class-right + Indent class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-class-left + Dedent class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-def-or-class-right + Indent def-or-class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-def-or-class-left + Dedent def-or-class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-line-right + Indent line by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-line-left + Dedent line by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-statement-right + Indent statement by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-shift-statement-left + Dedent statement by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +** py-indent-and-forward + Indent current line according to mode, move one line forward. + +** py-indent-region + 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 + +* Positions +** py-beginning-of-paragraph-position + Returns beginning of paragraph position. + +** py-end-of-paragraph-position + Returns end of paragraph position. + +** py-beginning-of-block-position + Returns beginning of block position. + +** py-end-of-block-position + Returns end of block position. + +** py-beginning-of-minor-block-position + Returns beginning of minor-block position. + +** py-end-of-minor-block-position + Returns end of minor-block position. + +** py-beginning-of-clause-position + Returns beginning of clause position. + +** py-end-of-clause-position + Returns end of clause position. + +** py-beginning-of-block-or-clause-position + Returns beginning of block-or-clause position. + +** py-end-of-block-or-clause-position + Returns end of block-or-clause position. + +** py-beginning-of-def-position + Returns beginning of def position. + +** py-end-of-def-position + Returns end of def position. + +** py-beginning-of-class-position + Returns beginning of class position. + +** py-end-of-class-position + Returns end of class position. + +** py-beginning-of-def-or-class-position + Returns beginning of def-or-class position. + +** py-end-of-def-or-class-position + Returns end of def-or-class position. + +** py-beginning-of-line-position + Returns beginning of line position. + +** py-end-of-line-position + Returns end of line position. + +** py-beginning-of-statement-position + Returns beginning of statement position. + +** py-end-of-statement-position + Returns end of statement position. + +** py-beginning-of-comment-position + Returns beginning of comment position. + +** py-end-of-comment-position + Returns end of comment position. + +** py-beginning-of-top-level-position + Returns beginning of top-level position. + +** py-end-of-top-level-position + Returns end of top-level position. + +** py-beginning-of-partial-expression-position + Returns beginning of partial-expression position. + +** py-end-of-partial-expression-position + Returns end of partial-expression position. + +** py-beginning-of-expression-position + Returns beginning of expression position. + +** py-end-of-expression-position + Returns end of expression position. + +* some more Positions not generated by +** py-list-beginning-position + Return lists beginning position, nil if not inside. + +Optional ARG indicates a start-position for `parse-partial-sexp'. + +** py-end-of-list-position + Return end position, nil if not inside. + +Optional ARG indicates a start-position for `parse-partial-sexp'. + +** py-in-triplequoted-string-p + Returns character address of start tqs-string, nil if not inside. + +** py-in-string-p + Returns character address of start of string, nil if not inside. + +** 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. + + +* Bounds +** py-bounds-of-statement + 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. + +** py-bounds-of-statements + Bounds of consecutive multitude of statements around point. + +Indented same level, which don't open blocks. + +** py-bounds-of-block + 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. + +** py-bounds-of-clause + 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. + +** py-bounds-of-block-or-clause + 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. + +** py-bounds-of-def + 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. + +** py-bounds-of-class + 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. + +** py-bounds-of-region + Returns bounds of region at point. + +Returns a list, whose car is beg, cdr - end. + +** py-bounds-of-buffer + 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. + +** py-bounds-of-expression + 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. + +** py-bounds-of-partial-expression + 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. + +** 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 + +* Comments, Filling +** py-beginning-of-comment + Go to the beginning of current line's comment, if any. + +Returns position if succesful. + +** py-end-of-comment + Go to the end of comment at point. + +Returns position, nil if not in comment. + +* Comment forms +** py-comment-region + Like `comment-region' but uses double hash (`#') comment starter. + +** py-comment-block + Comments block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-minor-block + Comments minor-block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-top-level + Comments top-level form at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-clause + Comments clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-block-or-clause + Comments block-or-clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-def + Comments def at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-class + Comments class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-def-or-class + Comments def-or-class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-comment-statement + Comments statement at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +** py-uncomment + Uncomment commented lines at point. + +If region is active, restrict uncommenting at region + +** py-delete-comments-in-def-or-class + Delete all commented lines in def-or-class at point + +** py-delete-comments-in-class + Delete all commented lines in class at point + +** py-delete-comments-in-block + Delete all commented lines in block at point + +** py-delete-comments-in-region + Delete all commented lines in region. + +** py-fill-comment + Fill the comment paragraph at point + +** py-end-of-string + Go to end of string at point, return position. + +Takes the result of (syntax-ppss) + +** py-fill-this-paragraph + Fill just the paragraph at point. + +** py-fill-paragraph + `fill-paragraph-function' + +If `py-paragraph-fill-docstring-p' and inside a docstring, the whole docstring is formatted. +See also `py-fill-string' + +** py-fill-labelled-string + Fill string or paragraph containing lines starting with label + +See lp:1066489 + +** py-fill-string + String fill function for `py-fill-paragraph'. +JUSTIFY should be used (if applicable) as in `fill-paragraph'. + +DOCSTRING is either a boolean or 'no +If `py-paragraph-fill-docstring-p' is `t', `M-q` fills the +complete docstring according to setting of `py-docstring-style' + +** py-fill-string-django + Fill docstring according to Django's coding standards style. + + """ + Process foo, return bar. + """ + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +** py-fill-string-onetwo + One newline and start and Two at end style. + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +** py-fill-string-pep-257 + PEP-257 with 2 newlines at end of string. + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +** py-fill-string-pep-257-nn + PEP-257 with 1 newline at end of string. + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +** py-fill-string-symmetric + Symmetric style. + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +** py-beginning-of-top-level-p + Returns position, if cursor is at the beginning of a top-level, nil otherwise. + +* Opens-p +** py-statement-opens-block-p + Return position if the current statement opens a block +in stricter or wider sense. + +For stricter sense specify regexp. + +** py-statement-opens-clause-p + Return position if the current statement opens block or clause. + +** py-statement-opens-block-or-clause-p + Return position if the current statement opens block or clause. + +** py-statement-opens-class-p + Return `t' if the statement opens a functions or class definition, nil otherwise. + +** py-statement-opens-def-p + Return `t' if the statement opens a functions or class definition, nil otherwise. + +** py-statement-opens-def-or-class-p + Return `t' if the statement opens a functions or class definition, nil otherwise. + +** py-look-downward-for-clause + If beginning of other clause exists downward in current block. + +If succesful return position. + +** py-current-defun + 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'. + +** py-sort-imports + Sort multiline imports. + +Put point inside the parentheses of a multiline import and hit +M-x py-sort-imports to sort the imports lexicographically + +** py-which-def-or-class + Returns concatenated `def' and `class' names in hierarchical order, if cursor is inside. + +Returns "???" otherwise +Used by variable `which-func-functions' + +** py-which-function + Return the name of the function or class, if curser is in, return nil otherwise. + +* Beginning/End +** py-beginning-of-statements + Got to the beginning of statements in current level which don't open blocks. + +** py-end-of-statements + Got to the end of statements in current level which don't open blocks. + +** py-beginning-of-expression + Go to the beginning of a compound python expression. + +With numeric ARG do it that many times. + +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. + + +** py-end-of-expression + Go to the end of a compound python expression. + +With numeric ARG do it that many times. + +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. + +** py-beginning-of-partial-expression + + +** py-end-of-partial-expression + + +** 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. + +** 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. + +** py-beginning-of-statement + 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 + + +** py-beginning-of-declarations + Got to the beginning of assigments resp. statements in current level which don't open blocks. + + +** py-end-of-declarations + Got to the end of assigments resp. statements in current level which don't open blocks. + +* Beginning of forms +** py-beginning-of-form-intern + Go to beginning of FORM. + +With INDENT, go to beginning one level above. +Whit IACT, print result in message buffer. + +Returns beginning of FORM if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-block + Go to beginning block, skip whitespace at BOL. + +Returns beginning of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-clause + Go to beginning clause, skip whitespace at BOL. + +Returns beginning of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-block-or-clause + Go to beginning block-or-clause, skip whitespace at BOL. + +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 + +** py-beginning-of-def + Go to beginning def, skip whitespace at BOL. + +Returns beginning of def if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-class + Go to beginning class, skip whitespace at BOL. + +Returns beginning of class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-def-or-class + Go to beginning def-or-class, skip whitespace at BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-if-block + Go to beginning if-block, skip whitespace at BOL. + +Returns beginning of if-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-try-block + Go to beginning try-block, skip whitespace at BOL. + +Returns beginning of try-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-minor-block + Go to beginning minor-block, skip whitespace at BOL. + +Returns beginning of minor-block if successful, nil otherwise +A minor block is started by a `for', `if', `try' or `with'. + + +** py-beginning-of-block-lc + Go to beginning block, go to BOL. + +Returns beginning of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-clause-lc + Go to beginning clause, go to BOL. + +Returns beginning of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-block-or-clause-lc + Go to beginning block-or-clause, go to BOL. + +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 + +** py-beginning-of-def-lc + Go to beginning def, go to BOL. + +Returns beginning of def if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-class-lc + Go to beginning class, go to BOL. + +Returns beginning of class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-def-or-class-lc + Go to beginning def-or-class, go to BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-if-block-lc + Go to beginning if-block, go to BOL. + +Returns beginning of if-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-try-block-lc + Go to beginning try-block, go to BOL. + +Returns beginning of try-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-minor-block-lc + Go to beginning minor-block, go to BOL. + +Returns beginning of minor-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning-of-top-level + Go up to beginning of statments until level of indentation is null. + +Returns position if successful, nil otherwise + +** py-end-of-top-level + Go to end of top-level form at point. + +Returns position if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-beginning + Go to beginning of compound statement or definition at point. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end + Go to end of of compound statement or definition at point. + +Returns position block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-up + Go up or to beginning of form if inside. + +If inside a delimited form --string or list-- go to it's beginning. +If not at beginning of a statement or block, go to it's beginning. +If at beginning of a statement or block, go to beginning one level above of compound statement or definition at point. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-down + Go to beginning one level below of compound statement or definition at point. + +If no statement or block below, but a delimited form --string or list-- go to it's beginning. Repeated call from there will behave like down-list. + +Returns position if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-block + Go to end of block. + +Returns end of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-clause + Go to end of clause. + +Returns end of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-block-or-clause + Go to end of block-or-clause. + +Returns end of block-or-clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-def + Go to end of def. + +Returns end of def if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-class + Go to end of class. + +Returns end of class if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-def-or-class + Go to end of def-or-class. + +Returns end of def-or-class if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-if-block + Go to end of if-block. + +Returns end of if-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-try-block + Go to end of try-block. + +Returns end of try-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +** py-end-of-minor-block + Go to end of minor-block. + +Returns end of minor-block if successful, nil otherwise + +A minor block is started by a `for', `if', `try' or `with'. + + +* Forms +** 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. + +** 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. + +** py-end-of-statement + Go to the last char of current statement. + +To go just beyond the final line of the current statement, use `py-down-statement-bol'. + +** py-goto-statement-below + Goto beginning of next statement. + +** py-beginning-of-decorator + Go to the beginning of a decorator. + +Returns position if succesful + +** py-end-of-decorator + Go to the end of a decorator. + +Returns position if succesful + +* Mark +** py-mark-paragraph + Mark paragraph at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-block + Mark block at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-minor-block + Mark minor-block at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-clause + Mark clause at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-block-or-clause + Mark block-or-clause at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-def + Mark def at point. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of marked area, a cons. + +** py-mark-class + Mark class at point. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of marked area, a cons. + +** py-mark-def-or-class + Mark def-or-class at point. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of marked area, a cons. + +** py-mark-line + Mark line at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-statement + Mark statement at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-top-level + Mark top-level form at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-expression + Mark expression at point. + +Returns beginning and end positions of marked area, a cons. + +** py-mark-partial-expression + Mark partial-expression at point. + +Returns beginning and end positions of marked area, a cons. + +* Copy +** py-copy-statement + Copy statement at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-top-level + Copy top-level at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-block + Copy block at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-clause + Copy clause at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-block-or-clause + Copy block-or-clause at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-def + Copy def at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-class + Copy class at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-def-or-class + Copy def-or-class at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-expression + Copy expression at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-partial-expression + Copy partial-expression at point. + +Store data in kill ring, so it might yanked back. + +** py-copy-minor-block + Copy minor-block at point. + +Store data in kill ring, so it might yanked back. + +* Delete +** py-delete-statement + Delete STATEMENT at point. + +Don't store data in kill ring. + +** py-delete-top-level + Delete TOP-LEVEL at point. + +Don't store data in kill ring. + +** py-delete-block + Delete BLOCK at point. + +Don't store data in kill ring. + +** py-delete-block-or-clause + Delete BLOCK-OR-CLAUSE at point. + +Don't store data in kill ring. + +** py-delete-def + Delete DEF at point. + +Don't store data in kill ring. + +** py-delete-class + Delete CLASS at point. + +Don't store data in kill ring. + +** py-delete-def-or-class + Delete DEF-OR-CLASS at point. + +Don't store data in kill ring. + +** py-delete-expression + Delete EXPRESSION at point. + +Don't store data in kill ring. + +** py-delete-partial-expression + Delete PARTIAL-EXPRESSION at point. + +Don't store data in kill ring. + +** py-delete-minor-block + Delete MINOR-BLOCK at point. + +Don't store data in kill ring. +A minor block is started by a `for', `if', `try' or `with'. + +* Kill +** py-kill-statements + Delete statements declared in current level. + +Store deleted statements in kill-ring + +** py-kill-declarations + Delete variables declared in current level. + +Store deleted variables in kill-ring + +** py-kill-expression + Delete expression at point. + Stores data in kill ring. Might be yanked back using `C-y'. + +** 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. + +** py-kill-statement + Delete statement at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-top-level + Delete top-level form at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-block + Delete block at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-minor-block + Delete minor-block at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-block-or-clause + Delete block-or-clause at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-def-or-class + Delete def-or-class at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-class + Delete class at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-def + Delete def at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-clause + Delete clause at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +* Beginning of line forms +** py-beginning-of-block-bol-p + Returns position, if cursor is at the beginning of block, at beginning of line, nil otherwise. + +** py-end-of-block-bol + Goto beginning of line following end of block. + Returns position reached, if successful, nil otherwise. + +See also `py-down-block': down from current definition to next beginning of block below. + +** py-mark-block-bol + Mark block, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +** py-copy-block-bol + Delete block bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-block-bol + Delete block bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-delete-block-bol + Delete block bol at point. + +Don't store data in kill ring. + +** py-beginning-of-clause-bol-p + Returns position, if cursor is at the beginning of clause, at beginning of line, nil otherwise. + +** py-end-of-clause-bol + Goto beginning of line following end of clause. + Returns position reached, if successful, nil otherwise. + +See also `py-down-clause': down from current definition to next beginning of clause below. + +** py-mark-clause-bol + Mark clause, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +** py-copy-clause-bol + Delete clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-clause-bol + Delete clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-delete-clause-bol + Delete clause bol at point. + +Don't store data in kill ring. + +** py-beginning-of-block-or-clause-bol-p + Returns position, if cursor is at the beginning of block-or-clause, at beginning of line, nil otherwise. + +** py-end-of-block-or-clause-bol + Goto beginning of line following end of block-or-clause. + Returns position reached, if successful, nil otherwise. + +See also `py-down-block-or-clause': down from current definition to next beginning of block-or-clause below. + +** py-mark-block-or-clause-bol + Mark block-or-clause, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +** py-copy-block-or-clause-bol + Delete block-or-clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-block-or-clause-bol + Delete block-or-clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-delete-block-or-clause-bol + Delete block-or-clause bol at point. + +Don't store data in kill ring. + +** py-beginning-of-def-bol-p + Returns position, if cursor is at the beginning of def, at beginning of line, nil otherwise. + +** py-end-of-def-bol + Goto beginning of line following end of def. + Returns position reached, if successful, nil otherwise. + +See also `py-down-def': down from current definition to next beginning of def below. + +** py-mark-def-bol + Mark def, take beginning of line positions. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. + +** py-copy-def-bol + Delete def bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-def-bol + Delete def bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-delete-def-bol + Delete def bol at point. + +Don't store data in kill ring. + +** py-beginning-of-class-bol-p + Returns position, if cursor is at the beginning of class, at beginning of line, nil otherwise. + +** py-end-of-class-bol + Goto beginning of line following end of class. + Returns position reached, if successful, nil otherwise. + +See also `py-down-class': down from current definition to next beginning of class below. + +** py-mark-class-bol + Mark class, take beginning of line positions. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. + +** py-copy-class-bol + Delete class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-class-bol + Delete class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-delete-class-bol + Delete class bol at point. + +Don't store data in kill ring. + +** py-beginning-of-def-or-class-bol-p + Returns position, if cursor is at the beginning of def-or-class, at beginning of line, nil otherwise. + +** py-end-of-def-or-class-bol + Goto beginning of line following end of def-or-class. + Returns position reached, if successful, nil otherwise. + +See also `py-down-def-or-class': down from current definition to next beginning of def-or-class below. + +** py-mark-def-or-class-bol + Mark def-or-class, take beginning of line positions. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. + +** py-copy-def-or-class-bol + Delete def-or-class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-def-or-class-bol + Delete def-or-class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-delete-def-or-class-bol + Delete def-or-class bol at point. + +Don't store data in kill ring. + +** py-beginning-of-statement-bol-p + Returns position, if cursor is at the beginning of statement, at beginning of line, nil otherwise. + +** py-beginning-of-statement-bol + Goto beginning of line where statement starts. + Returns position reached, if successful, nil otherwise. + +See also `py-up-statement': up from current definition to next beginning of statement above. + +** py-end-of-statement-bol + Goto beginning of line following end of statement. + Returns position reached, if successful, nil otherwise. + +See also `py-down-statement': down from current definition to next beginning of statement below. + +** py-mark-statement-bol + Mark statement, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +** py-copy-statement-bol + Delete statement bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-kill-statement-bol + Delete statement bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +** py-delete-statement-bol + Delete statement bol at point. + +Don't store data in kill ring. + +* Up/Down +** py-up-statement + Go to the beginning of next statement upwards in buffer. + +Return position if statement found, nil otherwise. + +** py-down-statement + Go to the beginning of next statement downwards in buffer. + +Return position if statement found, nil otherwise. + +** py-up-block + Go to the beginning of next block upwards in buffer. + +Return position if block found, nil otherwise. + +** py-up-minor-block + Go to the beginning of next minor-block upwards in buffer. + +Return position if minor-block found, nil otherwise. + +** py-up-clause + Go to the beginning of next clause upwards in buffer. + +Return position if clause found, nil otherwise. + +** py-up-block-or-clause + Go to the beginning of next block-or-clause upwards in buffer. + +Return position if block-or-clause found, nil otherwise. + +** py-up-def + Go to the beginning of next def upwards in buffer. + +Return position if def found, nil otherwise. + +** py-up-class + Go to the beginning of next class upwards in buffer. + +Return position if class found, nil otherwise. + +** py-up-def-or-class + Go to the beginning of next def-or-class upwards in buffer. + +Return position if def-or-class found, nil otherwise. + +** py-down-block + Go to the beginning of next block below in buffer. + +Return position if block found, nil otherwise. + +** py-down-minor-block + Go to the beginning of next minor-block below in buffer. + +Return position if minor-block found, nil otherwise. + +** py-down-clause + Go to the beginning of next clause below in buffer. + +Return position if clause found, nil otherwise. + +** py-down-block-or-clause + Go to the beginning of next block-or-clause below in buffer. + +Return position if block-or-clause found, nil otherwise. + +** py-down-def + Go to the beginning of next def below in buffer. + +Return position if def found, nil otherwise. + +** py-down-class + Go to the beginning of next class below in buffer. + +Return position if class found, nil otherwise. + +** py-down-def-or-class + Go to the beginning of next def-or-class below in buffer. + +Return position if def-or-class found, nil otherwise. + +** py-up-block-bol + Go to the beginning of next block upwards in buffer. + +Go to beginning of line. +Return position if block found, nil otherwise. + +** py-up-minor-block-bol + Go to the beginning of next minor-block upwards in buffer. + +Go to beginning of line. +Return position if minor-block found, nil otherwise. + +** py-up-clause-bol + Go to the beginning of next clause upwards in buffer. + +Go to beginning of line. +Return position if clause found, nil otherwise. + +** py-up-block-or-clause-bol + Go to the beginning of next block-or-clause upwards in buffer. + +Go to beginning of line. +Return position if block-or-clause found, nil otherwise. + +** py-up-def-bol + Go to the beginning of next def upwards in buffer. + +Go to beginning of line. +Return position if def found, nil otherwise. + +** py-up-class-bol + Go to the beginning of next class upwards in buffer. + +Go to beginning of line. +Return position if class found, nil otherwise. + +** py-up-def-or-class-bol + Go to the beginning of next def-or-class upwards in buffer. + +Go to beginning of line. +Return position if def-or-class found, nil otherwise. + +** py-down-block-bol + Go to the beginning of next block below in buffer. + +Go to beginning of line +Return position if block found, nil otherwise + +** py-down-minor-block-bol + Go to the beginning of next minor-block below in buffer. + +Go to beginning of line +Return position if minor-block found, nil otherwise + +** py-down-clause-bol + Go to the beginning of next clause below in buffer. + +Go to beginning of line +Return position if clause found, nil otherwise + +** py-down-block-or-clause-bol + Go to the beginning of next block-or-clause below in buffer. + +Go to beginning of line +Return position if block-or-clause found, nil otherwise + +** py-down-def-bol + Go to the beginning of next def below in buffer. + +Go to beginning of line +Return position if def found, nil otherwise + +** py-down-class-bol + Go to the beginning of next class below in buffer. + +Go to beginning of line +Return position if class found, nil otherwise + +** py-down-def-or-class-bol + Go to the beginning of next def-or-class below in buffer. + +Go to beginning of line +Return position if def-or-class found, nil otherwise + +** py-forward-into-nomenclature + Move forward to end of a nomenclature section or word. + +With C-u (programmatically, optional argument ARG), do it that many times. + +A `nomenclature' is a fancy way of saying AWordWithMixedCaseNotUnderscores. + +** py-backward-into-nomenclature + 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. + +** match-paren + 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  insert a `%'. + +* Python named shells +** python + Start an Python interpreter. + +Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'. + +** ipython + Start an IPython interpreter. + +Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'. + +** python3 + Start an Python3 interpreter. + +Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. + +** python2 + Start an Python2 interpreter. + +Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. + +** 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 + Start an Jython interpreter. + +Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'. + +** 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'. + +** python3\.3 + Start an Python3.3 interpreter. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +** python3\.4 + Start an Python3.3 interpreter. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +** bpython + Start an Bpython interpreter. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +** 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 + 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 + 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 + 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 + 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 + 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 + 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'. + +** python3\.3-dedicated + Start an unique Python3.3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +** bpython-dedicated + Start an unique Bpython interpreter in another window. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +** python-switch + Switch to Python interpreter in another window. + +Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'. + +** ipython-switch + Switch to IPython interpreter in another window. + +Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'. + +** python3-switch + Switch to Python3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. + +** python2-switch + Switch to Python2 interpreter in another window. + +Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. + +** python2\.7-switch + Switch to 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-switch + Switch to Jython interpreter in another window. + +Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'. + +** python3\.2-switch + Switch to Python3.2 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'. + +** python3\.3-switch + Switch to Python3.3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +** bpython-switch + Switch to Bpython interpreter in another window. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +** python-no-switch + Open an Python interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'. + +** ipython-no-switch + Open an IPython interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'. + +** python3-no-switch + Open an Python3 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. + +** python2-no-switch + Open an Python2 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. + +** python2\.7-no-switch + Open an Python2.7 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'. + +** jython-no-switch + Open an Jython interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'. + +** python3\.2-no-switch + Open an Python3.2 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'. + +** python3\.3-no-switch + Open an Python3.3 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +** bpython-no-switch + Open an Bpython interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +** python-switch-dedicated + Switch to 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-switch-dedicated + Switch to 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-switch-dedicated + Switch to 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-switch-dedicated + Switch to 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-switch-dedicated + Switch to 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-switch-dedicated + Switch to 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-switch-dedicated + Switch to 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'. + +** python3\.3-switch-dedicated + Switch to an unique Python3.3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +** bpython-switch-dedicated + Switch to an unique Bpython interpreter in another window. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +** py-which-execute-file-command + Return the command appropriate to Python version. + +Per default it's "(format "execfile(r'%s') # PYTHON-MODE\n" filename)" for Python 2 series. + +** py-execute-region-no-switch + Send the region to a Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p', buffer with region stays current. + + +** py-execute-region-switch + Send the region to a Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p', output-buffer will being switched to. + + +** py-execute-region + Send the region to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +When called with C-u 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 DEDICATED (boolean) + + +** py-execute-region-default + Send the region to the systems default Python interpreter. + +** py-execute-region-dedicated + Get the region processed by an unique Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +When called with C-u 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. + +** py-execute-region-default-dedicated + Send the region to an unique shell of systems default Python. + +** py-execute-python-mode-v5 + + +** py-execute-string + Send the argument STRING to a Python interpreter. + +See also `py-execute-region'. + +** py-execute-string-dedicated + Send the argument STRING to an unique Python interpreter. + +See also `py-execute-region'. + +** py-fetch-py-master-file + Lookup if a `py-master-file' is specified. + +See also doku of variable `py-master-file' + +** py-execute-import-or-reload + 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 `M-x py-execute-region'. + +This may be preferable to `M-x 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. + +** py-execute-buffer-dedicated + Send the contents of the buffer to a unique Python interpreter. + +** py-execute-buffer-switch + Send the contents of the buffer to a Python interpreter and switches to output. + +** py-execute-buffer-dedicated-switch + Send the contents of the buffer to an unique Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p'. + +** py-execute-buffer + Send the contents of the buffer to a Python interpreter. + +** py-execute-buffer-no-switch + Send the contents of the buffer to a Python interpreter but don't switch to output. + +** py-execute-defun + Send the current defun (class or method) to the inferior Python process. + +** py-process-file + Process "python filename". + +Optional OUTPUT-BUFFER and ERROR-BUFFER might be given. + +** py-execute-line + Send current line from beginning of indent to Python interpreter. + +** py-output-filter + Clear output buffer from py-shell-input prompt etc. + +** py-execute-file + When called interactively, user is prompted for filename. + +* Pdb +** py-pdbtrack-toggle-stack-tracking + Set variable `py-pdbtrack-do-tracking-p'. + +** turn-on-pdbtrack + + +** turn-off-pdbtrack + + +* Documentation +** py-documentation + Launch PyDOC on the Word at Point + +** 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. + +** py-find-imports + Find top-level imports. + +Returns imports + +** py-eldoc-function + Print help on symbol at point. + +** py-describe-symbol + Print help on symbol at point. + +If symbol is defined in current buffer, jump to it's definition +Optional C-u used for debugging, will prevent deletion of temp file. + +** py-describe-mode + Dump long form of `python-mode' docs. + +** py-load-file + 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. + +** py-find-definition + Find source of definition of SYMBOL. + +Interactively, prompt for SYMBOL. + +* Miscellanus +** 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. + +** py-nesting-level + Accepts the output of `parse-partial-sexp'. + +** py-beginning-of-commented-section + Leave upwards comments and/or empty lines. + +** py-continuation-offset + With numeric ARG different from 1 py-continuation-offset is set to that value; returns py-continuation-offset. + +** py-compute-indentation + 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. + +Optional arguments are flags resp. values set and used by `py-compute-indentation' internally + + +** py-indentation-of-statement + Returns the indenation of the statement at point. + +** py-guess-default-python + Defaults to "python", if guessing didn't succeed. + +** py-set-ipython-completion-command-string + Set and return `ipython-completion-command-string'. + +** py-shell-dedicated + Start an interactive Python interpreter in another window. + +With optional C-u user is prompted by +`py-choose-shell' for command and options to pass to the Python +interpreter. + + +** py-shell + Start an interactive Python interpreter in another window. +Interactively, C-u 4 prompts for a buffer. +C-u 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'. +BUFFER allows specifying a name, the Python process is connected to +When DONE is `t', `py-shell-manage-windows' is omitted + + +** py-indent-forward-line + 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 M-x universal argument just indent. + + +** py-dedent-forward-line + Dedent line and move one line forward. + +** py-dedent + 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'. + +** 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. + +** 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. + +** 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. + +** 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. + +** py-class-at-point + Return class definition as string. + +With interactive call, send it to the message buffer too. + +** py-line-at-point + Return line as string. + With interactive call, send it to the message buffer too. + +** py-looking-at-keywords-p + If looking at a python keyword. Returns t or nil. + +** py-match-paren-mode + py-match-paren-mode nil oder t + +** 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. + +** py-printform-insert + Inserts a print statement out of current `(car kill-ring)' by default, inserts ARG instead if delivered. + +** eva + Put "eval(...)" forms around strings at point. + +** pst-here + Kill previous "pdb.set_trace()" and insert it at point. + +** py-line-to-printform-python2 + Transforms the item on current in a print statement. + +* Imenu +** py-switch-imenu-index-function + Switch between series 5. index machine `py-imenu-create-index' and `py-imenu-create-index-new', which also lists modules variables + +** py-toggle-local-default-use + + +** py-choose-shell-by-path + Select Python executable according to version desplayed in path, current buffer-file is selected from. + +Returns versioned string, nil if nothing appropriate found + +** py-choose-shell-by-shebang + Choose shell by looking at #! on the first line. + +Returns the specified Python resp. Jython shell command name. + +** py-which-python + Returns version of Python of current environment, a number. + +** py-python-current-environment + Returns path of current Python installation. + +** py-switch-shell + 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. + +C-u `py-toggle-shell' prompts to specify a reachable Python command. +C-u followed by numerical arg 2 or 3, `py-toggle-shell' opens a respective Python shell. +C-u 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") + + +** py-choose-shell + 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 C-u 4 is called `py-switch-shell' see docu there. + + +** py-install-directory-check + Do some sanity check for `py-install-directory'. + +Returns `t' if successful. + +** py-guess-py-install-directory + Takes value of user directory aka $HOME +if `(locate-library "python-mode")' is not succesful. + +Used only, if `py-install-directory' is empty. + +** py-set-load-path + Include needed subdirs of python-mode directory. + +* Abbrevs +** py-edit-abbrevs + Jumps to `python-mode-abbrev-table' in a buffer containing lists of abbrev definitions. +You can edit them and type C-c C-c 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). + +** py-add-abbrev + 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. + +** py-python-version + Returns versions number of a Python EXECUTABLE, string. + +If no EXECUTABLE given, `py-shell-name' is used. +Interactively output of `--version' is displayed. + +** py-version + Echo the current version of `python-mode' in the minibuffer. + +** py-install-search-local + + +** py-install-local-shells + 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'. + +* Completion +** py-python-script-complete + Complete word before point, if any. + +When `py-no-completion-calls-dabbrev-expand-p' is non-nil, try dabbrev-expand. Otherwise, when `py-indent-no-completion-p' is non-nil, call `tab-to-tab-stop'. + +** py-python2-shell-complete + + +** py-python3-shell-complete + Complete word before point, if any. Otherwise insert TAB. + +** py-shell-complete + Complete word before point, if any. Otherwise insert TAB. + +** ipython-complete + Complete the python symbol before point. + +If no completion available, insert a TAB. +Returns the completed symbol, a string, if successful, nil otherwise. + +* Checker +** pylint-flymake-mode + Toggle `pylint' `flymake-mode'. + +** pyflakes-flymake-mode + Toggle `pyflakes' `flymake-mode'. + +** pychecker-flymake-mode + Toggle `pychecker' `flymake-mode'. + +** pep8-flymake-mode + Toggle `pep8' `flymake-mode'. + +** pyflakespep8-flymake-mode + Toggle `pyflakespep8' `flymake-mode'. + +Joint call to pyflakes and pep8 as proposed by + +Keegan Carruthers-Smith + + + +** py-pep8-run + Run pep8, check formatting (default on the file currently visited). + + +** py-pep8-help + Display pep8 command line help messages. + +** py-pylint-run + 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 + +** py-pylint-help + Display Pylint command line help messages. + +Let's have this until more Emacs-like help is prepared + +** py-pylint-doku + Display Pylint Documentation. + +Calls `pylint --full-documentation' + +** py-pyflakes-run + 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 + +** py-pyflakes-help + Display Pyflakes command line help messages. + +Let's have this until more Emacs-like help is prepared + +** py-pyflakespep8-run + Run pyflakespep8, check formatting (default on the file currently visited). + + +** py-pyflakespep8-help + Display pyflakespep8 command line help messages. + +** py-flake8-run + Run flake8, check formatting (default on the file currently visited). + + +** py-flake8-help + Display flake8 command line help messages. + +** py-pychecker-run + Run pychecker (default on the file currently visited). + +* Skeletons +** py-load-skeletons + These skeletons are loaded by python-mode, if `py-load-skeletons-p' is non-nil. + +* Virtualenv +** (defun v + + +** virtualenv-current + Barfs the current activated virtualenv + +** virtualenv-activate + Activate the virtualenv located in DIR + +** virtualenv-deactivate + Deactivate the current virtual enviroment + +** virtualenv-workon + Issue a virtualenvwrapper-like virtualenv-workon command + +* Execute forms at point +** py-execute-statement + Send statement at point to a Python interpreter. + +** py-execute-top-level + Send top-level at point to a Python interpreter. + +** py-execute-block + Send block at point to a Python interpreter. + +** py-execute-minor-block + Send minor-block at point to a Python interpreter. + +A minor block is started by a `for', `if', `try' or `with'. + + +** py-execute-block-or-clause + Send block-or-clause at point to a Python interpreter. + +** py-execute-def + Send def at point to a Python interpreter. + +** py-execute-class + Send class at point to a Python interpreter. + +** py-execute-def-or-class + Send def-or-class at point to a Python interpreter. + +** py-execute-expression + Send expression at point to a Python interpreter. + +** py-execute-partial-expression + Send partial-expression at point to a Python interpreter. + +* Execute line +* Execute file commands +** py-execute-file-python + Send file to a Python interpreter. + +** py-execute-file-python-switch + Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python-no-switch + Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-python-dedicated + Send file to a Python interpreter. + +Uses a dedicated shell. + +** py-execute-file-python-dedicated-switch + Send file to a Python interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-ipython + Send file to a Ipython interpreter. + +** py-execute-file-ipython-switch + Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-ipython-no-switch + Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-ipython-dedicated + Send file to a Ipython interpreter. + +Uses a dedicated shell. + +** py-execute-file-ipython-dedicated-switch + Send file to a Ipython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python3 + Send file to a Python3 interpreter. + +** py-execute-file-python3-switch + Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python3-no-switch + Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-python3-dedicated + Send file to a Python3 interpreter. + +Uses a dedicated shell. + +** py-execute-file-python3-dedicated-switch + Send file to a Python3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python2 + Send file to a Python2 interpreter. + +** py-execute-file-python2-switch + Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python2-no-switch + Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-python2-dedicated + Send file to a Python2 interpreter. + +Uses a dedicated shell. + +** py-execute-file-python2-dedicated-switch + Send file to a Python2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python2\.7 + Send file to a Python2.7 interpreter. + +** py-execute-file-python2\.7-switch + Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python2\.7-no-switch + Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-python2\.7-dedicated + Send file to a Python2.7 interpreter. + +Uses a dedicated shell. + +** py-execute-file-python2\.7-dedicated-switch + Send file to a Python2.7 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-jython + Send file to a Jython interpreter. + +** py-execute-file-jython-switch + Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-jython-no-switch + Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-jython-dedicated + Send file to a Jython interpreter. + +Uses a dedicated shell. + +** py-execute-file-jython-dedicated-switch + Send file to a Jython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python3\.2 + Send file to a Python3.2 interpreter. + +** py-execute-file-python3\.2-switch + Send file to a Python3.2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python3\.2-no-switch + Send file to a Python3.2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-python3\.2-dedicated + Send file to a Python3.2 interpreter. + +Uses a dedicated shell. + +** py-execute-file-python3\.2-dedicated-switch + Send file to a Python3.2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python3\.3 + Send file to a Python3.3 interpreter. + +** py-execute-file-python3\.3-switch + Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-python3\.3-no-switch + Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-python3\.3-dedicated + Send file to a Python3.3 interpreter. + +Uses a dedicated shell. + +** py-execute-file-python3\.3-dedicated-switch + Send file to a Python3.3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-bpython + Send file to a Bpython interpreter. + +** py-execute-file-bpython-switch + Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +** py-execute-file-bpython-no-switch + Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +** py-execute-file-bpython-dedicated + Send file to a Bpython interpreter. + +Uses a dedicated shell. + +** py-execute-file-bpython-dedicated-switch + Send file to a Bpython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +* Extended executes +** py-execute-statement-python + Send statement at point to Python interpreter. + +** py-execute-statement-python-switch + Send statement at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-python-no-switch + Send statement at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-python-dedicated + Send statement at point to Python unique interpreter. + +** py-execute-statement-python-dedicated-switch + Send statement at point to Python unique interpreter and switch to result. + +** py-execute-statement-ipython + Send statement at point to IPython interpreter. + +** py-execute-statement-ipython-switch + Send statement at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-ipython-no-switch + Send statement at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-ipython-dedicated + Send statement at point to IPython unique interpreter. + +** py-execute-statement-ipython-dedicated-switch + Send statement at point to IPython unique interpreter and switch to result. + +** py-execute-statement-python3 + Send statement at point to Python3 interpreter. + +** py-execute-statement-python3-switch + Send statement at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-python3-no-switch + Send statement at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-python3-dedicated + Send statement at point to Python3 unique interpreter. + +** py-execute-statement-python3-dedicated-switch + Send statement at point to Python3 unique interpreter and switch to result. + +** py-execute-statement-python2 + Send statement at point to Python2 interpreter. + +** py-execute-statement-python2-switch + Send statement at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-python2-no-switch + Send statement at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-python2-dedicated + Send statement at point to Python2 unique interpreter. + +** py-execute-statement-python2-dedicated-switch + Send statement at point to Python2 unique interpreter and switch to result. + +** py-execute-statement-python2\.7 + Send statement at point to Python2.7 interpreter. + +** py-execute-statement-python2\.7-switch + Send statement at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-python2\.7-no-switch + Send statement at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-python2\.7-dedicated + Send statement at point to Python2.7 unique interpreter. + +** py-execute-statement-python2\.7-dedicated-switch + Send statement at point to Python2.7 unique interpreter and switch to result. + +** py-execute-statement-jython + Send statement at point to Jython interpreter. + +** py-execute-statement-jython-switch + Send statement at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-jython-no-switch + Send statement at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-jython-dedicated + Send statement at point to Jython unique interpreter. + +** py-execute-statement-jython-dedicated-switch + Send statement at point to Jython unique interpreter and switch to result. + +** py-execute-statement-python3\.2 + Send statement at point to Python3.2 interpreter. + +** py-execute-statement-python3\.2-switch + Send statement at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-python3\.2-no-switch + Send statement at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-python3\.2-dedicated + Send statement at point to Python3.2 unique interpreter. + +** py-execute-statement-python3\.2-dedicated-switch + Send statement at point to Python3.2 unique interpreter and switch to result. + +** py-execute-statement-python3\.3 + Send statement at point to Python3.3 interpreter. + +** py-execute-statement-python3\.3-switch + Send statement at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-python3\.3-no-switch + Send statement at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-python3\.3-dedicated + Send statement at point to Python3.3 unique interpreter. + +** py-execute-statement-python3\.3-dedicated-switch + Send statement at point to Python3.3 unique interpreter and switch to result. + +** py-execute-statement-bpython + Send statement at point to Bpython interpreter. + +** py-execute-statement-bpython-switch + Send statement at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-statement-bpython-no-switch + Send statement at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-statement-bpython-dedicated + Send statement at point to Bpython unique interpreter. + +** py-execute-statement-bpython-dedicated-switch + Send statement at point to Bpython unique interpreter and switch to result. + +** py-execute-block-python + Send block at point to Python interpreter. + +** py-execute-block-python-switch + Send block at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-python-no-switch + Send block at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-python-dedicated + Send block at point to Python unique interpreter. + +** py-execute-block-python-dedicated-switch + Send block at point to Python unique interpreter and switch to result. + +** py-execute-block-ipython + Send block at point to IPython interpreter. + +** py-execute-block-ipython-switch + Send block at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-ipython-no-switch + Send block at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-ipython-dedicated + Send block at point to IPython unique interpreter. + +** py-execute-block-ipython-dedicated-switch + Send block at point to IPython unique interpreter and switch to result. + +** py-execute-block-python3 + Send block at point to Python3 interpreter. + +** py-execute-block-python3-switch + Send block at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-python3-no-switch + Send block at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-python3-dedicated + Send block at point to Python3 unique interpreter. + +** py-execute-block-python3-dedicated-switch + Send block at point to Python3 unique interpreter and switch to result. + +** py-execute-block-python2 + Send block at point to Python2 interpreter. + +** py-execute-block-python2-switch + Send block at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-python2-no-switch + Send block at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-python2-dedicated + Send block at point to Python2 unique interpreter. + +** py-execute-block-python2-dedicated-switch + Send block at point to Python2 unique interpreter and switch to result. + +** py-execute-block-python2\.7 + Send block at point to Python2.7 interpreter. + +** py-execute-block-python2\.7-switch + Send block at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-python2\.7-no-switch + Send block at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-python2\.7-dedicated + Send block at point to Python2.7 unique interpreter. + +** py-execute-block-python2\.7-dedicated-switch + Send block at point to Python2.7 unique interpreter and switch to result. + +** py-execute-block-jython + Send block at point to Jython interpreter. + +** py-execute-block-jython-switch + Send block at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-jython-no-switch + Send block at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-jython-dedicated + Send block at point to Jython unique interpreter. + +** py-execute-block-jython-dedicated-switch + Send block at point to Jython unique interpreter and switch to result. + +** py-execute-block-python3\.2 + Send block at point to Python3.2 interpreter. + +** py-execute-block-python3\.2-switch + Send block at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-python3\.2-no-switch + Send block at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-python3\.2-dedicated + Send block at point to Python3.2 unique interpreter. + +** py-execute-block-python3\.2-dedicated-switch + Send block at point to Python3.2 unique interpreter and switch to result. + +** py-execute-block-python3\.3 + Send block at point to Python3.3 interpreter. + +** py-execute-block-python3\.3-switch + Send block at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-python3\.3-no-switch + Send block at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-python3\.3-dedicated + Send block at point to Python3.3 unique interpreter. + +** py-execute-block-python3\.3-dedicated-switch + Send block at point to Python3.3 unique interpreter and switch to result. + +** py-execute-block-bpython + Send block at point to Bpython interpreter. + +** py-execute-block-bpython-switch + Send block at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-bpython-no-switch + Send block at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-bpython-dedicated + Send block at point to Bpython unique interpreter. + +** py-execute-block-bpython-dedicated-switch + Send block at point to Bpython unique interpreter and switch to result. + +** py-execute-clause-python + Send clause at point to Python interpreter. + +** py-execute-clause-python-switch + Send clause at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-python-no-switch + Send clause at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-python-dedicated + Send clause at point to Python unique interpreter. + +** py-execute-clause-python-dedicated-switch + Send clause at point to Python unique interpreter and switch to result. + +** py-execute-clause-ipython + Send clause at point to IPython interpreter. + +** py-execute-clause-ipython-switch + Send clause at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-ipython-no-switch + Send clause at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-ipython-dedicated + Send clause at point to IPython unique interpreter. + +** py-execute-clause-ipython-dedicated-switch + Send clause at point to IPython unique interpreter and switch to result. + +** py-execute-clause-python3 + Send clause at point to Python3 interpreter. + +** py-execute-clause-python3-switch + Send clause at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-python3-no-switch + Send clause at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-python3-dedicated + Send clause at point to Python3 unique interpreter. + +** py-execute-clause-python3-dedicated-switch + Send clause at point to Python3 unique interpreter and switch to result. + +** py-execute-clause-python2 + Send clause at point to Python2 interpreter. + +** py-execute-clause-python2-switch + Send clause at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-python2-no-switch + Send clause at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-python2-dedicated + Send clause at point to Python2 unique interpreter. + +** py-execute-clause-python2-dedicated-switch + Send clause at point to Python2 unique interpreter and switch to result. + +** py-execute-clause-python2\.7 + Send clause at point to Python2.7 interpreter. + +** py-execute-clause-python2\.7-switch + Send clause at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-python2\.7-no-switch + Send clause at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-python2\.7-dedicated + Send clause at point to Python2.7 unique interpreter. + +** py-execute-clause-python2\.7-dedicated-switch + Send clause at point to Python2.7 unique interpreter and switch to result. + +** py-execute-clause-jython + Send clause at point to Jython interpreter. + +** py-execute-clause-jython-switch + Send clause at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-jython-no-switch + Send clause at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-jython-dedicated + Send clause at point to Jython unique interpreter. + +** py-execute-clause-jython-dedicated-switch + Send clause at point to Jython unique interpreter and switch to result. + +** py-execute-clause-python3\.2 + Send clause at point to Python3.2 interpreter. + +** py-execute-clause-python3\.2-switch + Send clause at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-python3\.2-no-switch + Send clause at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-python3\.2-dedicated + Send clause at point to Python3.2 unique interpreter. + +** py-execute-clause-python3\.2-dedicated-switch + Send clause at point to Python3.2 unique interpreter and switch to result. + +** py-execute-clause-python3\.3 + Send clause at point to Python3.3 interpreter. + +** py-execute-clause-python3\.3-switch + Send clause at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-python3\.3-no-switch + Send clause at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-python3\.3-dedicated + Send clause at point to Python3.3 unique interpreter. + +** py-execute-clause-python3\.3-dedicated-switch + Send clause at point to Python3.3 unique interpreter and switch to result. + +** py-execute-clause-bpython + Send clause at point to Bpython interpreter. + +** py-execute-clause-bpython-switch + Send clause at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-clause-bpython-no-switch + Send clause at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-clause-bpython-dedicated + Send clause at point to Bpython unique interpreter. + +** py-execute-clause-bpython-dedicated-switch + Send clause at point to Bpython unique interpreter and switch to result. + +** py-execute-block-or-clause-python + Send block-or-clause at point to Python interpreter. + +** py-execute-block-or-clause-python-switch + Send block-or-clause at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-python-no-switch + Send block-or-clause at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-python-dedicated + Send block-or-clause at point to Python unique interpreter. + +** py-execute-block-or-clause-python-dedicated-switch + Send block-or-clause at point to Python unique interpreter and switch to result. + +** py-execute-block-or-clause-ipython + Send block-or-clause at point to IPython interpreter. + +** py-execute-block-or-clause-ipython-switch + Send block-or-clause at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-ipython-no-switch + Send block-or-clause at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-ipython-dedicated + Send block-or-clause at point to IPython unique interpreter. + +** py-execute-block-or-clause-ipython-dedicated-switch + Send block-or-clause at point to IPython unique interpreter and switch to result. + +** py-execute-block-or-clause-python3 + Send block-or-clause at point to Python3 interpreter. + +** py-execute-block-or-clause-python3-switch + Send block-or-clause at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-python3-no-switch + Send block-or-clause at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-python3-dedicated + Send block-or-clause at point to Python3 unique interpreter. + +** py-execute-block-or-clause-python3-dedicated-switch + Send block-or-clause at point to Python3 unique interpreter and switch to result. + +** py-execute-block-or-clause-python2 + Send block-or-clause at point to Python2 interpreter. + +** py-execute-block-or-clause-python2-switch + Send block-or-clause at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-python2-no-switch + Send block-or-clause at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-python2-dedicated + Send block-or-clause at point to Python2 unique interpreter. + +** py-execute-block-or-clause-python2-dedicated-switch + Send block-or-clause at point to Python2 unique interpreter and switch to result. + +** py-execute-block-or-clause-python2\.7 + Send block-or-clause at point to Python2.7 interpreter. + +** py-execute-block-or-clause-python2\.7-switch + Send block-or-clause at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-python2\.7-no-switch + Send block-or-clause at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-python2\.7-dedicated + Send block-or-clause at point to Python2.7 unique interpreter. + +** py-execute-block-or-clause-python2\.7-dedicated-switch + Send block-or-clause at point to Python2.7 unique interpreter and switch to result. + +** py-execute-block-or-clause-jython + Send block-or-clause at point to Jython interpreter. + +** py-execute-block-or-clause-jython-switch + Send block-or-clause at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-jython-no-switch + Send block-or-clause at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-jython-dedicated + Send block-or-clause at point to Jython unique interpreter. + +** py-execute-block-or-clause-jython-dedicated-switch + Send block-or-clause at point to Jython unique interpreter and switch to result. + +** py-execute-block-or-clause-python3\.2 + Send block-or-clause at point to Python3.2 interpreter. + +** py-execute-block-or-clause-python3\.2-switch + Send block-or-clause at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-python3\.2-no-switch + Send block-or-clause at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-python3\.2-dedicated + Send block-or-clause at point to Python3.2 unique interpreter. + +** py-execute-block-or-clause-python3\.2-dedicated-switch + Send block-or-clause at point to Python3.2 unique interpreter and switch to result. + +** py-execute-block-or-clause-python3\.3 + Send block-or-clause at point to Python3.3 interpreter. + +** py-execute-block-or-clause-python3\.3-switch + Send block-or-clause at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-python3\.3-no-switch + Send block-or-clause at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-python3\.3-dedicated + Send block-or-clause at point to Python3.3 unique interpreter. + +** py-execute-block-or-clause-python3\.3-dedicated-switch + Send block-or-clause at point to Python3.3 unique interpreter and switch to result. + +** py-execute-block-or-clause-bpython + Send block-or-clause at point to Bpython interpreter. + +** py-execute-block-or-clause-bpython-switch + Send block-or-clause at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-block-or-clause-bpython-no-switch + Send block-or-clause at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-block-or-clause-bpython-dedicated + Send block-or-clause at point to Bpython unique interpreter. + +** py-execute-block-or-clause-bpython-dedicated-switch + Send block-or-clause at point to Bpython unique interpreter and switch to result. + +** py-execute-def-python + Send def at point to Python interpreter. + +** py-execute-def-python-switch + Send def at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-python-no-switch + Send def at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-python-dedicated + Send def at point to Python unique interpreter. + +** py-execute-def-python-dedicated-switch + Send def at point to Python unique interpreter and switch to result. + +** py-execute-def-ipython + Send def at point to IPython interpreter. + +** py-execute-def-ipython-switch + Send def at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-ipython-no-switch + Send def at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-ipython-dedicated + Send def at point to IPython unique interpreter. + +** py-execute-def-ipython-dedicated-switch + Send def at point to IPython unique interpreter and switch to result. + +** py-execute-def-python3 + Send def at point to Python3 interpreter. + +** py-execute-def-python3-switch + Send def at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-python3-no-switch + Send def at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-python3-dedicated + Send def at point to Python3 unique interpreter. + +** py-execute-def-python3-dedicated-switch + Send def at point to Python3 unique interpreter and switch to result. + +** py-execute-def-python2 + Send def at point to Python2 interpreter. + +** py-execute-def-python2-switch + Send def at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-python2-no-switch + Send def at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-python2-dedicated + Send def at point to Python2 unique interpreter. + +** py-execute-def-python2-dedicated-switch + Send def at point to Python2 unique interpreter and switch to result. + +** py-execute-def-python2\.7 + Send def at point to Python2.7 interpreter. + +** py-execute-def-python2\.7-switch + Send def at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-python2\.7-no-switch + Send def at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-python2\.7-dedicated + Send def at point to Python2.7 unique interpreter. + +** py-execute-def-python2\.7-dedicated-switch + Send def at point to Python2.7 unique interpreter and switch to result. + +** py-execute-def-jython + Send def at point to Jython interpreter. + +** py-execute-def-jython-switch + Send def at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-jython-no-switch + Send def at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-jython-dedicated + Send def at point to Jython unique interpreter. + +** py-execute-def-jython-dedicated-switch + Send def at point to Jython unique interpreter and switch to result. + +** py-execute-def-python3\.2 + Send def at point to Python3.2 interpreter. + +** py-execute-def-python3\.2-switch + Send def at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-python3\.2-no-switch + Send def at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-python3\.2-dedicated + Send def at point to Python3.2 unique interpreter. + +** py-execute-def-python3\.2-dedicated-switch + Send def at point to Python3.2 unique interpreter and switch to result. + +** py-execute-def-python3\.3 + Send def at point to Python3.3 interpreter. + +** py-execute-def-python3\.3-switch + Send def at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-python3\.3-no-switch + Send def at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-python3\.3-dedicated + Send def at point to Python3.3 unique interpreter. + +** py-execute-def-python3\.3-dedicated-switch + Send def at point to Python3.3 unique interpreter and switch to result. + +** py-execute-def-bpython + Send def at point to Bpython interpreter. + +** py-execute-def-bpython-switch + Send def at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-def-bpython-no-switch + Send def at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-def-bpython-dedicated + Send def at point to Bpython unique interpreter. + +** py-execute-def-bpython-dedicated-switch + Send def at point to Bpython unique interpreter and switch to result. + +** py-execute-class-python + Send class at point to Python interpreter. + +** py-execute-class-python-switch + Send class at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-python-no-switch + Send class at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-python-dedicated + Send class at point to Python unique interpreter. + +** py-execute-class-python-dedicated-switch + Send class at point to Python unique interpreter and switch to result. + +** py-execute-class-ipython + Send class at point to IPython interpreter. + +** py-execute-class-ipython-switch + Send class at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-ipython-no-switch + Send class at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-ipython-dedicated + Send class at point to IPython unique interpreter. + +** py-execute-class-ipython-dedicated-switch + Send class at point to IPython unique interpreter and switch to result. + +** py-execute-class-python3 + Send class at point to Python3 interpreter. + +** py-execute-class-python3-switch + Send class at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-python3-no-switch + Send class at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-python3-dedicated + Send class at point to Python3 unique interpreter. + +** py-execute-class-python3-dedicated-switch + Send class at point to Python3 unique interpreter and switch to result. + +** py-execute-class-python2 + Send class at point to Python2 interpreter. + +** py-execute-class-python2-switch + Send class at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-python2-no-switch + Send class at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-python2-dedicated + Send class at point to Python2 unique interpreter. + +** py-execute-class-python2-dedicated-switch + Send class at point to Python2 unique interpreter and switch to result. + +** py-execute-class-python2\.7 + Send class at point to Python2.7 interpreter. + +** py-execute-class-python2\.7-switch + Send class at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-python2\.7-no-switch + Send class at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-python2\.7-dedicated + Send class at point to Python2.7 unique interpreter. + +** py-execute-class-python2\.7-dedicated-switch + Send class at point to Python2.7 unique interpreter and switch to result. + +** py-execute-class-jython + Send class at point to Jython interpreter. + +** py-execute-class-jython-switch + Send class at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-jython-no-switch + Send class at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-jython-dedicated + Send class at point to Jython unique interpreter. + +** py-execute-class-jython-dedicated-switch + Send class at point to Jython unique interpreter and switch to result. + +** py-execute-class-python3\.2 + Send class at point to Python3.2 interpreter. + +** py-execute-class-python3\.2-switch + Send class at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-python3\.2-no-switch + Send class at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-python3\.2-dedicated + Send class at point to Python3.2 unique interpreter. + +** py-execute-class-python3\.2-dedicated-switch + Send class at point to Python3.2 unique interpreter and switch to result. + +** py-execute-class-python3\.3 + Send class at point to Python3.3 interpreter. + +** py-execute-class-python3\.3-switch + Send class at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-python3\.3-no-switch + Send class at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-python3\.3-dedicated + Send class at point to Python3.3 unique interpreter. + +** py-execute-class-python3\.3-dedicated-switch + Send class at point to Python3.3 unique interpreter and switch to result. + +** py-execute-class-bpython + Send class at point to Bpython interpreter. + +** py-execute-class-bpython-switch + Send class at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-class-bpython-no-switch + Send class at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-class-bpython-dedicated + Send class at point to Bpython unique interpreter. + +** py-execute-class-bpython-dedicated-switch + Send class at point to Bpython unique interpreter and switch to result. + +** py-execute-region-python + Send region at point to Python interpreter. + +** py-execute-region-python-switch + Send region at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-python-no-switch + Send region at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-python-dedicated + Send region at point to Python unique interpreter. + +** py-execute-region-python-dedicated-switch + Send region at point to Python unique interpreter and switch to result. + +** py-execute-region-ipython + Send region at point to IPython interpreter. + +** py-execute-region-ipython-switch + Send region at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-ipython-no-switch + Send region at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-ipython-dedicated + Send region at point to IPython unique interpreter. + +** py-execute-region-ipython-dedicated-switch + Send region at point to IPython unique interpreter and switch to result. + +** py-execute-region-python3 + Send region at point to Python3 interpreter. + +** py-execute-region-python3-switch + Send region at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-python3-no-switch + Send region at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-python3-dedicated + Send region at point to Python3 unique interpreter. + +** py-execute-region-python3-dedicated-switch + Send region at point to Python3 unique interpreter and switch to result. + +** py-execute-region-python2 + Send region at point to Python2 interpreter. + +** py-execute-region-python2-switch + Send region at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-python2-no-switch + Send region at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-python2-dedicated + Send region at point to Python2 unique interpreter. + +** py-execute-region-python2-dedicated-switch + Send region at point to Python2 unique interpreter and switch to result. + +** py-execute-region-python2\.7 + Send region at point to Python2.7 interpreter. + +** py-execute-region-python2\.7-switch + Send region at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-python2\.7-no-switch + Send region at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-python2\.7-dedicated + Send region at point to Python2.7 unique interpreter. + +** py-execute-region-python2\.7-dedicated-switch + Send region at point to Python2.7 unique interpreter and switch to result. + +** py-execute-region-jython + Send region at point to Jython interpreter. + +** py-execute-region-jython-switch + Send region at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-jython-no-switch + Send region at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-jython-dedicated + Send region at point to Jython unique interpreter. + +** py-execute-region-jython-dedicated-switch + Send region at point to Jython unique interpreter and switch to result. + +** py-execute-region-python3\.2 + Send region at point to Python3.2 interpreter. + +** py-execute-region-python3\.2-switch + Send region at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-python3\.2-no-switch + Send region at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-python3\.2-dedicated + Send region at point to Python3.2 unique interpreter. + +** py-execute-region-python3\.2-dedicated-switch + Send region at point to Python3.2 unique interpreter and switch to result. + +** py-execute-region-python3\.3 + Send region at point to Python3.3 interpreter. + +** py-execute-region-python3\.3-switch + Send region at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-python3\.3-no-switch + Send region at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-python3\.3-dedicated + Send region at point to Python3.3 unique interpreter. + +** py-execute-region-python3\.3-dedicated-switch + Send region at point to Python3.3 unique interpreter and switch to result. + +** py-execute-region-bpython + Send region at point to Bpython interpreter. + +** py-execute-region-bpython-switch + Send region at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-region-bpython-no-switch + Send region at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-region-bpython-dedicated + Send region at point to Bpython unique interpreter. + +** py-execute-region-bpython-dedicated-switch + Send region at point to Bpython unique interpreter and switch to result. + +** py-execute-buffer-python + Send buffer at point to Python interpreter. + +** py-execute-buffer-python-switch + Send buffer at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-python-no-switch + Send buffer at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-python-dedicated + Send buffer at point to Python unique interpreter. + +** py-execute-buffer-python-dedicated-switch + Send buffer at point to Python unique interpreter and switch to result. + +** py-execute-buffer-ipython + Send buffer at point to IPython interpreter. + +** py-execute-buffer-ipython-switch + Send buffer at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-ipython-no-switch + Send buffer at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-ipython-dedicated + Send buffer at point to IPython unique interpreter. + +** py-execute-buffer-ipython-dedicated-switch + Send buffer at point to IPython unique interpreter and switch to result. + +** py-execute-buffer-python3 + Send buffer at point to Python3 interpreter. + +** py-execute-buffer-python3-switch + Send buffer at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-python3-no-switch + Send buffer at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-python3-dedicated + Send buffer at point to Python3 unique interpreter. + +** py-execute-buffer-python3-dedicated-switch + Send buffer at point to Python3 unique interpreter and switch to result. + +** py-execute-buffer-python2 + Send buffer at point to Python2 interpreter. + +** py-execute-buffer-python2-switch + Send buffer at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-python2-no-switch + Send buffer at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-python2-dedicated + Send buffer at point to Python2 unique interpreter. + +** py-execute-buffer-python2-dedicated-switch + Send buffer at point to Python2 unique interpreter and switch to result. + +** py-execute-buffer-python2\.7 + Send buffer at point to Python2.7 interpreter. + +** py-execute-buffer-python2\.7-switch + Send buffer at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-python2\.7-no-switch + Send buffer at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-python2\.7-dedicated + Send buffer at point to Python2.7 unique interpreter. + +** py-execute-buffer-python2\.7-dedicated-switch + Send buffer at point to Python2.7 unique interpreter and switch to result. + +** py-execute-buffer-jython + Send buffer at point to Jython interpreter. + +** py-execute-buffer-jython-switch + Send buffer at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-jython-no-switch + Send buffer at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-jython-dedicated + Send buffer at point to Jython unique interpreter. + +** py-execute-buffer-jython-dedicated-switch + Send buffer at point to Jython unique interpreter and switch to result. + +** py-execute-buffer-python3\.2 + Send buffer at point to Python3.2 interpreter. + +** py-execute-buffer-python3\.2-switch + Send buffer at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-python3\.2-no-switch + Send buffer at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-python3\.2-dedicated + Send buffer at point to Python3.2 unique interpreter. + +** py-execute-buffer-python3\.2-dedicated-switch + Send buffer at point to Python3.2 unique interpreter and switch to result. + +** py-execute-buffer-python3\.3 + Send buffer at point to Python3.3 interpreter. + +** py-execute-buffer-python3\.3-switch + Send buffer at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-python3\.3-no-switch + Send buffer at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-python3\.3-dedicated + Send buffer at point to Python3.3 unique interpreter. + +** py-execute-buffer-python3\.3-dedicated-switch + Send buffer at point to Python3.3 unique interpreter and switch to result. + +** py-execute-buffer-bpython + Send buffer at point to Bpython interpreter. + +** py-execute-buffer-bpython-switch + Send buffer at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-buffer-bpython-no-switch + Send buffer at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-buffer-bpython-dedicated + Send buffer at point to Bpython unique interpreter. + +** py-execute-buffer-bpython-dedicated-switch + Send buffer at point to Bpython unique interpreter and switch to result. + +** py-execute-expression-python + Send expression at point to Python interpreter. + +** py-execute-expression-python-switch + Send expression at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-python-no-switch + Send expression at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-python-dedicated + Send expression at point to Python unique interpreter. + +** py-execute-expression-python-dedicated-switch + Send expression at point to Python unique interpreter and switch to result. + +** py-execute-expression-ipython + Send expression at point to IPython interpreter. + +** py-execute-expression-ipython-switch + Send expression at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-ipython-no-switch + Send expression at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-ipython-dedicated + Send expression at point to IPython unique interpreter. + +** py-execute-expression-ipython-dedicated-switch + Send expression at point to IPython unique interpreter and switch to result. + +** py-execute-expression-python3 + Send expression at point to Python3 interpreter. + +** py-execute-expression-python3-switch + Send expression at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-python3-no-switch + Send expression at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-python3-dedicated + Send expression at point to Python3 unique interpreter. + +** py-execute-expression-python3-dedicated-switch + Send expression at point to Python3 unique interpreter and switch to result. + +** py-execute-expression-python2 + Send expression at point to Python2 interpreter. + +** py-execute-expression-python2-switch + Send expression at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-python2-no-switch + Send expression at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-python2-dedicated + Send expression at point to Python2 unique interpreter. + +** py-execute-expression-python2-dedicated-switch + Send expression at point to Python2 unique interpreter and switch to result. + +** py-execute-expression-python2\.7 + Send expression at point to Python2.7 interpreter. + +** py-execute-expression-python2\.7-switch + Send expression at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-python2\.7-no-switch + Send expression at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-python2\.7-dedicated + Send expression at point to Python2.7 unique interpreter. + +** py-execute-expression-python2\.7-dedicated-switch + Send expression at point to Python2.7 unique interpreter and switch to result. + +** py-execute-expression-jython + Send expression at point to Jython interpreter. + +** py-execute-expression-jython-switch + Send expression at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-jython-no-switch + Send expression at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-jython-dedicated + Send expression at point to Jython unique interpreter. + +** py-execute-expression-jython-dedicated-switch + Send expression at point to Jython unique interpreter and switch to result. + +** py-execute-expression-python3\.2 + Send expression at point to Python3.2 interpreter. + +** py-execute-expression-python3\.2-switch + Send expression at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-python3\.2-no-switch + Send expression at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-python3\.2-dedicated + Send expression at point to Python3.2 unique interpreter. + +** py-execute-expression-python3\.2-dedicated-switch + Send expression at point to Python3.2 unique interpreter and switch to result. + +** py-execute-expression-python3\.3 + Send expression at point to Python3.3 interpreter. + +** py-execute-expression-python3\.3-switch + Send expression at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-python3\.3-no-switch + Send expression at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-python3\.3-dedicated + Send expression at point to Python3.3 unique interpreter. + +** py-execute-expression-python3\.3-dedicated-switch + Send expression at point to Python3.3 unique interpreter and switch to result. + +** py-execute-expression-bpython + Send expression at point to Bpython interpreter. + +** py-execute-expression-bpython-switch + Send expression at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-expression-bpython-no-switch + Send expression at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-expression-bpython-dedicated + Send expression at point to Bpython unique interpreter. + +** py-execute-expression-bpython-dedicated-switch + Send expression at point to Bpython unique interpreter and switch to result. + +** py-execute-partial-expression-python + Send partial-expression at point to Python interpreter. + +** py-execute-partial-expression-python-switch + Send partial-expression at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-python-no-switch + Send partial-expression at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-python-dedicated + Send partial-expression at point to Python unique interpreter. + +** py-execute-partial-expression-python-dedicated-switch + Send partial-expression at point to Python unique interpreter and switch to result. + +** py-execute-partial-expression-ipython + Send partial-expression at point to IPython interpreter. + +** py-execute-partial-expression-ipython-switch + Send partial-expression at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-ipython-no-switch + Send partial-expression at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-ipython-dedicated + Send partial-expression at point to IPython unique interpreter. + +** py-execute-partial-expression-ipython-dedicated-switch + Send partial-expression at point to IPython unique interpreter and switch to result. + +** py-execute-partial-expression-python3 + Send partial-expression at point to Python3 interpreter. + +** py-execute-partial-expression-python3-switch + Send partial-expression at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-python3-no-switch + Send partial-expression at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-python3-dedicated + Send partial-expression at point to Python3 unique interpreter. + +** py-execute-partial-expression-python3-dedicated-switch + Send partial-expression at point to Python3 unique interpreter and switch to result. + +** py-execute-partial-expression-python2 + Send partial-expression at point to Python2 interpreter. + +** py-execute-partial-expression-python2-switch + Send partial-expression at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-python2-no-switch + Send partial-expression at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-python2-dedicated + Send partial-expression at point to Python2 unique interpreter. + +** py-execute-partial-expression-python2-dedicated-switch + Send partial-expression at point to Python2 unique interpreter and switch to result. + +** py-execute-partial-expression-python2\.7 + Send partial-expression at point to Python2.7 interpreter. + +** py-execute-partial-expression-python2\.7-switch + Send partial-expression at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-python2\.7-no-switch + Send partial-expression at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-python2\.7-dedicated + Send partial-expression at point to Python2.7 unique interpreter. + +** py-execute-partial-expression-python2\.7-dedicated-switch + Send partial-expression at point to Python2.7 unique interpreter and switch to result. + +** py-execute-partial-expression-jython + Send partial-expression at point to Jython interpreter. + +** py-execute-partial-expression-jython-switch + Send partial-expression at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-jython-no-switch + Send partial-expression at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-jython-dedicated + Send partial-expression at point to Jython unique interpreter. + +** py-execute-partial-expression-jython-dedicated-switch + Send partial-expression at point to Jython unique interpreter and switch to result. + +** py-execute-partial-expression-python3\.2 + Send partial-expression at point to Python3.2 interpreter. + +** py-execute-partial-expression-python3\.2-switch + Send partial-expression at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-python3\.2-no-switch + Send partial-expression at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-python3\.2-dedicated + Send partial-expression at point to Python3.2 unique interpreter. + +** py-execute-partial-expression-python3\.2-dedicated-switch + Send partial-expression at point to Python3.2 unique interpreter and switch to result. + +** py-execute-partial-expression-python3\.3 + Send partial-expression at point to Python3.3 interpreter. + +** py-execute-partial-expression-python3\.3-switch + Send partial-expression at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-python3\.3-no-switch + Send partial-expression at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-python3\.3-dedicated + Send partial-expression at point to Python3.3 unique interpreter. + +** py-execute-partial-expression-python3\.3-dedicated-switch + Send partial-expression at point to Python3.3 unique interpreter and switch to result. + +** py-execute-partial-expression-bpython + Send partial-expression at point to Bpython interpreter. + +** py-execute-partial-expression-bpython-switch + Send partial-expression at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-partial-expression-bpython-no-switch + Send partial-expression at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-partial-expression-bpython-dedicated + Send partial-expression at point to Bpython unique interpreter. + +** py-execute-partial-expression-bpython-dedicated-switch + Send partial-expression at point to Bpython unique interpreter and switch to result. + +** py-execute-line-python + Send line at point to Python interpreter. + +** py-execute-line-python-switch + Send line at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-python-no-switch + Send line at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-python-dedicated + Send line at point to Python unique interpreter. + +** py-execute-line-python-dedicated-switch + Send line at point to Python unique interpreter and switch to result. + +** py-execute-line-ipython + Send line at point to IPython interpreter. + +** py-execute-line-ipython-switch + Send line at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-ipython-no-switch + Send line at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-ipython-dedicated + Send line at point to IPython unique interpreter. + +** py-execute-line-ipython-dedicated-switch + Send line at point to IPython unique interpreter and switch to result. + +** py-execute-line-python3 + Send line at point to Python3 interpreter. + +** py-execute-line-python3-switch + Send line at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-python3-no-switch + Send line at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-python3-dedicated + Send line at point to Python3 unique interpreter. + +** py-execute-line-python3-dedicated-switch + Send line at point to Python3 unique interpreter and switch to result. + +** py-execute-line-python2 + Send line at point to Python2 interpreter. + +** py-execute-line-python2-switch + Send line at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-python2-no-switch + Send line at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-python2-dedicated + Send line at point to Python2 unique interpreter. + +** py-execute-line-python2-dedicated-switch + Send line at point to Python2 unique interpreter and switch to result. + +** py-execute-line-python2\.7 + Send line at point to Python2.7 interpreter. + +** py-execute-line-python2\.7-switch + Send line at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-python2\.7-no-switch + Send line at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-python2\.7-dedicated + Send line at point to Python2.7 unique interpreter. + +** py-execute-line-python2\.7-dedicated-switch + Send line at point to Python2.7 unique interpreter and switch to result. + +** py-execute-line-jython + Send line at point to Jython interpreter. + +** py-execute-line-jython-switch + Send line at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-jython-no-switch + Send line at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-jython-dedicated + Send line at point to Jython unique interpreter. + +** py-execute-line-jython-dedicated-switch + Send line at point to Jython unique interpreter and switch to result. + +** py-execute-line-python3\.2 + Send line at point to Python3.2 interpreter. + +** py-execute-line-python3\.2-switch + Send line at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-python3\.2-no-switch + Send line at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-python3\.2-dedicated + Send line at point to Python3.2 unique interpreter. + +** py-execute-line-python3\.2-dedicated-switch + Send line at point to Python3.2 unique interpreter and switch to result. + +** py-execute-line-python3\.3 + Send line at point to Python3.3 interpreter. + +** py-execute-line-python3\.3-switch + Send line at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-python3\.3-no-switch + Send line at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-python3\.3-dedicated + Send line at point to Python3.3 unique interpreter. + +** py-execute-line-python3\.3-dedicated-switch + Send line at point to Python3.3 unique interpreter and switch to result. + +** py-execute-line-bpython + Send line at point to Bpython interpreter. + +** py-execute-line-bpython-switch + Send line at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +** py-execute-line-bpython-no-switch + Send line at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +** py-execute-line-bpython-dedicated + Send line at point to Bpython unique interpreter. + +** py-execute-line-bpython-dedicated-switch + Send line at point to Bpython unique interpreter and switch to result. + +* Subprocess utilities and filters +** py-remove-overlays-at-point + Remove overlays as set when `py-highlight-error-source-p' is non-nil. + +** py-down-exception + Go to the next line down in the traceback. + +With C-u (programmatically, optional argument +BOTTOM), jump to the bottom (innermost) exception in the exception +stack. + +** py-up-exception + Go to the previous line up in the traceback. + +With C-u (programmatically, optional argument TOP) +jump to the top (outermost) exception in the exception stack. + +** py-mouseto-exception + Jump to the code which caused the Python exception at EVENT. +EVENT is usually a mouse click. + +** py-goto-exception + Go to the line indicated by the traceback. + +** py-output-buffer-filter + Clear output buffer from py-shell-input prompt etc. + +** py-send-string + Evaluate STRING in inferior Python process. + +** py-send-file + 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. + diff --git a/elpa/python-mode-6.1.3/doc/commands-python-mode.rst b/elpa/python-mode-6.1.3/doc/commands-python-mode.rst new file mode 100644 index 000000000..f7d611ba5 --- /dev/null +++ b/elpa/python-mode-6.1.3/doc/commands-python-mode.rst @@ -0,0 +1,6309 @@ +Python-mode commands + +==================== + +;;; Commentary: +--------------- + + +;;; Code +-------- + + +;;; Customization +----------------- + + +py-smart-operator-check +----------------------- +Check, if smart-operator-mode is loaded resp. available. + +Give some hints, if not. + +py-autopair-check +----------------- +Check, if autopair-mode is available. + +Give some hints, if not. + +(defun p +-------- + + +;;; Constants +------------- + + +;;; Macro definitions +--------------------- + + +;;; Toggle +---------- + + +toggle-py-nil-docstring-style +----------------------------- +If nil docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +py-nil-docstring-style-on +------------------------- +Make sure, nil docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +py-nil-docstring-style-off +-------------------------- +Make sure, nil docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +toggle-py-onetwo-docstring-style +-------------------------------- +If onetwo docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +py-onetwo-docstring-style-on +---------------------------- +Make sure, onetwo docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +py-onetwo-docstring-style-off +----------------------------- +Make sure, onetwo docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +toggle-py-pep-257-docstring-style +--------------------------------- +If pep-257 docstring-style should be on or off. + + Returns value of `py-pep-257-docstring-style' switched to. + +py-pep-257-docstring-style-on +----------------------------- +Make sure, pep-257 docstring-style' is on. + +Returns value of `py-pep-257-docstring-style'. + +py-pep-257-docstring-style-off +------------------------------ +Make sure, pep-257 docstring-style is off. + +Returns value of `py-pep-257-docstring-style'. + +toggle-py-pep-257-nn-docstring-style +------------------------------------ +If pep-257-nn docstring-style should be on or off. + + Returns value of `py-pep-257-nn-docstring-style' switched to. + +py-pep-257-nn-docstring-style-on +-------------------------------- +Make sure, pep-257-nn docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +py-pep-257-nn-docstring-style-off +--------------------------------- +Make sure, pep-257-nn docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +toggle-py-symmetric-docstring-style +----------------------------------- +If symmetric docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +py-symmetric-docstring-style-on +------------------------------- +Make sure, symmetric docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +py-symmetric-docstring-style-off +-------------------------------- +Make sure, symmetric docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +toggle-py-django-docstring-style +-------------------------------- +If django docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable + +py-django-docstring-style-on +---------------------------- +Make sure, django docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +py-django-docstring-style-off +----------------------------- +Make sure, django docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable + +toggle-py-underscore-word-syntax-p +---------------------------------- +If `py-underscore-word-syntax-p' should be on or off. + + Returns value of `py-underscore-word-syntax-p' switched to. + +py-underscore-word-syntax-p-on +------------------------------ +Make sure, py-underscore-word-syntax-p' is on. + +Returns value of `py-underscore-word-syntax-p'. + +py-underscore-word-syntax-p-off +------------------------------- +Make sure, `py-underscore-word-syntax-p' is off. + +Returns value of `py-underscore-word-syntax-p'. + +toggle-py-electric-comment-p +---------------------------- +If `py-electric-comment-p' should be on or off. + + Returns value of `py-electric-comment-p' switched to. + +py-electric-comment-p-on +------------------------ +Make sure, py-electric-comment-p' is on. + +Returns value of `py-electric-comment-p'. + +py-electric-comment-p-off +------------------------- +Make sure, `py-electric-comment-p' is off. + +Returns value of `py-electric-comment-p'. + +toggle-force-local-shell +------------------------ +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' + + +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 + +py-force-local-shell-off +------------------------ +Restore `py-shell-name' default value and `behaviour'. + +toggle-force-py-shell-name-p +---------------------------- +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. + + +force-py-shell-name-p-on +------------------------ +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. + + +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'. + +py-toggle-indent-tabs-mode +-------------------------- +Toggle `indent-tabs-mode'. + +Returns value of `indent-tabs-mode' switched to. + +py-indent-tabs-mode-on +---------------------- +Switch `indent-tabs-mode' on. + +py-indent-tabs-mode-off +----------------------- +Switch `indent-tabs-mode' on. + +toggle-py-jump-on-exception +--------------------------- +If `py-jump-on-exception' should be on or off. + + Returns value of `py-jump-on-exception' switched to. + +py-jump-on-exception-on +----------------------- +Make sure, py-jump-on-exception' is on. + +Returns value of `py-jump-on-exception'. + +py-jump-on-exception-off +------------------------ +Make sure, `py-jump-on-exception' is off. + +Returns value of `py-jump-on-exception'. + +toggle-python-mode-v5-behavior-p +-------------------------------- +If `python-mode-v5-behavior-p' should be on or off. + + Returns value of `python-mode-v5-behavior-p' switched to. + +python-mode-v5-behavior-p-on +---------------------------- +Make sure, `python-mode-v5-behavior-p' is on. + +Returns value of `python-mode-v5-behavior-p'. + +python-mode-v5-behavior-p-off +----------------------------- +Make sure, `python-mode-v5-behavior-p' is off. + +Returns value of `python-mode-v5-behavior-p'. + +py-toggle-shell-switch-buffers-on-execute +----------------------------------------- +If `py-switch-buffers-on-execute-p' should be on or off. + + Returns value of `py-switch-buffers-on-execute-p' switched to. + +py-shell-switch-buffers-on-execute-on +------------------------------------- +Make sure, `py-switch-buffers-on-execute-p' is on. + +Returns value of `py-switch-buffers-on-execute-p'. + +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'. + +py-toggle-split-windows-on-execute +---------------------------------- +If `py-split-windows-on-execute-p' should be on or off. + + Returns value of `py-split-windows-on-execute-p' switched to. + +py-split-windows-on-execute-on +------------------------------ +Make sure, `py-split-windows-on-execute-p' is on. + +Returns value of `py-split-windows-on-execute-p'. + +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'. + +py-toggle-highlight-indentation +------------------------------- +If `highlight-indentation-p' should be on or off. + +py-highlight-indentation-off +---------------------------- +If `highlight-indentation-p' should be on or off. + +py-highlight-indentation-on +--------------------------- +If `highlight-indentation-p' should be on or off. + +py-toggle-smart-indentation +--------------------------- +If `py-smart-indentation' should be on or off. + +Returns value of `py-smart-indentation' switched to. + +py-smart-indentation-on +----------------------- +Make sure, `py-smart-indentation' is on. + +Returns value of `py-smart-indentation'. + +py-smart-indentation-off +------------------------ +Make sure, `py-smart-indentation' is off. + +Returns value of `py-smart-indentation'. + +toggle-py-smart-operator-mode-p +------------------------------- +If `py-smart-operator-mode-p' should be on or off. + + Returns value of `py-smart-operator-mode-p' switched to. + +py-smart-operator-mode-p-on +--------------------------- +Make sure, py-smart-operator-mode-p' is on. + +Returns value of `py-smart-operator-mode-p'. + +py-smart-operator-mode-p-off +---------------------------- +Make sure, py-smart-operator-mode-p' is off. + +Returns value of `py-smart-operator-mode-p'. + +toggle-py-use-current-dir-when-execute-p +---------------------------------------- +If `py-use-current-dir-when-execute-p' should be on or off. + + Returns value of `py-use-current-dir-when-execute-p' switched to. + +py-use-current-dir-when-execute-p-on +------------------------------------ +Make sure, py-use-current-dir-when-execute-p' is on. + +Returns value of `py-use-current-dir-when-execute-p'. + +py-use-current-dir-when-execute-p-off +------------------------------------- +Make sure, `py-use-current-dir-when-execute-p' is off. + +Returns value of `py-use-current-dir-when-execute-p'. + +py-toggle-autopair-mode +----------------------- +If `py-autopair-mode' should be on or off. + + Returns value of `py-autopair-mode' switched to. + +py-autopair-mode-on +------------------- +Make sure, py-autopair-mode' is on. + +Returns value of `py-autopair-mode'. + +py-autopair-mode-off +-------------------- +Make sure, py-autopair-mode' is off. + +Returns value of `py-autopair-mode'. + +toggle-py-switch-buffers-on-execute-p +------------------------------------- +If `py-switch-buffers-on-execute-p' should be on or off. + + Returns value of `py-switch-buffers-on-execute-p' switched to. + +py-switch-buffers-on-execute-p-on +--------------------------------- +Make sure, `py-py-switch-buffers-on-execute-p' is on. + +Returns value of `py-switch-buffers-on-execute-p'. + +py-switch-buffers-on-execute-p-off +---------------------------------- +Make sure, `py-switch-buffers-on-execute-p' is off. + +Returns value of `py-switch-buffers-on-execute-p'. + +toggle-py-split-windows-on-execute-p +------------------------------------ +If `py-split-windows-on-execute-p' should be on or off. + + Returns value of `py-split-windows-on-execute-p' switched to. + +py-split-windows-on-execute-p-on +-------------------------------- +Make sure, `py-py-split-windows-on-execute-p' is on. + +Returns value of `py-split-windows-on-execute-p'. + +py-split-windows-on-execute-p-off +--------------------------------- +Make sure, `py-split-windows-on-execute-p' is off. + +Returns value of `py-split-windows-on-execute-p'. + +py-toggle-sexp-function +----------------------- +Opens customization + +py-shell-get-process +-------------------- +Get appropriate Python process for current buffer and return it. + +py-shell-send-string +-------------------- +Send STRING to inferior Python PROCESS. +When `py-verbose-p' and MSG is non-nil messages the first line of STRING. + +py-shell-send-file +------------------ +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. + +py-switch-to-shell +------------------ +Switch to inferior Python process buffer. + +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. + +;;; Helper commands +------------------- + + +py-guess-pdb-path +----------------- +If py-pdb-path isn't set, find location of pdb.py. + +(defun s +-------- + + +py-forward-line +--------------- +Goes to end of line after forward move. + +Travels right-margin comments. + +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 + +py-leave-comment-or-string-backward +----------------------------------- +If inside a comment or string, leave it backward. + +py-beginning-of-list-pps +------------------------ +Go to the beginning of a list. +Optional ARG indicates a start-position for `parse-partial-sexp'. +Return beginning position, nil if not inside. + +empty-line-p +------------ +Returns t if cursor is at an line with nothing but whitespace-characters, nil otherwise. + +py-count-lines +-------------- +Count lines in accessible part until current line. + +See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7115 + +py-send-region +-------------- +Send the region to the inferior Python process. + +py-send-region-and-go +--------------------- +Send the region to the inferior Python process. + +Then switch to the process buffer. + +python-send-string +------------------ +Evaluate STRING in inferior Python process. + +py-switch-to-python +------------------- +Switch to the Python process buffer, maybe starting new process. + +With prefix arg, position cursor at end of buffer. + +py-proc +------- +Return the current Python process. + +Start a new process if necessary. + +;;; Keymap and syntax +--------------------- + + +py-insert-default-shebang +------------------------- +Insert in buffer shebang of installed default Python. + +py-electric-comment +------------------- +Insert a comment. If starting a comment, indent accordingly. + +If a numeric argument ARG is provided, that many "#" are inserted +non-electrically. +With C-u "#" electric behavior is inhibited inside a string or comment. + +py-electric-colon +----------------- +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. + +Switched by `py-electric-colon-active-p', default is nil +See also `py-electric-colon-greedy-p' + +py-empty-out-list-backward +-------------------------- +Deletes all elements from list before point. + +py-electric-backspace +--------------------- +Delete preceding character or level of indentation. + +With ARG do that ARG times. +Returns column reached. + +py-electric-delete +------------------ +Delete following character or levels of whitespace. + +With ARG do that ARG times. + +py-indent-line-outmost +---------------------- +Indent the current line to the outmost reasonable indent. + +With optional C-u an indent with length `py-indent-offset' is inserted unconditionally + +py-indent-line +-------------- +Indent the current line according to Python rules. + +When called interactivly with C-u, ignore dedenting rules for block closing statements +(e.g. return, raise, break, continue, pass) + +An optional C-u 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. +TAB. +Returns current indentation + +When `py-tab-shifts-region-p' is `t', not just the current line, +but the region is shiftet that way. + +If `py-tab-indents-region-p' is `t' and first TAB doesn't shift +--as indent is at outmost reasonable--, indent-region is called. + +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. + +py-newline-and-dedent +--------------------- +Add a newline and indent to one level below current. +Returns column. + +py-indent-tabs-mode +------------------- +With positive ARG switch `indent-tabs-mode' on. + +With negative ARG switch `indent-tabs-mode' off. +Returns value of `indent-tabs-mode' switched to. + +py-guess-indent-forward +----------------------- +Called when moving to end of a form and `py-smart-indentation' is on. + +py-guess-indent-offset +---------------------- +Guess `py-indent-offset'. + +Set local value of `py-indent-offset', return it + +Might change local value of `py-indent-offset' only when called +downwards from beginning of block followed by a statement. Otherwise default-value is returned. + + +py-narrow-to-defun +------------------ +Make text outside current def or class invisible. + +The defun visible is the one that contains point or follows point. + +;;; Shifting +------------ + + +py-shift-left +------------- +Dedent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is dedented. +Returns indentation reached. + +py-shift-right +-------------- +Indent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is indented. +Returns indentation reached. + +py-shift-paragraph-right +------------------------ +Indent paragraph by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-paragraph-left +----------------------- +Dedent paragraph by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-block-right +-------------------- +Indent block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-block-left +------------------- +Dedent block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-minor-block-left +------------------------- +Dedent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. +A minor block is started by a `for', `if', `try' or `with'. + +py-shift-minor-block-right +-------------------------- +Indent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. +A minor block is started by a `for', `if', `try' or `with'. + +py-shift-clause-right +--------------------- +Indent clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-clause-left +-------------------- +Dedent clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-block-or-clause-right +------------------------------ +Indent block-or-clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-block-or-clause-left +----------------------------- +Dedent block-or-clause by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-def-right +------------------ +Indent def by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-def-left +----------------- +Dedent def by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-class-right +-------------------- +Indent class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-class-left +------------------- +Dedent class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-def-or-class-right +--------------------------- +Indent def-or-class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-def-or-class-left +-------------------------- +Dedent def-or-class by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-line-right +------------------- +Indent line by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-line-left +------------------ +Dedent line by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-statement-right +------------------------ +Indent statement by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-shift-statement-left +----------------------- +Dedent statement by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use [universal-argument] to specify a different value. + +Returns outmost indentation reached. + +py-indent-and-forward +--------------------- +Indent current line according to mode, move one line forward. + +py-indent-region +---------------- +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 + +;;; Positions +------------- + + +py-beginning-of-paragraph-position +---------------------------------- +Returns beginning of paragraph position. + +py-end-of-paragraph-position +---------------------------- +Returns end of paragraph position. + +py-beginning-of-block-position +------------------------------ +Returns beginning of block position. + +py-end-of-block-position +------------------------ +Returns end of block position. + +py-beginning-of-minor-block-position +------------------------------------ +Returns beginning of minor-block position. + +py-end-of-minor-block-position +------------------------------ +Returns end of minor-block position. + +py-beginning-of-clause-position +------------------------------- +Returns beginning of clause position. + +py-end-of-clause-position +------------------------- +Returns end of clause position. + +py-beginning-of-block-or-clause-position +---------------------------------------- +Returns beginning of block-or-clause position. + +py-end-of-block-or-clause-position +---------------------------------- +Returns end of block-or-clause position. + +py-beginning-of-def-position +---------------------------- +Returns beginning of def position. + +py-end-of-def-position +---------------------- +Returns end of def position. + +py-beginning-of-class-position +------------------------------ +Returns beginning of class position. + +py-end-of-class-position +------------------------ +Returns end of class position. + +py-beginning-of-def-or-class-position +------------------------------------- +Returns beginning of def-or-class position. + +py-end-of-def-or-class-position +------------------------------- +Returns end of def-or-class position. + +py-beginning-of-line-position +----------------------------- +Returns beginning of line position. + +py-end-of-line-position +----------------------- +Returns end of line position. + +py-beginning-of-statement-position +---------------------------------- +Returns beginning of statement position. + +py-end-of-statement-position +---------------------------- +Returns end of statement position. + +py-beginning-of-comment-position +-------------------------------- +Returns beginning of comment position. + +py-end-of-comment-position +-------------------------- +Returns end of comment position. + +py-beginning-of-top-level-position +---------------------------------- +Returns beginning of top-level position. + +py-end-of-top-level-position +---------------------------- +Returns end of top-level position. + +py-beginning-of-partial-expression-position +------------------------------------------- +Returns beginning of partial-expression position. + +py-end-of-partial-expression-position +------------------------------------- +Returns end of partial-expression position. + +py-beginning-of-expression-position +----------------------------------- +Returns beginning of expression position. + +py-end-of-expression-position +----------------------------- +Returns end of expression position. + +;;; some more Positions not generated by +---------------------------------------- + + +py-list-beginning-position +-------------------------- +Return lists beginning position, nil if not inside. + +Optional ARG indicates a start-position for `parse-partial-sexp'. + +py-end-of-list-position +----------------------- +Return end position, nil if not inside. + +Optional ARG indicates a start-position for `parse-partial-sexp'. + +py-in-triplequoted-string-p +--------------------------- +Returns character address of start tqs-string, nil if not inside. + +py-in-string-p +-------------- +Returns character address of start of string, nil if not inside. + +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. + + +;;; Bounds +---------- + + +py-bounds-of-statement +---------------------- +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. + +py-bounds-of-statements +----------------------- +Bounds of consecutive multitude of statements around point. + +Indented same level, which don't open blocks. + +py-bounds-of-block +------------------ +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. + +py-bounds-of-clause +------------------- +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. + +py-bounds-of-block-or-clause +---------------------------- +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. + +py-bounds-of-def +---------------- +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. + +py-bounds-of-class +------------------ +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. + +py-bounds-of-region +------------------- +Returns bounds of region at point. + +Returns a list, whose car is beg, cdr - end. + +py-bounds-of-buffer +------------------- +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. + +py-bounds-of-expression +----------------------- +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. + +py-bounds-of-partial-expression +------------------------------- +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. + +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 + +;;; Comments, Filling +--------------------- + + +py-beginning-of-comment +----------------------- +Go to the beginning of current line's comment, if any. + +Returns position if succesful. + +py-end-of-comment +----------------- +Go to the end of comment at point. + +Returns position, nil if not in comment. + +;;; Comment forms +----------------- + + +py-comment-region +----------------- +Like `comment-region' but uses double hash (`#') comment starter. + +py-comment-block +---------------- +Comments block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-minor-block +---------------------- +Comments minor-block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-top-level +-------------------- +Comments top-level form at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-clause +----------------- +Comments clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-block-or-clause +-------------------------- +Comments block-or-clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-def +-------------- +Comments def at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-class +---------------- +Comments class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-def-or-class +----------------------- +Comments def-or-class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-comment-statement +-------------------- +Comments statement at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default + +py-uncomment +------------ +Uncomment commented lines at point. + +If region is active, restrict uncommenting at region + +py-delete-comments-in-def-or-class +---------------------------------- +Delete all commented lines in def-or-class at point + +py-delete-comments-in-class +--------------------------- +Delete all commented lines in class at point + +py-delete-comments-in-block +--------------------------- +Delete all commented lines in block at point + +py-delete-comments-in-region +---------------------------- +Delete all commented lines in region. + +py-fill-comment +--------------- +Fill the comment paragraph at point + +py-end-of-string +---------------- +Go to end of string at point, return position. + +Takes the result of (syntax-ppss) + +py-fill-this-paragraph +---------------------- +Fill just the paragraph at point. + +py-fill-paragraph +----------------- +`fill-paragraph-function' + +If `py-paragraph-fill-docstring-p' and inside a docstring, the whole docstring is formatted. +See also `py-fill-string' + +py-fill-labelled-string +----------------------- +Fill string or paragraph containing lines starting with label + +See lp:1066489 + +py-fill-string +-------------- +String fill function for `py-fill-paragraph'. +JUSTIFY should be used (if applicable) as in `fill-paragraph'. + +DOCSTRING is either a boolean or 'no +If `py-paragraph-fill-docstring-p' is `t', `M-q` fills the +complete docstring according to setting of `py-docstring-style' + +py-fill-string-django +--------------------- +Fill docstring according to Django's coding standards style. + + """ + Process foo, return bar. + """ + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +py-fill-string-onetwo +--------------------- +One newline and start and Two at end style. + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +py-fill-string-pep-257 +---------------------- +PEP-257 with 2 newlines at end of string. + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +py-fill-string-pep-257-nn +------------------------- +PEP-257 with 1 newline at end of string. + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +py-fill-string-symmetric +------------------------ +Symmetric style. + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + + +py-beginning-of-top-level-p +--------------------------- +Returns position, if cursor is at the beginning of a top-level, nil otherwise. + +;;; Opens-p +----------- + + +py-statement-opens-block-p +-------------------------- +Return position if the current statement opens a block +in stricter or wider sense. + +For stricter sense specify regexp. + +py-statement-opens-clause-p +--------------------------- +Return position if the current statement opens block or clause. + +py-statement-opens-block-or-clause-p +------------------------------------ +Return position if the current statement opens block or clause. + +py-statement-opens-class-p +-------------------------- +Return `t' if the statement opens a functions or class definition, nil otherwise. + +py-statement-opens-def-p +------------------------ +Return `t' if the statement opens a functions or class definition, nil otherwise. + +py-statement-opens-def-or-class-p +--------------------------------- +Return `t' if the statement opens a functions or class definition, nil otherwise. + +py-look-downward-for-clause +--------------------------- +If beginning of other clause exists downward in current block. + +If succesful return position. + +py-current-defun +---------------- +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'. + +py-sort-imports +--------------- +Sort multiline imports. + +Put point inside the parentheses of a multiline import and hit +M-x py-sort-imports to sort the imports lexicographically + +py-which-def-or-class +--------------------- +Returns concatenated `def' and `class' names in hierarchical order, if cursor is inside. + +Returns "???" otherwise +Used by variable `which-func-functions' + +py-which-function +----------------- +Return the name of the function or class, if curser is in, return nil otherwise. + +;;; Beginning/End +----------------- + + +py-beginning-of-statements +-------------------------- +Got to the beginning of statements in current level which don't open blocks. + +py-end-of-statements +-------------------- +Got to the end of statements in current level which don't open blocks. + +py-beginning-of-expression +-------------------------- +Go to the beginning of a compound python expression. + +With numeric ARG do it that many times. + +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. + + +py-end-of-expression +-------------------- +Go to the end of a compound python expression. + +With numeric ARG do it that many times. + +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. + +py-beginning-of-partial-expression +---------------------------------- + + +py-end-of-partial-expression +---------------------------- + + +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. + +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. + +py-beginning-of-statement +------------------------- +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 + + +py-beginning-of-declarations +---------------------------- +Got to the beginning of assigments resp. statements in current level which don't open blocks. + + +py-end-of-declarations +---------------------- +Got to the end of assigments resp. statements in current level which don't open blocks. + +;;; Beginning of forms +---------------------- + + +py-beginning-of-form-intern +--------------------------- +Go to beginning of FORM. + +With INDENT, go to beginning one level above. +Whit IACT, print result in message buffer. + +Returns beginning of FORM if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-block +--------------------- +Go to beginning block, skip whitespace at BOL. + +Returns beginning of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-clause +---------------------- +Go to beginning clause, skip whitespace at BOL. + +Returns beginning of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-block-or-clause +------------------------------- +Go to beginning block-or-clause, skip whitespace at BOL. + +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 + +py-beginning-of-def +------------------- +Go to beginning def, skip whitespace at BOL. + +Returns beginning of def if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-class +--------------------- +Go to beginning class, skip whitespace at BOL. + +Returns beginning of class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-def-or-class +---------------------------- +Go to beginning def-or-class, skip whitespace at BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-if-block +------------------------ +Go to beginning if-block, skip whitespace at BOL. + +Returns beginning of if-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-try-block +------------------------- +Go to beginning try-block, skip whitespace at BOL. + +Returns beginning of try-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-minor-block +--------------------------- +Go to beginning minor-block, skip whitespace at BOL. + +Returns beginning of minor-block if successful, nil otherwise +A minor block is started by a `for', `if', `try' or `with'. + + +py-beginning-of-block-lc +------------------------ +Go to beginning block, go to BOL. + +Returns beginning of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-clause-lc +------------------------- +Go to beginning clause, go to BOL. + +Returns beginning of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-block-or-clause-lc +---------------------------------- +Go to beginning block-or-clause, go to BOL. + +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 + +py-beginning-of-def-lc +---------------------- +Go to beginning def, go to BOL. + +Returns beginning of def if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-class-lc +------------------------ +Go to beginning class, go to BOL. + +Returns beginning of class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-def-or-class-lc +------------------------------- +Go to beginning def-or-class, go to BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-if-block-lc +--------------------------- +Go to beginning if-block, go to BOL. + +Returns beginning of if-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-try-block-lc +---------------------------- +Go to beginning try-block, go to BOL. + +Returns beginning of try-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-minor-block-lc +------------------------------ +Go to beginning minor-block, go to BOL. + +Returns beginning of minor-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning-of-top-level +------------------------- +Go up to beginning of statments until level of indentation is null. + +Returns position if successful, nil otherwise + +py-end-of-top-level +------------------- +Go to end of top-level form at point. + +Returns position if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-beginning +------------ +Go to beginning of compound statement or definition at point. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end +------ +Go to end of of compound statement or definition at point. + +Returns position block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-up +----- +Go up or to beginning of form if inside. + +If inside a delimited form --string or list-- go to it's beginning. +If not at beginning of a statement or block, go to it's beginning. +If at beginning of a statement or block, go to beginning one level above of compound statement or definition at point. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-down +------- +Go to beginning one level below of compound statement or definition at point. + +If no statement or block below, but a delimited form --string or list-- go to it's beginning. Repeated call from there will behave like down-list. + +Returns position if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-block +--------------- +Go to end of block. + +Returns end of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-clause +---------------- +Go to end of clause. + +Returns end of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-block-or-clause +------------------------- +Go to end of block-or-clause. + +Returns end of block-or-clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-def +------------- +Go to end of def. + +Returns end of def if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-class +--------------- +Go to end of class. + +Returns end of class if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-def-or-class +---------------------- +Go to end of def-or-class. + +Returns end of def-or-class if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-if-block +------------------ +Go to end of if-block. + +Returns end of if-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-try-block +------------------- +Go to end of try-block. + +Returns end of try-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html + +py-end-of-minor-block +--------------------- +Go to end of minor-block. + +Returns end of minor-block if successful, nil otherwise + +A minor block is started by a `for', `if', `try' or `with'. + + +;;; Forms +--------- + + +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. + +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. + +py-end-of-statement +------------------- +Go to the last char of current statement. + +To go just beyond the final line of the current statement, use `py-down-statement-bol'. + +py-goto-statement-below +----------------------- +Goto beginning of next statement. + +py-beginning-of-decorator +------------------------- +Go to the beginning of a decorator. + +Returns position if succesful + +py-end-of-decorator +------------------- +Go to the end of a decorator. + +Returns position if succesful + +;;; Mark +-------- + + +py-mark-paragraph +----------------- +Mark paragraph at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-block +------------- +Mark block at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-minor-block +------------------- +Mark minor-block at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-clause +-------------- +Mark clause at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-block-or-clause +----------------------- +Mark block-or-clause at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-def +----------- +Mark def at point. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of marked area, a cons. + +py-mark-class +------------- +Mark class at point. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of marked area, a cons. + +py-mark-def-or-class +-------------------- +Mark def-or-class at point. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of marked area, a cons. + +py-mark-line +------------ +Mark line at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-statement +----------------- +Mark statement at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-top-level +----------------- +Mark top-level form at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-expression +------------------ +Mark expression at point. + +Returns beginning and end positions of marked area, a cons. + +py-mark-partial-expression +-------------------------- +Mark partial-expression at point. + +Returns beginning and end positions of marked area, a cons. + +;;; Copy +-------- + + +py-copy-statement +----------------- +Copy statement at point. + +Store data in kill ring, so it might yanked back. + +py-copy-top-level +----------------- +Copy top-level at point. + +Store data in kill ring, so it might yanked back. + +py-copy-block +------------- +Copy block at point. + +Store data in kill ring, so it might yanked back. + +py-copy-clause +-------------- +Copy clause at point. + +Store data in kill ring, so it might yanked back. + +py-copy-block-or-clause +----------------------- +Copy block-or-clause at point. + +Store data in kill ring, so it might yanked back. + +py-copy-def +----------- +Copy def at point. + +Store data in kill ring, so it might yanked back. + +py-copy-class +------------- +Copy class at point. + +Store data in kill ring, so it might yanked back. + +py-copy-def-or-class +-------------------- +Copy def-or-class at point. + +Store data in kill ring, so it might yanked back. + +py-copy-expression +------------------ +Copy expression at point. + +Store data in kill ring, so it might yanked back. + +py-copy-partial-expression +-------------------------- +Copy partial-expression at point. + +Store data in kill ring, so it might yanked back. + +py-copy-minor-block +------------------- +Copy minor-block at point. + +Store data in kill ring, so it might yanked back. + +;;; Delete +---------- + + +py-delete-statement +------------------- +Delete STATEMENT at point. + +Don't store data in kill ring. + +py-delete-top-level +------------------- +Delete TOP-LEVEL at point. + +Don't store data in kill ring. + +py-delete-block +--------------- +Delete BLOCK at point. + +Don't store data in kill ring. + +py-delete-block-or-clause +------------------------- +Delete BLOCK-OR-CLAUSE at point. + +Don't store data in kill ring. + +py-delete-def +------------- +Delete DEF at point. + +Don't store data in kill ring. + +py-delete-class +--------------- +Delete CLASS at point. + +Don't store data in kill ring. + +py-delete-def-or-class +---------------------- +Delete DEF-OR-CLASS at point. + +Don't store data in kill ring. + +py-delete-expression +-------------------- +Delete EXPRESSION at point. + +Don't store data in kill ring. + +py-delete-partial-expression +---------------------------- +Delete PARTIAL-EXPRESSION at point. + +Don't store data in kill ring. + +py-delete-minor-block +--------------------- +Delete MINOR-BLOCK at point. + +Don't store data in kill ring. +A minor block is started by a `for', `if', `try' or `with'. + +;;; Kill +-------- + + +py-kill-statements +------------------ +Delete statements declared in current level. + +Store deleted statements in kill-ring + +py-kill-declarations +-------------------- +Delete variables declared in current level. + +Store deleted variables in kill-ring + +py-kill-expression +------------------ +Delete expression at point. + Stores data in kill ring. Might be yanked back using `C-y'. + +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. + +py-kill-statement +----------------- +Delete statement at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-top-level +----------------- +Delete top-level form at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-block +------------- +Delete block at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-minor-block +------------------- +Delete minor-block at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-block-or-clause +----------------------- +Delete block-or-clause at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-def-or-class +-------------------- +Delete def-or-class at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-class +------------- +Delete class at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-def +----------- +Delete def at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-clause +-------------- +Delete clause at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +;;; Beginning of line forms +--------------------------- + + +py-beginning-of-block-bol-p +--------------------------- +Returns position, if cursor is at the beginning of block, at beginning of line, nil otherwise. + +py-end-of-block-bol +------------------- +Goto beginning of line following end of block. + Returns position reached, if successful, nil otherwise. + +See also `py-down-block': down from current definition to next beginning of block below. + +py-mark-block-bol +----------------- +Mark block, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +py-copy-block-bol +----------------- +Delete block bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-block-bol +----------------- +Delete block bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-delete-block-bol +------------------- +Delete block bol at point. + +Don't store data in kill ring. + +py-beginning-of-clause-bol-p +---------------------------- +Returns position, if cursor is at the beginning of clause, at beginning of line, nil otherwise. + +py-end-of-clause-bol +-------------------- +Goto beginning of line following end of clause. + Returns position reached, if successful, nil otherwise. + +See also `py-down-clause': down from current definition to next beginning of clause below. + +py-mark-clause-bol +------------------ +Mark clause, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +py-copy-clause-bol +------------------ +Delete clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-clause-bol +------------------ +Delete clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-delete-clause-bol +-------------------- +Delete clause bol at point. + +Don't store data in kill ring. + +py-beginning-of-block-or-clause-bol-p +------------------------------------- +Returns position, if cursor is at the beginning of block-or-clause, at beginning of line, nil otherwise. + +py-end-of-block-or-clause-bol +----------------------------- +Goto beginning of line following end of block-or-clause. + Returns position reached, if successful, nil otherwise. + +See also `py-down-block-or-clause': down from current definition to next beginning of block-or-clause below. + +py-mark-block-or-clause-bol +--------------------------- +Mark block-or-clause, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +py-copy-block-or-clause-bol +--------------------------- +Delete block-or-clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-block-or-clause-bol +--------------------------- +Delete block-or-clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-delete-block-or-clause-bol +----------------------------- +Delete block-or-clause bol at point. + +Don't store data in kill ring. + +py-beginning-of-def-bol-p +------------------------- +Returns position, if cursor is at the beginning of def, at beginning of line, nil otherwise. + +py-end-of-def-bol +----------------- +Goto beginning of line following end of def. + Returns position reached, if successful, nil otherwise. + +See also `py-down-def': down from current definition to next beginning of def below. + +py-mark-def-bol +--------------- +Mark def, take beginning of line positions. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. + +py-copy-def-bol +--------------- +Delete def bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-def-bol +--------------- +Delete def bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-delete-def-bol +----------------- +Delete def bol at point. + +Don't store data in kill ring. + +py-beginning-of-class-bol-p +--------------------------- +Returns position, if cursor is at the beginning of class, at beginning of line, nil otherwise. + +py-end-of-class-bol +------------------- +Goto beginning of line following end of class. + Returns position reached, if successful, nil otherwise. + +See also `py-down-class': down from current definition to next beginning of class below. + +py-mark-class-bol +----------------- +Mark class, take beginning of line positions. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. + +py-copy-class-bol +----------------- +Delete class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-class-bol +----------------- +Delete class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-delete-class-bol +------------------- +Delete class bol at point. + +Don't store data in kill ring. + +py-beginning-of-def-or-class-bol-p +---------------------------------- +Returns position, if cursor is at the beginning of def-or-class, at beginning of line, nil otherwise. + +py-end-of-def-or-class-bol +-------------------------- +Goto beginning of line following end of def-or-class. + Returns position reached, if successful, nil otherwise. + +See also `py-down-def-or-class': down from current definition to next beginning of def-or-class below. + +py-mark-def-or-class-bol +------------------------ +Mark def-or-class, take beginning of line positions. + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. + +py-copy-def-or-class-bol +------------------------ +Delete def-or-class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-def-or-class-bol +------------------------ +Delete def-or-class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-delete-def-or-class-bol +-------------------------- +Delete def-or-class bol at point. + +Don't store data in kill ring. + +py-beginning-of-statement-bol-p +------------------------------- +Returns position, if cursor is at the beginning of statement, at beginning of line, nil otherwise. + +py-beginning-of-statement-bol +----------------------------- +Goto beginning of line where statement starts. + Returns position reached, if successful, nil otherwise. + +See also `py-up-statement': up from current definition to next beginning of statement above. + +py-end-of-statement-bol +----------------------- +Goto beginning of line following end of statement. + Returns position reached, if successful, nil otherwise. + +See also `py-down-statement': down from current definition to next beginning of statement below. + +py-mark-statement-bol +--------------------- +Mark statement, take beginning of line positions. + +Returns beginning and end positions of region, a cons. + +py-copy-statement-bol +--------------------- +Delete statement bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-kill-statement-bol +--------------------- +Delete statement bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. + +py-delete-statement-bol +----------------------- +Delete statement bol at point. + +Don't store data in kill ring. + +;;; Up/Down +----------- + + +py-up-statement +--------------- +Go to the beginning of next statement upwards in buffer. + +Return position if statement found, nil otherwise. + +py-down-statement +----------------- +Go to the beginning of next statement downwards in buffer. + +Return position if statement found, nil otherwise. + +py-up-block +----------- +Go to the beginning of next block upwards in buffer. + +Return position if block found, nil otherwise. + +py-up-minor-block +----------------- +Go to the beginning of next minor-block upwards in buffer. + +Return position if minor-block found, nil otherwise. + +py-up-clause +------------ +Go to the beginning of next clause upwards in buffer. + +Return position if clause found, nil otherwise. + +py-up-block-or-clause +--------------------- +Go to the beginning of next block-or-clause upwards in buffer. + +Return position if block-or-clause found, nil otherwise. + +py-up-def +--------- +Go to the beginning of next def upwards in buffer. + +Return position if def found, nil otherwise. + +py-up-class +----------- +Go to the beginning of next class upwards in buffer. + +Return position if class found, nil otherwise. + +py-up-def-or-class +------------------ +Go to the beginning of next def-or-class upwards in buffer. + +Return position if def-or-class found, nil otherwise. + +py-down-block +------------- +Go to the beginning of next block below in buffer. + +Return position if block found, nil otherwise. + +py-down-minor-block +------------------- +Go to the beginning of next minor-block below in buffer. + +Return position if minor-block found, nil otherwise. + +py-down-clause +-------------- +Go to the beginning of next clause below in buffer. + +Return position if clause found, nil otherwise. + +py-down-block-or-clause +----------------------- +Go to the beginning of next block-or-clause below in buffer. + +Return position if block-or-clause found, nil otherwise. + +py-down-def +----------- +Go to the beginning of next def below in buffer. + +Return position if def found, nil otherwise. + +py-down-class +------------- +Go to the beginning of next class below in buffer. + +Return position if class found, nil otherwise. + +py-down-def-or-class +-------------------- +Go to the beginning of next def-or-class below in buffer. + +Return position if def-or-class found, nil otherwise. + +py-up-block-bol +--------------- +Go to the beginning of next block upwards in buffer. + +Go to beginning of line. +Return position if block found, nil otherwise. + +py-up-minor-block-bol +--------------------- +Go to the beginning of next minor-block upwards in buffer. + +Go to beginning of line. +Return position if minor-block found, nil otherwise. + +py-up-clause-bol +---------------- +Go to the beginning of next clause upwards in buffer. + +Go to beginning of line. +Return position if clause found, nil otherwise. + +py-up-block-or-clause-bol +------------------------- +Go to the beginning of next block-or-clause upwards in buffer. + +Go to beginning of line. +Return position if block-or-clause found, nil otherwise. + +py-up-def-bol +------------- +Go to the beginning of next def upwards in buffer. + +Go to beginning of line. +Return position if def found, nil otherwise. + +py-up-class-bol +--------------- +Go to the beginning of next class upwards in buffer. + +Go to beginning of line. +Return position if class found, nil otherwise. + +py-up-def-or-class-bol +---------------------- +Go to the beginning of next def-or-class upwards in buffer. + +Go to beginning of line. +Return position if def-or-class found, nil otherwise. + +py-down-block-bol +----------------- +Go to the beginning of next block below in buffer. + +Go to beginning of line +Return position if block found, nil otherwise + +py-down-minor-block-bol +----------------------- +Go to the beginning of next minor-block below in buffer. + +Go to beginning of line +Return position if minor-block found, nil otherwise + +py-down-clause-bol +------------------ +Go to the beginning of next clause below in buffer. + +Go to beginning of line +Return position if clause found, nil otherwise + +py-down-block-or-clause-bol +--------------------------- +Go to the beginning of next block-or-clause below in buffer. + +Go to beginning of line +Return position if block-or-clause found, nil otherwise + +py-down-def-bol +--------------- +Go to the beginning of next def below in buffer. + +Go to beginning of line +Return position if def found, nil otherwise + +py-down-class-bol +----------------- +Go to the beginning of next class below in buffer. + +Go to beginning of line +Return position if class found, nil otherwise + +py-down-def-or-class-bol +------------------------ +Go to the beginning of next def-or-class below in buffer. + +Go to beginning of line +Return position if def-or-class found, nil otherwise + +py-forward-into-nomenclature +---------------------------- +Move forward to end of a nomenclature section or word. + +With C-u (programmatically, optional argument ARG), do it that many times. + +A `nomenclature' is a fancy way of saying AWordWithMixedCaseNotUnderscores. + +py-backward-into-nomenclature +----------------------------- +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. + +match-paren +----------- +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  insert a `%'. + +;;; Python named shells +----------------------- + + +python +------ +Start an Python interpreter. + +Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'. + +ipython +------- +Start an IPython interpreter. + +Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'. + +python3 +------- +Start an Python3 interpreter. + +Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. + +python2 +------- +Start an Python2 interpreter. + +Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. + +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 +------ +Start an Jython interpreter. + +Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'. + +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'. + +python3\.3 +---------- +Start an Python3.3 interpreter. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +python3\.4 +---------- +Start an Python3.3 interpreter. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +bpython +------- +Start an Bpython interpreter. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +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 +----------------- +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 +----------------- +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 +----------------- +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 +-------------------- +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 +---------------- +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 +-------------------- +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'. + +python3\.3-dedicated +-------------------- +Start an unique Python3.3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +bpython-dedicated +----------------- +Start an unique Bpython interpreter in another window. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +python-switch +------------- +Switch to Python interpreter in another window. + +Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'. + +ipython-switch +-------------- +Switch to IPython interpreter in another window. + +Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'. + +python3-switch +-------------- +Switch to Python3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. + +python2-switch +-------------- +Switch to Python2 interpreter in another window. + +Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. + +python2\.7-switch +----------------- +Switch to 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-switch +------------- +Switch to Jython interpreter in another window. + +Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'. + +python3\.2-switch +----------------- +Switch to Python3.2 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'. + +python3\.3-switch +----------------- +Switch to Python3.3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +bpython-switch +-------------- +Switch to Bpython interpreter in another window. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +python-no-switch +---------------- +Open an Python interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python interpreter. See `py-python-command-args'. + +ipython-no-switch +----------------- +Open an IPython interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the IPython interpreter. See `py-python-command-args'. + +python3-no-switch +----------------- +Open an Python3 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. + +python2-no-switch +----------------- +Open an Python2 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. + +python2\.7-no-switch +-------------------- +Open an Python2.7 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'. + +jython-no-switch +---------------- +Open an Jython interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Jython interpreter. See `py-python-command-args'. + +python3\.2-no-switch +-------------------- +Open an Python3.2 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'. + +python3\.3-no-switch +-------------------- +Open an Python3.3 interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +bpython-no-switch +----------------- +Open an Bpython interpreter in another window, but do not switch to it. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +python-switch-dedicated +----------------------- +Switch to 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-switch-dedicated +------------------------ +Switch to 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-switch-dedicated +------------------------ +Switch to 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-switch-dedicated +------------------------ +Switch to 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-switch-dedicated +--------------------------- +Switch to 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-switch-dedicated +----------------------- +Switch to 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-switch-dedicated +--------------------------- +Switch to 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'. + +python3\.3-switch-dedicated +--------------------------- +Switch to an unique Python3.3 interpreter in another window. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. + +bpython-switch-dedicated +------------------------ +Switch to an unique Bpython interpreter in another window. + +Optional C-u prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. + +;;; Code execution +------------------ + + +py-which-execute-file-command +----------------------------- +Return the command appropriate to Python version. + +Per default it's "(format "execfile(r'%s') # PYTHON-MODE\n" filename)" for Python 2 series. + +py-execute-region-no-switch +--------------------------- +Send the region to a Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p', buffer with region stays current. + + +py-execute-region-switch +------------------------ +Send the region to a Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p', output-buffer will being switched to. + + +py-execute-region +----------------- +Send the region to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +When called with C-u 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 DEDICATED (boolean) + + +py-execute-region-default +------------------------- +Send the region to the systems default Python interpreter. + +py-execute-region-dedicated +--------------------------- +Get the region processed by an unique Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +When called with C-u 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. + +py-execute-region-default-dedicated +----------------------------------- +Send the region to an unique shell of systems default Python. + +py-execute-python-mode-v5 +------------------------- + + +py-execute-string +----------------- +Send the argument STRING to a Python interpreter. + +See also `py-execute-region'. + +py-execute-string-dedicated +--------------------------- +Send the argument STRING to an unique Python interpreter. + +See also `py-execute-region'. + +py-fetch-py-master-file +----------------------- +Lookup if a `py-master-file' is specified. + +See also doku of variable `py-master-file' + +py-execute-import-or-reload +--------------------------- +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 `M-x py-execute-region'. + +This may be preferable to `M-x 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. + +py-execute-buffer-dedicated +--------------------------- +Send the contents of the buffer to a unique Python interpreter. + +py-execute-buffer-switch +------------------------ +Send the contents of the buffer to a Python interpreter and switches to output. + +py-execute-buffer-dedicated-switch +---------------------------------- +Send the contents of the buffer to an unique Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p'. + +py-execute-buffer +----------------- +Send the contents of the buffer to a Python interpreter. + +py-execute-buffer-no-switch +--------------------------- +Send the contents of the buffer to a Python interpreter but don't switch to output. + +py-execute-defun +---------------- +Send the current defun (class or method) to the inferior Python process. + +py-process-file +--------------- +Process "python filename". + +Optional OUTPUT-BUFFER and ERROR-BUFFER might be given. + +py-execute-line +--------------- +Send current line from beginning of indent to Python interpreter. + +py-output-filter +---------------- +Clear output buffer from py-shell-input prompt etc. + +py-execute-file +--------------- +When called interactively, user is prompted for filename. + +;;; Pdb +------- + + +py-pdbtrack-toggle-stack-tracking +--------------------------------- +Set variable `py-pdbtrack-do-tracking-p'. + +turn-on-pdbtrack +---------------- + + +turn-off-pdbtrack +----------------- + + +;;; Documentation +----------------- + + +py-documentation +---------------- +Launch PyDOC on the Word at Point + +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. + +py-find-imports +--------------- +Find top-level imports. + +Returns imports + +py-eldoc-function +----------------- +Print help on symbol at point. + +py-describe-symbol +------------------ +Print help on symbol at point. + +If symbol is defined in current buffer, jump to it's definition +Optional C-u used for debugging, will prevent deletion of temp file. + +py-describe-mode +---------------- +Dump long form of `python-mode' docs. + +py-load-file +------------ +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. + +py-find-definition +------------------ +Find source of definition of SYMBOL. + +Interactively, prompt for SYMBOL. + +;;; Miscellanus +--------------- + + +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. + +py-nesting-level +---------------- +Accepts the output of `parse-partial-sexp'. + +py-beginning-of-commented-section +--------------------------------- +Leave upwards comments and/or empty lines. + +py-continuation-offset +---------------------- +With numeric ARG different from 1 py-continuation-offset is set to that value; returns py-continuation-offset. + +py-compute-indentation +---------------------- +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. + +Optional arguments are flags resp. values set and used by `py-compute-indentation' internally + + +py-indentation-of-statement +--------------------------- +Returns the indenation of the statement at point. + +py-guess-default-python +----------------------- +Defaults to "python", if guessing didn't succeed. + +py-set-ipython-completion-command-string +---------------------------------------- +Set and return `ipython-completion-command-string'. + +py-shell-dedicated +------------------ +Start an interactive Python interpreter in another window. + +With optional C-u user is prompted by +`py-choose-shell' for command and options to pass to the Python +interpreter. + + +py-shell +-------- +Start an interactive Python interpreter in another window. +Interactively, C-u 4 prompts for a buffer. +C-u 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'. +BUFFER allows specifying a name, the Python process is connected to +When DONE is `t', `py-shell-manage-windows' is omitted + + +py-indent-forward-line +---------------------- +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 M-x universal argument just indent. + + +py-dedent-forward-line +---------------------- +Dedent line and move one line forward. + +py-dedent +--------- +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'. + +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. + +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. + +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. + +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. + +py-class-at-point +----------------- +Return class definition as string. + +With interactive call, send it to the message buffer too. + +py-line-at-point +---------------- +Return line as string. + With interactive call, send it to the message buffer too. + +py-looking-at-keywords-p +------------------------ +If looking at a python keyword. Returns t or nil. + +py-match-paren-mode +------------------- +py-match-paren-mode nil oder t + +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. + +py-printform-insert +------------------- +Inserts a print statement out of current `(car kill-ring)' by default, inserts ARG instead if delivered. + +eva +--- +Put "eval(...)" forms around strings at point. + +pst-here +-------- +Kill previous "pdb.set_trace()" and insert it at point. + +py-line-to-printform-python2 +---------------------------- +Transforms the item on current in a print statement. + +;;; Imenu +--------- + + +py-switch-imenu-index-function +------------------------------ +Switch between series 5. index machine `py-imenu-create-index' and `py-imenu-create-index-new', which also lists modules variables + +py-toggle-local-default-use +--------------------------- + + +py-choose-shell-by-path +----------------------- +Select Python executable according to version desplayed in path, current buffer-file is selected from. + +Returns versioned string, nil if nothing appropriate found + +py-choose-shell-by-shebang +-------------------------- +Choose shell by looking at #! on the first line. + +Returns the specified Python resp. Jython shell command name. + +py-which-python +--------------- +Returns version of Python of current environment, a number. + +py-python-current-environment +----------------------------- +Returns path of current Python installation. + +py-switch-shell +--------------- +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. + +C-u `py-toggle-shell' prompts to specify a reachable Python command. +C-u followed by numerical arg 2 or 3, `py-toggle-shell' opens a respective Python shell. +C-u 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") + + +py-choose-shell +--------------- +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 C-u 4 is called `py-switch-shell' see docu there. + + +py-install-directory-check +-------------------------- +Do some sanity check for `py-install-directory'. + +Returns `t' if successful. + +py-guess-py-install-directory +----------------------------- +Takes value of user directory aka $HOME +if `(locate-library "python-mode")' is not succesful. + +Used only, if `py-install-directory' is empty. + +py-set-load-path +---------------- +Include needed subdirs of python-mode directory. + +;;; Abbrevs +----------- + + +py-edit-abbrevs +--------------- +Jumps to `python-mode-abbrev-table' in a buffer containing lists of abbrev definitions. +You can edit them and type C-c C-c 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). + +py-add-abbrev +------------- +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. + +py-python-version +----------------- +Returns versions number of a Python EXECUTABLE, string. + +If no EXECUTABLE given, `py-shell-name' is used. +Interactively output of `--version' is displayed. + +py-version +---------- +Echo the current version of `python-mode' in the minibuffer. + +py-install-search-local +----------------------- + + +py-install-local-shells +----------------------- +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'. + +;;; Completion +-------------- + + +py-python-script-complete +------------------------- +Complete word before point, if any. + +When `py-no-completion-calls-dabbrev-expand-p' is non-nil, try dabbrev-expand. Otherwise, when `py-indent-no-completion-p' is non-nil, call `tab-to-tab-stop'. + +py-python2-shell-complete +------------------------- + + +py-python3-shell-complete +------------------------- +Complete word before point, if any. Otherwise insert TAB. + +py-shell-complete +----------------- +Complete word before point, if any. Otherwise insert TAB. + +ipython-complete +---------------- +Complete the python symbol before point. + +If no completion available, insert a TAB. +Returns the completed symbol, a string, if successful, nil otherwise. + +;;; Checker +----------- + + +pylint-flymake-mode +------------------- +Toggle `pylint' `flymake-mode'. + +pyflakes-flymake-mode +--------------------- +Toggle `pyflakes' `flymake-mode'. + +pychecker-flymake-mode +---------------------- +Toggle `pychecker' `flymake-mode'. + +pep8-flymake-mode +----------------- +Toggle `pep8' `flymake-mode'. + +pyflakespep8-flymake-mode +------------------------- +Toggle `pyflakespep8' `flymake-mode'. + +Joint call to pyflakes and pep8 as proposed by + +Keegan Carruthers-Smith + + + +py-pep8-run +----------- +Run pep8, check formatting (default on the file currently visited). + + +py-pep8-help +------------ +Display pep8 command line help messages. + +py-pylint-run +------------- +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 + +py-pylint-help +-------------- +Display Pylint command line help messages. + +Let's have this until more Emacs-like help is prepared + +py-pylint-doku +-------------- +Display Pylint Documentation. + +Calls `pylint --full-documentation' + +py-pyflakes-run +--------------- +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 + +py-pyflakes-help +---------------- +Display Pyflakes command line help messages. + +Let's have this until more Emacs-like help is prepared + +py-pyflakespep8-run +------------------- +Run pyflakespep8, check formatting (default on the file currently visited). + + +py-pyflakespep8-help +-------------------- +Display pyflakespep8 command line help messages. + +py-flakes8-run +-------------- +Run flakes8, check formatting (default on the file currently visited). + + +py-flakes8-help +--------------- +Display flakes8 command line help messages. + +py-pychecker-run +---------------- +Run pychecker (default on the file currently visited). + +;;; Skeletons +------------- + + +py-load-skeletons +----------------- +These skeletons are loaded by python-mode, if `py-load-skeletons-p' is non-nil. + +;;; Virtualenv +-------------- + + +(defun v +-------- + + +virtualenv-current +------------------ +Barfs the current activated virtualenv + +virtualenv-activate +------------------- +Activate the virtualenv located in DIR + +virtualenv-deactivate +--------------------- +Deactivate the current virtual enviroment + +virtualenv-workon +----------------- +Issue a virtualenvwrapper-like virtualenv-workon command + +;;; Execute forms at point +-------------------------- + + +py-execute-statement +-------------------- +Send statement at point to a Python interpreter. + +py-execute-top-level +-------------------- +Send top-level at point to a Python interpreter. + +py-execute-block +---------------- +Send block at point to a Python interpreter. + +py-execute-minor-block +---------------------- +Send minor-block at point to a Python interpreter. + +A minor block is started by a `for', `if', `try' or `with'. + + +py-execute-block-or-clause +-------------------------- +Send block-or-clause at point to a Python interpreter. + +py-execute-def +-------------- +Send def at point to a Python interpreter. + +py-execute-class +---------------- +Send class at point to a Python interpreter. + +py-execute-def-or-class +----------------------- +Send def-or-class at point to a Python interpreter. + +py-execute-expression +--------------------- +Send expression at point to a Python interpreter. + +py-execute-partial-expression +----------------------------- +Send partial-expression at point to a Python interpreter. + +;;; Execute line +---------------- + + +;;; Execute file commands +------------------------- + + +py-execute-file-python +---------------------- +Send file to a Python interpreter. + +py-execute-file-python-switch +----------------------------- +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python-no-switch +-------------------------------- +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-python-dedicated +-------------------------------- +Send file to a Python interpreter. + +Uses a dedicated shell. + +py-execute-file-python-dedicated-switch +--------------------------------------- +Send file to a Python interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-ipython +----------------------- +Send file to a Ipython interpreter. + +py-execute-file-ipython-switch +------------------------------ +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-ipython-no-switch +--------------------------------- +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-ipython-dedicated +--------------------------------- +Send file to a Ipython interpreter. + +Uses a dedicated shell. + +py-execute-file-ipython-dedicated-switch +---------------------------------------- +Send file to a Ipython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python3 +----------------------- +Send file to a Python3 interpreter. + +py-execute-file-python3-switch +------------------------------ +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python3-no-switch +--------------------------------- +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-python3-dedicated +--------------------------------- +Send file to a Python3 interpreter. + +Uses a dedicated shell. + +py-execute-file-python3-dedicated-switch +---------------------------------------- +Send file to a Python3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python2 +----------------------- +Send file to a Python2 interpreter. + +py-execute-file-python2-switch +------------------------------ +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python2-no-switch +--------------------------------- +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-python2-dedicated +--------------------------------- +Send file to a Python2 interpreter. + +Uses a dedicated shell. + +py-execute-file-python2-dedicated-switch +---------------------------------------- +Send file to a Python2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python2\.7 +-------------------------- +Send file to a Python2.7 interpreter. + +py-execute-file-python2\.7-switch +--------------------------------- +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python2\.7-no-switch +------------------------------------ +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-python2\.7-dedicated +------------------------------------ +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. + +py-execute-file-python2\.7-dedicated-switch +------------------------------------------- +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-jython +---------------------- +Send file to a Jython interpreter. + +py-execute-file-jython-switch +----------------------------- +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-jython-no-switch +-------------------------------- +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-jython-dedicated +-------------------------------- +Send file to a Jython interpreter. + +Uses a dedicated shell. + +py-execute-file-jython-dedicated-switch +--------------------------------------- +Send file to a Jython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python3\.2 +-------------------------- +Send file to a Python3.2 interpreter. + +py-execute-file-python3\.2-switch +--------------------------------- +Send file to a Python3.2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python3\.2-no-switch +------------------------------------ +Send file to a Python3.2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-python3\.2-dedicated +------------------------------------ +Send file to a Python3.2 interpreter. + +Uses a dedicated shell. + +py-execute-file-python3\.2-dedicated-switch +------------------------------------------- +Send file to a Python3.2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python3\.3 +-------------------------- +Send file to a Python3.3 interpreter. + +py-execute-file-python3\.3-switch +--------------------------------- +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-python3\.3-no-switch +------------------------------------ +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-python3\.3-dedicated +------------------------------------ +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. + +py-execute-file-python3\.3-dedicated-switch +------------------------------------------- +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-bpython +----------------------- +Send file to a Bpython interpreter. + +py-execute-file-bpython-switch +------------------------------ +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +py-execute-file-bpython-no-switch +--------------------------------- +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil" + +py-execute-file-bpython-dedicated +--------------------------------- +Send file to a Bpython interpreter. + +Uses a dedicated shell. + +py-execute-file-bpython-dedicated-switch +---------------------------------------- +Send file to a Bpython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil" + +;;; Extended executes +--------------------- + + +py-execute-statement-python +--------------------------- +Send statement at point to Python interpreter. + +py-execute-statement-python-switch +---------------------------------- +Send statement at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-python-no-switch +------------------------------------- +Send statement at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-python-dedicated +------------------------------------- +Send statement at point to Python unique interpreter. + +py-execute-statement-python-dedicated-switch +-------------------------------------------- +Send statement at point to Python unique interpreter and switch to result. + +py-execute-statement-ipython +---------------------------- +Send statement at point to IPython interpreter. + +py-execute-statement-ipython-switch +----------------------------------- +Send statement at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-ipython-no-switch +-------------------------------------- +Send statement at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-ipython-dedicated +-------------------------------------- +Send statement at point to IPython unique interpreter. + +py-execute-statement-ipython-dedicated-switch +--------------------------------------------- +Send statement at point to IPython unique interpreter and switch to result. + +py-execute-statement-python3 +---------------------------- +Send statement at point to Python3 interpreter. + +py-execute-statement-python3-switch +----------------------------------- +Send statement at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-python3-no-switch +-------------------------------------- +Send statement at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-python3-dedicated +-------------------------------------- +Send statement at point to Python3 unique interpreter. + +py-execute-statement-python3-dedicated-switch +--------------------------------------------- +Send statement at point to Python3 unique interpreter and switch to result. + +py-execute-statement-python2 +---------------------------- +Send statement at point to Python2 interpreter. + +py-execute-statement-python2-switch +----------------------------------- +Send statement at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-python2-no-switch +-------------------------------------- +Send statement at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-python2-dedicated +-------------------------------------- +Send statement at point to Python2 unique interpreter. + +py-execute-statement-python2-dedicated-switch +--------------------------------------------- +Send statement at point to Python2 unique interpreter and switch to result. + +py-execute-statement-python2\.7 +------------------------------- +Send statement at point to Python2.7 interpreter. + +py-execute-statement-python2\.7-switch +-------------------------------------- +Send statement at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-python2\.7-no-switch +----------------------------------------- +Send statement at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-python2\.7-dedicated +----------------------------------------- +Send statement at point to Python2.7 unique interpreter. + +py-execute-statement-python2\.7-dedicated-switch +------------------------------------------------ +Send statement at point to Python2.7 unique interpreter and switch to result. + +py-execute-statement-jython +--------------------------- +Send statement at point to Jython interpreter. + +py-execute-statement-jython-switch +---------------------------------- +Send statement at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-jython-no-switch +------------------------------------- +Send statement at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-jython-dedicated +------------------------------------- +Send statement at point to Jython unique interpreter. + +py-execute-statement-jython-dedicated-switch +-------------------------------------------- +Send statement at point to Jython unique interpreter and switch to result. + +py-execute-statement-python3\.2 +------------------------------- +Send statement at point to Python3.2 interpreter. + +py-execute-statement-python3\.2-switch +-------------------------------------- +Send statement at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-python3\.2-no-switch +----------------------------------------- +Send statement at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-python3\.2-dedicated +----------------------------------------- +Send statement at point to Python3.2 unique interpreter. + +py-execute-statement-python3\.2-dedicated-switch +------------------------------------------------ +Send statement at point to Python3.2 unique interpreter and switch to result. + +py-execute-statement-python3\.3 +------------------------------- +Send statement at point to Python3.3 interpreter. + +py-execute-statement-python3\.3-switch +-------------------------------------- +Send statement at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-python3\.3-no-switch +----------------------------------------- +Send statement at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-python3\.3-dedicated +----------------------------------------- +Send statement at point to Python3.3 unique interpreter. + +py-execute-statement-python3\.3-dedicated-switch +------------------------------------------------ +Send statement at point to Python3.3 unique interpreter and switch to result. + +py-execute-statement-bpython +---------------------------- +Send statement at point to Bpython interpreter. + +py-execute-statement-bpython-switch +----------------------------------- +Send statement at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-statement-bpython-no-switch +-------------------------------------- +Send statement at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-statement-bpython-dedicated +-------------------------------------- +Send statement at point to Bpython unique interpreter. + +py-execute-statement-bpython-dedicated-switch +--------------------------------------------- +Send statement at point to Bpython unique interpreter and switch to result. + +py-execute-block-python +----------------------- +Send block at point to Python interpreter. + +py-execute-block-python-switch +------------------------------ +Send block at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-python-no-switch +--------------------------------- +Send block at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-python-dedicated +--------------------------------- +Send block at point to Python unique interpreter. + +py-execute-block-python-dedicated-switch +---------------------------------------- +Send block at point to Python unique interpreter and switch to result. + +py-execute-block-ipython +------------------------ +Send block at point to IPython interpreter. + +py-execute-block-ipython-switch +------------------------------- +Send block at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-ipython-no-switch +---------------------------------- +Send block at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-ipython-dedicated +---------------------------------- +Send block at point to IPython unique interpreter. + +py-execute-block-ipython-dedicated-switch +----------------------------------------- +Send block at point to IPython unique interpreter and switch to result. + +py-execute-block-python3 +------------------------ +Send block at point to Python3 interpreter. + +py-execute-block-python3-switch +------------------------------- +Send block at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-python3-no-switch +---------------------------------- +Send block at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-python3-dedicated +---------------------------------- +Send block at point to Python3 unique interpreter. + +py-execute-block-python3-dedicated-switch +----------------------------------------- +Send block at point to Python3 unique interpreter and switch to result. + +py-execute-block-python2 +------------------------ +Send block at point to Python2 interpreter. + +py-execute-block-python2-switch +------------------------------- +Send block at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-python2-no-switch +---------------------------------- +Send block at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-python2-dedicated +---------------------------------- +Send block at point to Python2 unique interpreter. + +py-execute-block-python2-dedicated-switch +----------------------------------------- +Send block at point to Python2 unique interpreter and switch to result. + +py-execute-block-python2\.7 +--------------------------- +Send block at point to Python2.7 interpreter. + +py-execute-block-python2\.7-switch +---------------------------------- +Send block at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-python2\.7-no-switch +------------------------------------- +Send block at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-python2\.7-dedicated +------------------------------------- +Send block at point to Python2.7 unique interpreter. + +py-execute-block-python2\.7-dedicated-switch +-------------------------------------------- +Send block at point to Python2.7 unique interpreter and switch to result. + +py-execute-block-jython +----------------------- +Send block at point to Jython interpreter. + +py-execute-block-jython-switch +------------------------------ +Send block at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-jython-no-switch +--------------------------------- +Send block at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-jython-dedicated +--------------------------------- +Send block at point to Jython unique interpreter. + +py-execute-block-jython-dedicated-switch +---------------------------------------- +Send block at point to Jython unique interpreter and switch to result. + +py-execute-block-python3\.2 +--------------------------- +Send block at point to Python3.2 interpreter. + +py-execute-block-python3\.2-switch +---------------------------------- +Send block at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-python3\.2-no-switch +------------------------------------- +Send block at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-python3\.2-dedicated +------------------------------------- +Send block at point to Python3.2 unique interpreter. + +py-execute-block-python3\.2-dedicated-switch +-------------------------------------------- +Send block at point to Python3.2 unique interpreter and switch to result. + +py-execute-block-python3\.3 +--------------------------- +Send block at point to Python3.3 interpreter. + +py-execute-block-python3\.3-switch +---------------------------------- +Send block at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-python3\.3-no-switch +------------------------------------- +Send block at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-python3\.3-dedicated +------------------------------------- +Send block at point to Python3.3 unique interpreter. + +py-execute-block-python3\.3-dedicated-switch +-------------------------------------------- +Send block at point to Python3.3 unique interpreter and switch to result. + +py-execute-block-bpython +------------------------ +Send block at point to Bpython interpreter. + +py-execute-block-bpython-switch +------------------------------- +Send block at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-bpython-no-switch +---------------------------------- +Send block at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-bpython-dedicated +---------------------------------- +Send block at point to Bpython unique interpreter. + +py-execute-block-bpython-dedicated-switch +----------------------------------------- +Send block at point to Bpython unique interpreter and switch to result. + +py-execute-clause-python +------------------------ +Send clause at point to Python interpreter. + +py-execute-clause-python-switch +------------------------------- +Send clause at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-python-no-switch +---------------------------------- +Send clause at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-python-dedicated +---------------------------------- +Send clause at point to Python unique interpreter. + +py-execute-clause-python-dedicated-switch +----------------------------------------- +Send clause at point to Python unique interpreter and switch to result. + +py-execute-clause-ipython +------------------------- +Send clause at point to IPython interpreter. + +py-execute-clause-ipython-switch +-------------------------------- +Send clause at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-ipython-no-switch +----------------------------------- +Send clause at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-ipython-dedicated +----------------------------------- +Send clause at point to IPython unique interpreter. + +py-execute-clause-ipython-dedicated-switch +------------------------------------------ +Send clause at point to IPython unique interpreter and switch to result. + +py-execute-clause-python3 +------------------------- +Send clause at point to Python3 interpreter. + +py-execute-clause-python3-switch +-------------------------------- +Send clause at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-python3-no-switch +----------------------------------- +Send clause at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-python3-dedicated +----------------------------------- +Send clause at point to Python3 unique interpreter. + +py-execute-clause-python3-dedicated-switch +------------------------------------------ +Send clause at point to Python3 unique interpreter and switch to result. + +py-execute-clause-python2 +------------------------- +Send clause at point to Python2 interpreter. + +py-execute-clause-python2-switch +-------------------------------- +Send clause at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-python2-no-switch +----------------------------------- +Send clause at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-python2-dedicated +----------------------------------- +Send clause at point to Python2 unique interpreter. + +py-execute-clause-python2-dedicated-switch +------------------------------------------ +Send clause at point to Python2 unique interpreter and switch to result. + +py-execute-clause-python2\.7 +---------------------------- +Send clause at point to Python2.7 interpreter. + +py-execute-clause-python2\.7-switch +----------------------------------- +Send clause at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-python2\.7-no-switch +-------------------------------------- +Send clause at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-python2\.7-dedicated +-------------------------------------- +Send clause at point to Python2.7 unique interpreter. + +py-execute-clause-python2\.7-dedicated-switch +--------------------------------------------- +Send clause at point to Python2.7 unique interpreter and switch to result. + +py-execute-clause-jython +------------------------ +Send clause at point to Jython interpreter. + +py-execute-clause-jython-switch +------------------------------- +Send clause at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-jython-no-switch +---------------------------------- +Send clause at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-jython-dedicated +---------------------------------- +Send clause at point to Jython unique interpreter. + +py-execute-clause-jython-dedicated-switch +----------------------------------------- +Send clause at point to Jython unique interpreter and switch to result. + +py-execute-clause-python3\.2 +---------------------------- +Send clause at point to Python3.2 interpreter. + +py-execute-clause-python3\.2-switch +----------------------------------- +Send clause at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-python3\.2-no-switch +-------------------------------------- +Send clause at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-python3\.2-dedicated +-------------------------------------- +Send clause at point to Python3.2 unique interpreter. + +py-execute-clause-python3\.2-dedicated-switch +--------------------------------------------- +Send clause at point to Python3.2 unique interpreter and switch to result. + +py-execute-clause-python3\.3 +---------------------------- +Send clause at point to Python3.3 interpreter. + +py-execute-clause-python3\.3-switch +----------------------------------- +Send clause at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-python3\.3-no-switch +-------------------------------------- +Send clause at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-python3\.3-dedicated +-------------------------------------- +Send clause at point to Python3.3 unique interpreter. + +py-execute-clause-python3\.3-dedicated-switch +--------------------------------------------- +Send clause at point to Python3.3 unique interpreter and switch to result. + +py-execute-clause-bpython +------------------------- +Send clause at point to Bpython interpreter. + +py-execute-clause-bpython-switch +-------------------------------- +Send clause at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-clause-bpython-no-switch +----------------------------------- +Send clause at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-clause-bpython-dedicated +----------------------------------- +Send clause at point to Bpython unique interpreter. + +py-execute-clause-bpython-dedicated-switch +------------------------------------------ +Send clause at point to Bpython unique interpreter and switch to result. + +py-execute-block-or-clause-python +--------------------------------- +Send block-or-clause at point to Python interpreter. + +py-execute-block-or-clause-python-switch +---------------------------------------- +Send block-or-clause at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-python-no-switch +------------------------------------------- +Send block-or-clause at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-python-dedicated +------------------------------------------- +Send block-or-clause at point to Python unique interpreter. + +py-execute-block-or-clause-python-dedicated-switch +-------------------------------------------------- +Send block-or-clause at point to Python unique interpreter and switch to result. + +py-execute-block-or-clause-ipython +---------------------------------- +Send block-or-clause at point to IPython interpreter. + +py-execute-block-or-clause-ipython-switch +----------------------------------------- +Send block-or-clause at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-ipython-no-switch +-------------------------------------------- +Send block-or-clause at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-ipython-dedicated +-------------------------------------------- +Send block-or-clause at point to IPython unique interpreter. + +py-execute-block-or-clause-ipython-dedicated-switch +--------------------------------------------------- +Send block-or-clause at point to IPython unique interpreter and switch to result. + +py-execute-block-or-clause-python3 +---------------------------------- +Send block-or-clause at point to Python3 interpreter. + +py-execute-block-or-clause-python3-switch +----------------------------------------- +Send block-or-clause at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-python3-no-switch +-------------------------------------------- +Send block-or-clause at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-python3-dedicated +-------------------------------------------- +Send block-or-clause at point to Python3 unique interpreter. + +py-execute-block-or-clause-python3-dedicated-switch +--------------------------------------------------- +Send block-or-clause at point to Python3 unique interpreter and switch to result. + +py-execute-block-or-clause-python2 +---------------------------------- +Send block-or-clause at point to Python2 interpreter. + +py-execute-block-or-clause-python2-switch +----------------------------------------- +Send block-or-clause at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-python2-no-switch +-------------------------------------------- +Send block-or-clause at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-python2-dedicated +-------------------------------------------- +Send block-or-clause at point to Python2 unique interpreter. + +py-execute-block-or-clause-python2-dedicated-switch +--------------------------------------------------- +Send block-or-clause at point to Python2 unique interpreter and switch to result. + +py-execute-block-or-clause-python2\.7 +------------------------------------- +Send block-or-clause at point to Python2.7 interpreter. + +py-execute-block-or-clause-python2\.7-switch +-------------------------------------------- +Send block-or-clause at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-python2\.7-no-switch +----------------------------------------------- +Send block-or-clause at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-python2\.7-dedicated +----------------------------------------------- +Send block-or-clause at point to Python2.7 unique interpreter. + +py-execute-block-or-clause-python2\.7-dedicated-switch +------------------------------------------------------ +Send block-or-clause at point to Python2.7 unique interpreter and switch to result. + +py-execute-block-or-clause-jython +--------------------------------- +Send block-or-clause at point to Jython interpreter. + +py-execute-block-or-clause-jython-switch +---------------------------------------- +Send block-or-clause at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-jython-no-switch +------------------------------------------- +Send block-or-clause at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-jython-dedicated +------------------------------------------- +Send block-or-clause at point to Jython unique interpreter. + +py-execute-block-or-clause-jython-dedicated-switch +-------------------------------------------------- +Send block-or-clause at point to Jython unique interpreter and switch to result. + +py-execute-block-or-clause-python3\.2 +------------------------------------- +Send block-or-clause at point to Python3.2 interpreter. + +py-execute-block-or-clause-python3\.2-switch +-------------------------------------------- +Send block-or-clause at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-python3\.2-no-switch +----------------------------------------------- +Send block-or-clause at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-python3\.2-dedicated +----------------------------------------------- +Send block-or-clause at point to Python3.2 unique interpreter. + +py-execute-block-or-clause-python3\.2-dedicated-switch +------------------------------------------------------ +Send block-or-clause at point to Python3.2 unique interpreter and switch to result. + +py-execute-block-or-clause-python3\.3 +------------------------------------- +Send block-or-clause at point to Python3.3 interpreter. + +py-execute-block-or-clause-python3\.3-switch +-------------------------------------------- +Send block-or-clause at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-python3\.3-no-switch +----------------------------------------------- +Send block-or-clause at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-python3\.3-dedicated +----------------------------------------------- +Send block-or-clause at point to Python3.3 unique interpreter. + +py-execute-block-or-clause-python3\.3-dedicated-switch +------------------------------------------------------ +Send block-or-clause at point to Python3.3 unique interpreter and switch to result. + +py-execute-block-or-clause-bpython +---------------------------------- +Send block-or-clause at point to Bpython interpreter. + +py-execute-block-or-clause-bpython-switch +----------------------------------------- +Send block-or-clause at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-block-or-clause-bpython-no-switch +-------------------------------------------- +Send block-or-clause at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-block-or-clause-bpython-dedicated +-------------------------------------------- +Send block-or-clause at point to Bpython unique interpreter. + +py-execute-block-or-clause-bpython-dedicated-switch +--------------------------------------------------- +Send block-or-clause at point to Bpython unique interpreter and switch to result. + +py-execute-def-python +--------------------- +Send def at point to Python interpreter. + +py-execute-def-python-switch +---------------------------- +Send def at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-python-no-switch +------------------------------- +Send def at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-python-dedicated +------------------------------- +Send def at point to Python unique interpreter. + +py-execute-def-python-dedicated-switch +-------------------------------------- +Send def at point to Python unique interpreter and switch to result. + +py-execute-def-ipython +---------------------- +Send def at point to IPython interpreter. + +py-execute-def-ipython-switch +----------------------------- +Send def at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-ipython-no-switch +-------------------------------- +Send def at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-ipython-dedicated +-------------------------------- +Send def at point to IPython unique interpreter. + +py-execute-def-ipython-dedicated-switch +--------------------------------------- +Send def at point to IPython unique interpreter and switch to result. + +py-execute-def-python3 +---------------------- +Send def at point to Python3 interpreter. + +py-execute-def-python3-switch +----------------------------- +Send def at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-python3-no-switch +-------------------------------- +Send def at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-python3-dedicated +-------------------------------- +Send def at point to Python3 unique interpreter. + +py-execute-def-python3-dedicated-switch +--------------------------------------- +Send def at point to Python3 unique interpreter and switch to result. + +py-execute-def-python2 +---------------------- +Send def at point to Python2 interpreter. + +py-execute-def-python2-switch +----------------------------- +Send def at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-python2-no-switch +-------------------------------- +Send def at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-python2-dedicated +-------------------------------- +Send def at point to Python2 unique interpreter. + +py-execute-def-python2-dedicated-switch +--------------------------------------- +Send def at point to Python2 unique interpreter and switch to result. + +py-execute-def-python2\.7 +------------------------- +Send def at point to Python2.7 interpreter. + +py-execute-def-python2\.7-switch +-------------------------------- +Send def at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-python2\.7-no-switch +----------------------------------- +Send def at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-python2\.7-dedicated +----------------------------------- +Send def at point to Python2.7 unique interpreter. + +py-execute-def-python2\.7-dedicated-switch +------------------------------------------ +Send def at point to Python2.7 unique interpreter and switch to result. + +py-execute-def-jython +--------------------- +Send def at point to Jython interpreter. + +py-execute-def-jython-switch +---------------------------- +Send def at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-jython-no-switch +------------------------------- +Send def at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-jython-dedicated +------------------------------- +Send def at point to Jython unique interpreter. + +py-execute-def-jython-dedicated-switch +-------------------------------------- +Send def at point to Jython unique interpreter and switch to result. + +py-execute-def-python3\.2 +------------------------- +Send def at point to Python3.2 interpreter. + +py-execute-def-python3\.2-switch +-------------------------------- +Send def at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-python3\.2-no-switch +----------------------------------- +Send def at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-python3\.2-dedicated +----------------------------------- +Send def at point to Python3.2 unique interpreter. + +py-execute-def-python3\.2-dedicated-switch +------------------------------------------ +Send def at point to Python3.2 unique interpreter and switch to result. + +py-execute-def-python3\.3 +------------------------- +Send def at point to Python3.3 interpreter. + +py-execute-def-python3\.3-switch +-------------------------------- +Send def at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-python3\.3-no-switch +----------------------------------- +Send def at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-python3\.3-dedicated +----------------------------------- +Send def at point to Python3.3 unique interpreter. + +py-execute-def-python3\.3-dedicated-switch +------------------------------------------ +Send def at point to Python3.3 unique interpreter and switch to result. + +py-execute-def-bpython +---------------------- +Send def at point to Bpython interpreter. + +py-execute-def-bpython-switch +----------------------------- +Send def at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-def-bpython-no-switch +-------------------------------- +Send def at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-def-bpython-dedicated +-------------------------------- +Send def at point to Bpython unique interpreter. + +py-execute-def-bpython-dedicated-switch +--------------------------------------- +Send def at point to Bpython unique interpreter and switch to result. + +py-execute-class-python +----------------------- +Send class at point to Python interpreter. + +py-execute-class-python-switch +------------------------------ +Send class at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-python-no-switch +--------------------------------- +Send class at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-python-dedicated +--------------------------------- +Send class at point to Python unique interpreter. + +py-execute-class-python-dedicated-switch +---------------------------------------- +Send class at point to Python unique interpreter and switch to result. + +py-execute-class-ipython +------------------------ +Send class at point to IPython interpreter. + +py-execute-class-ipython-switch +------------------------------- +Send class at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-ipython-no-switch +---------------------------------- +Send class at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-ipython-dedicated +---------------------------------- +Send class at point to IPython unique interpreter. + +py-execute-class-ipython-dedicated-switch +----------------------------------------- +Send class at point to IPython unique interpreter and switch to result. + +py-execute-class-python3 +------------------------ +Send class at point to Python3 interpreter. + +py-execute-class-python3-switch +------------------------------- +Send class at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-python3-no-switch +---------------------------------- +Send class at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-python3-dedicated +---------------------------------- +Send class at point to Python3 unique interpreter. + +py-execute-class-python3-dedicated-switch +----------------------------------------- +Send class at point to Python3 unique interpreter and switch to result. + +py-execute-class-python2 +------------------------ +Send class at point to Python2 interpreter. + +py-execute-class-python2-switch +------------------------------- +Send class at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-python2-no-switch +---------------------------------- +Send class at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-python2-dedicated +---------------------------------- +Send class at point to Python2 unique interpreter. + +py-execute-class-python2-dedicated-switch +----------------------------------------- +Send class at point to Python2 unique interpreter and switch to result. + +py-execute-class-python2\.7 +--------------------------- +Send class at point to Python2.7 interpreter. + +py-execute-class-python2\.7-switch +---------------------------------- +Send class at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-python2\.7-no-switch +------------------------------------- +Send class at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-python2\.7-dedicated +------------------------------------- +Send class at point to Python2.7 unique interpreter. + +py-execute-class-python2\.7-dedicated-switch +-------------------------------------------- +Send class at point to Python2.7 unique interpreter and switch to result. + +py-execute-class-jython +----------------------- +Send class at point to Jython interpreter. + +py-execute-class-jython-switch +------------------------------ +Send class at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-jython-no-switch +--------------------------------- +Send class at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-jython-dedicated +--------------------------------- +Send class at point to Jython unique interpreter. + +py-execute-class-jython-dedicated-switch +---------------------------------------- +Send class at point to Jython unique interpreter and switch to result. + +py-execute-class-python3\.2 +--------------------------- +Send class at point to Python3.2 interpreter. + +py-execute-class-python3\.2-switch +---------------------------------- +Send class at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-python3\.2-no-switch +------------------------------------- +Send class at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-python3\.2-dedicated +------------------------------------- +Send class at point to Python3.2 unique interpreter. + +py-execute-class-python3\.2-dedicated-switch +-------------------------------------------- +Send class at point to Python3.2 unique interpreter and switch to result. + +py-execute-class-python3\.3 +--------------------------- +Send class at point to Python3.3 interpreter. + +py-execute-class-python3\.3-switch +---------------------------------- +Send class at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-python3\.3-no-switch +------------------------------------- +Send class at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-python3\.3-dedicated +------------------------------------- +Send class at point to Python3.3 unique interpreter. + +py-execute-class-python3\.3-dedicated-switch +-------------------------------------------- +Send class at point to Python3.3 unique interpreter and switch to result. + +py-execute-class-bpython +------------------------ +Send class at point to Bpython interpreter. + +py-execute-class-bpython-switch +------------------------------- +Send class at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-class-bpython-no-switch +---------------------------------- +Send class at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-class-bpython-dedicated +---------------------------------- +Send class at point to Bpython unique interpreter. + +py-execute-class-bpython-dedicated-switch +----------------------------------------- +Send class at point to Bpython unique interpreter and switch to result. + +py-execute-region-python +------------------------ +Send region at point to Python interpreter. + +py-execute-region-python-switch +------------------------------- +Send region at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-python-no-switch +---------------------------------- +Send region at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-python-dedicated +---------------------------------- +Send region at point to Python unique interpreter. + +py-execute-region-python-dedicated-switch +----------------------------------------- +Send region at point to Python unique interpreter and switch to result. + +py-execute-region-ipython +------------------------- +Send region at point to IPython interpreter. + +py-execute-region-ipython-switch +-------------------------------- +Send region at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-ipython-no-switch +----------------------------------- +Send region at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-ipython-dedicated +----------------------------------- +Send region at point to IPython unique interpreter. + +py-execute-region-ipython-dedicated-switch +------------------------------------------ +Send region at point to IPython unique interpreter and switch to result. + +py-execute-region-python3 +------------------------- +Send region at point to Python3 interpreter. + +py-execute-region-python3-switch +-------------------------------- +Send region at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-python3-no-switch +----------------------------------- +Send region at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-python3-dedicated +----------------------------------- +Send region at point to Python3 unique interpreter. + +py-execute-region-python3-dedicated-switch +------------------------------------------ +Send region at point to Python3 unique interpreter and switch to result. + +py-execute-region-python2 +------------------------- +Send region at point to Python2 interpreter. + +py-execute-region-python2-switch +-------------------------------- +Send region at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-python2-no-switch +----------------------------------- +Send region at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-python2-dedicated +----------------------------------- +Send region at point to Python2 unique interpreter. + +py-execute-region-python2-dedicated-switch +------------------------------------------ +Send region at point to Python2 unique interpreter and switch to result. + +py-execute-region-python2\.7 +---------------------------- +Send region at point to Python2.7 interpreter. + +py-execute-region-python2\.7-switch +----------------------------------- +Send region at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-python2\.7-no-switch +-------------------------------------- +Send region at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-python2\.7-dedicated +-------------------------------------- +Send region at point to Python2.7 unique interpreter. + +py-execute-region-python2\.7-dedicated-switch +--------------------------------------------- +Send region at point to Python2.7 unique interpreter and switch to result. + +py-execute-region-jython +------------------------ +Send region at point to Jython interpreter. + +py-execute-region-jython-switch +------------------------------- +Send region at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-jython-no-switch +---------------------------------- +Send region at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-jython-dedicated +---------------------------------- +Send region at point to Jython unique interpreter. + +py-execute-region-jython-dedicated-switch +----------------------------------------- +Send region at point to Jython unique interpreter and switch to result. + +py-execute-region-python3\.2 +---------------------------- +Send region at point to Python3.2 interpreter. + +py-execute-region-python3\.2-switch +----------------------------------- +Send region at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-python3\.2-no-switch +-------------------------------------- +Send region at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-python3\.2-dedicated +-------------------------------------- +Send region at point to Python3.2 unique interpreter. + +py-execute-region-python3\.2-dedicated-switch +--------------------------------------------- +Send region at point to Python3.2 unique interpreter and switch to result. + +py-execute-region-python3\.3 +---------------------------- +Send region at point to Python3.3 interpreter. + +py-execute-region-python3\.3-switch +----------------------------------- +Send region at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-python3\.3-no-switch +-------------------------------------- +Send region at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-python3\.3-dedicated +-------------------------------------- +Send region at point to Python3.3 unique interpreter. + +py-execute-region-python3\.3-dedicated-switch +--------------------------------------------- +Send region at point to Python3.3 unique interpreter and switch to result. + +py-execute-region-bpython +------------------------- +Send region at point to Bpython interpreter. + +py-execute-region-bpython-switch +-------------------------------- +Send region at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-region-bpython-no-switch +----------------------------------- +Send region at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-region-bpython-dedicated +----------------------------------- +Send region at point to Bpython unique interpreter. + +py-execute-region-bpython-dedicated-switch +------------------------------------------ +Send region at point to Bpython unique interpreter and switch to result. + +py-execute-buffer-python +------------------------ +Send buffer at point to Python interpreter. + +py-execute-buffer-python-switch +------------------------------- +Send buffer at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-python-no-switch +---------------------------------- +Send buffer at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-python-dedicated +---------------------------------- +Send buffer at point to Python unique interpreter. + +py-execute-buffer-python-dedicated-switch +----------------------------------------- +Send buffer at point to Python unique interpreter and switch to result. + +py-execute-buffer-ipython +------------------------- +Send buffer at point to IPython interpreter. + +py-execute-buffer-ipython-switch +-------------------------------- +Send buffer at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-ipython-no-switch +----------------------------------- +Send buffer at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-ipython-dedicated +----------------------------------- +Send buffer at point to IPython unique interpreter. + +py-execute-buffer-ipython-dedicated-switch +------------------------------------------ +Send buffer at point to IPython unique interpreter and switch to result. + +py-execute-buffer-python3 +------------------------- +Send buffer at point to Python3 interpreter. + +py-execute-buffer-python3-switch +-------------------------------- +Send buffer at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-python3-no-switch +----------------------------------- +Send buffer at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-python3-dedicated +----------------------------------- +Send buffer at point to Python3 unique interpreter. + +py-execute-buffer-python3-dedicated-switch +------------------------------------------ +Send buffer at point to Python3 unique interpreter and switch to result. + +py-execute-buffer-python2 +------------------------- +Send buffer at point to Python2 interpreter. + +py-execute-buffer-python2-switch +-------------------------------- +Send buffer at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-python2-no-switch +----------------------------------- +Send buffer at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-python2-dedicated +----------------------------------- +Send buffer at point to Python2 unique interpreter. + +py-execute-buffer-python2-dedicated-switch +------------------------------------------ +Send buffer at point to Python2 unique interpreter and switch to result. + +py-execute-buffer-python2\.7 +---------------------------- +Send buffer at point to Python2.7 interpreter. + +py-execute-buffer-python2\.7-switch +----------------------------------- +Send buffer at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-python2\.7-no-switch +-------------------------------------- +Send buffer at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-python2\.7-dedicated +-------------------------------------- +Send buffer at point to Python2.7 unique interpreter. + +py-execute-buffer-python2\.7-dedicated-switch +--------------------------------------------- +Send buffer at point to Python2.7 unique interpreter and switch to result. + +py-execute-buffer-jython +------------------------ +Send buffer at point to Jython interpreter. + +py-execute-buffer-jython-switch +------------------------------- +Send buffer at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-jython-no-switch +---------------------------------- +Send buffer at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-jython-dedicated +---------------------------------- +Send buffer at point to Jython unique interpreter. + +py-execute-buffer-jython-dedicated-switch +----------------------------------------- +Send buffer at point to Jython unique interpreter and switch to result. + +py-execute-buffer-python3\.2 +---------------------------- +Send buffer at point to Python3.2 interpreter. + +py-execute-buffer-python3\.2-switch +----------------------------------- +Send buffer at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-python3\.2-no-switch +-------------------------------------- +Send buffer at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-python3\.2-dedicated +-------------------------------------- +Send buffer at point to Python3.2 unique interpreter. + +py-execute-buffer-python3\.2-dedicated-switch +--------------------------------------------- +Send buffer at point to Python3.2 unique interpreter and switch to result. + +py-execute-buffer-python3\.3 +---------------------------- +Send buffer at point to Python3.3 interpreter. + +py-execute-buffer-python3\.3-switch +----------------------------------- +Send buffer at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-python3\.3-no-switch +-------------------------------------- +Send buffer at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-python3\.3-dedicated +-------------------------------------- +Send buffer at point to Python3.3 unique interpreter. + +py-execute-buffer-python3\.3-dedicated-switch +--------------------------------------------- +Send buffer at point to Python3.3 unique interpreter and switch to result. + +py-execute-buffer-bpython +------------------------- +Send buffer at point to Bpython interpreter. + +py-execute-buffer-bpython-switch +-------------------------------- +Send buffer at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-buffer-bpython-no-switch +----------------------------------- +Send buffer at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-buffer-bpython-dedicated +----------------------------------- +Send buffer at point to Bpython unique interpreter. + +py-execute-buffer-bpython-dedicated-switch +------------------------------------------ +Send buffer at point to Bpython unique interpreter and switch to result. + +py-execute-expression-python +---------------------------- +Send expression at point to Python interpreter. + +py-execute-expression-python-switch +----------------------------------- +Send expression at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-python-no-switch +-------------------------------------- +Send expression at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-python-dedicated +-------------------------------------- +Send expression at point to Python unique interpreter. + +py-execute-expression-python-dedicated-switch +--------------------------------------------- +Send expression at point to Python unique interpreter and switch to result. + +py-execute-expression-ipython +----------------------------- +Send expression at point to IPython interpreter. + +py-execute-expression-ipython-switch +------------------------------------ +Send expression at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-ipython-no-switch +--------------------------------------- +Send expression at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-ipython-dedicated +--------------------------------------- +Send expression at point to IPython unique interpreter. + +py-execute-expression-ipython-dedicated-switch +---------------------------------------------- +Send expression at point to IPython unique interpreter and switch to result. + +py-execute-expression-python3 +----------------------------- +Send expression at point to Python3 interpreter. + +py-execute-expression-python3-switch +------------------------------------ +Send expression at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-python3-no-switch +--------------------------------------- +Send expression at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-python3-dedicated +--------------------------------------- +Send expression at point to Python3 unique interpreter. + +py-execute-expression-python3-dedicated-switch +---------------------------------------------- +Send expression at point to Python3 unique interpreter and switch to result. + +py-execute-expression-python2 +----------------------------- +Send expression at point to Python2 interpreter. + +py-execute-expression-python2-switch +------------------------------------ +Send expression at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-python2-no-switch +--------------------------------------- +Send expression at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-python2-dedicated +--------------------------------------- +Send expression at point to Python2 unique interpreter. + +py-execute-expression-python2-dedicated-switch +---------------------------------------------- +Send expression at point to Python2 unique interpreter and switch to result. + +py-execute-expression-python2\.7 +-------------------------------- +Send expression at point to Python2.7 interpreter. + +py-execute-expression-python2\.7-switch +--------------------------------------- +Send expression at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-python2\.7-no-switch +------------------------------------------ +Send expression at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-python2\.7-dedicated +------------------------------------------ +Send expression at point to Python2.7 unique interpreter. + +py-execute-expression-python2\.7-dedicated-switch +------------------------------------------------- +Send expression at point to Python2.7 unique interpreter and switch to result. + +py-execute-expression-jython +---------------------------- +Send expression at point to Jython interpreter. + +py-execute-expression-jython-switch +----------------------------------- +Send expression at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-jython-no-switch +-------------------------------------- +Send expression at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-jython-dedicated +-------------------------------------- +Send expression at point to Jython unique interpreter. + +py-execute-expression-jython-dedicated-switch +--------------------------------------------- +Send expression at point to Jython unique interpreter and switch to result. + +py-execute-expression-python3\.2 +-------------------------------- +Send expression at point to Python3.2 interpreter. + +py-execute-expression-python3\.2-switch +--------------------------------------- +Send expression at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-python3\.2-no-switch +------------------------------------------ +Send expression at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-python3\.2-dedicated +------------------------------------------ +Send expression at point to Python3.2 unique interpreter. + +py-execute-expression-python3\.2-dedicated-switch +------------------------------------------------- +Send expression at point to Python3.2 unique interpreter and switch to result. + +py-execute-expression-python3\.3 +-------------------------------- +Send expression at point to Python3.3 interpreter. + +py-execute-expression-python3\.3-switch +--------------------------------------- +Send expression at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-python3\.3-no-switch +------------------------------------------ +Send expression at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-python3\.3-dedicated +------------------------------------------ +Send expression at point to Python3.3 unique interpreter. + +py-execute-expression-python3\.3-dedicated-switch +------------------------------------------------- +Send expression at point to Python3.3 unique interpreter and switch to result. + +py-execute-expression-bpython +----------------------------- +Send expression at point to Bpython interpreter. + +py-execute-expression-bpython-switch +------------------------------------ +Send expression at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-expression-bpython-no-switch +--------------------------------------- +Send expression at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-expression-bpython-dedicated +--------------------------------------- +Send expression at point to Bpython unique interpreter. + +py-execute-expression-bpython-dedicated-switch +---------------------------------------------- +Send expression at point to Bpython unique interpreter and switch to result. + +py-execute-partial-expression-python +------------------------------------ +Send partial-expression at point to Python interpreter. + +py-execute-partial-expression-python-switch +------------------------------------------- +Send partial-expression at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-python-no-switch +---------------------------------------------- +Send partial-expression at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-python-dedicated +---------------------------------------------- +Send partial-expression at point to Python unique interpreter. + +py-execute-partial-expression-python-dedicated-switch +----------------------------------------------------- +Send partial-expression at point to Python unique interpreter and switch to result. + +py-execute-partial-expression-ipython +------------------------------------- +Send partial-expression at point to IPython interpreter. + +py-execute-partial-expression-ipython-switch +-------------------------------------------- +Send partial-expression at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-ipython-no-switch +----------------------------------------------- +Send partial-expression at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-ipython-dedicated +----------------------------------------------- +Send partial-expression at point to IPython unique interpreter. + +py-execute-partial-expression-ipython-dedicated-switch +------------------------------------------------------ +Send partial-expression at point to IPython unique interpreter and switch to result. + +py-execute-partial-expression-python3 +------------------------------------- +Send partial-expression at point to Python3 interpreter. + +py-execute-partial-expression-python3-switch +-------------------------------------------- +Send partial-expression at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-python3-no-switch +----------------------------------------------- +Send partial-expression at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-python3-dedicated +----------------------------------------------- +Send partial-expression at point to Python3 unique interpreter. + +py-execute-partial-expression-python3-dedicated-switch +------------------------------------------------------ +Send partial-expression at point to Python3 unique interpreter and switch to result. + +py-execute-partial-expression-python2 +------------------------------------- +Send partial-expression at point to Python2 interpreter. + +py-execute-partial-expression-python2-switch +-------------------------------------------- +Send partial-expression at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-python2-no-switch +----------------------------------------------- +Send partial-expression at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-python2-dedicated +----------------------------------------------- +Send partial-expression at point to Python2 unique interpreter. + +py-execute-partial-expression-python2-dedicated-switch +------------------------------------------------------ +Send partial-expression at point to Python2 unique interpreter and switch to result. + +py-execute-partial-expression-python2\.7 +---------------------------------------- +Send partial-expression at point to Python2.7 interpreter. + +py-execute-partial-expression-python2\.7-switch +----------------------------------------------- +Send partial-expression at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-python2\.7-no-switch +-------------------------------------------------- +Send partial-expression at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-python2\.7-dedicated +-------------------------------------------------- +Send partial-expression at point to Python2.7 unique interpreter. + +py-execute-partial-expression-python2\.7-dedicated-switch +--------------------------------------------------------- +Send partial-expression at point to Python2.7 unique interpreter and switch to result. + +py-execute-partial-expression-jython +------------------------------------ +Send partial-expression at point to Jython interpreter. + +py-execute-partial-expression-jython-switch +------------------------------------------- +Send partial-expression at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-jython-no-switch +---------------------------------------------- +Send partial-expression at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-jython-dedicated +---------------------------------------------- +Send partial-expression at point to Jython unique interpreter. + +py-execute-partial-expression-jython-dedicated-switch +----------------------------------------------------- +Send partial-expression at point to Jython unique interpreter and switch to result. + +py-execute-partial-expression-python3\.2 +---------------------------------------- +Send partial-expression at point to Python3.2 interpreter. + +py-execute-partial-expression-python3\.2-switch +----------------------------------------------- +Send partial-expression at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-python3\.2-no-switch +-------------------------------------------------- +Send partial-expression at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-python3\.2-dedicated +-------------------------------------------------- +Send partial-expression at point to Python3.2 unique interpreter. + +py-execute-partial-expression-python3\.2-dedicated-switch +--------------------------------------------------------- +Send partial-expression at point to Python3.2 unique interpreter and switch to result. + +py-execute-partial-expression-python3\.3 +---------------------------------------- +Send partial-expression at point to Python3.3 interpreter. + +py-execute-partial-expression-python3\.3-switch +----------------------------------------------- +Send partial-expression at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-python3\.3-no-switch +-------------------------------------------------- +Send partial-expression at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-python3\.3-dedicated +-------------------------------------------------- +Send partial-expression at point to Python3.3 unique interpreter. + +py-execute-partial-expression-python3\.3-dedicated-switch +--------------------------------------------------------- +Send partial-expression at point to Python3.3 unique interpreter and switch to result. + +py-execute-partial-expression-bpython +------------------------------------- +Send partial-expression at point to Bpython interpreter. + +py-execute-partial-expression-bpython-switch +-------------------------------------------- +Send partial-expression at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-partial-expression-bpython-no-switch +----------------------------------------------- +Send partial-expression at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-partial-expression-bpython-dedicated +----------------------------------------------- +Send partial-expression at point to Bpython unique interpreter. + +py-execute-partial-expression-bpython-dedicated-switch +------------------------------------------------------ +Send partial-expression at point to Bpython unique interpreter and switch to result. + +py-execute-line-python +---------------------- +Send line at point to Python interpreter. + +py-execute-line-python-switch +----------------------------- +Send line at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-python-no-switch +-------------------------------- +Send line at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-python-dedicated +-------------------------------- +Send line at point to Python unique interpreter. + +py-execute-line-python-dedicated-switch +--------------------------------------- +Send line at point to Python unique interpreter and switch to result. + +py-execute-line-ipython +----------------------- +Send line at point to IPython interpreter. + +py-execute-line-ipython-switch +------------------------------ +Send line at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-ipython-no-switch +--------------------------------- +Send line at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-ipython-dedicated +--------------------------------- +Send line at point to IPython unique interpreter. + +py-execute-line-ipython-dedicated-switch +---------------------------------------- +Send line at point to IPython unique interpreter and switch to result. + +py-execute-line-python3 +----------------------- +Send line at point to Python3 interpreter. + +py-execute-line-python3-switch +------------------------------ +Send line at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-python3-no-switch +--------------------------------- +Send line at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-python3-dedicated +--------------------------------- +Send line at point to Python3 unique interpreter. + +py-execute-line-python3-dedicated-switch +---------------------------------------- +Send line at point to Python3 unique interpreter and switch to result. + +py-execute-line-python2 +----------------------- +Send line at point to Python2 interpreter. + +py-execute-line-python2-switch +------------------------------ +Send line at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-python2-no-switch +--------------------------------- +Send line at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-python2-dedicated +--------------------------------- +Send line at point to Python2 unique interpreter. + +py-execute-line-python2-dedicated-switch +---------------------------------------- +Send line at point to Python2 unique interpreter and switch to result. + +py-execute-line-python2\.7 +-------------------------- +Send line at point to Python2.7 interpreter. + +py-execute-line-python2\.7-switch +--------------------------------- +Send line at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-python2\.7-no-switch +------------------------------------ +Send line at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-python2\.7-dedicated +------------------------------------ +Send line at point to Python2.7 unique interpreter. + +py-execute-line-python2\.7-dedicated-switch +------------------------------------------- +Send line at point to Python2.7 unique interpreter and switch to result. + +py-execute-line-jython +---------------------- +Send line at point to Jython interpreter. + +py-execute-line-jython-switch +----------------------------- +Send line at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-jython-no-switch +-------------------------------- +Send line at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-jython-dedicated +-------------------------------- +Send line at point to Jython unique interpreter. + +py-execute-line-jython-dedicated-switch +--------------------------------------- +Send line at point to Jython unique interpreter and switch to result. + +py-execute-line-python3\.2 +-------------------------- +Send line at point to Python3.2 interpreter. + +py-execute-line-python3\.2-switch +--------------------------------- +Send line at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-python3\.2-no-switch +------------------------------------ +Send line at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-python3\.2-dedicated +------------------------------------ +Send line at point to Python3.2 unique interpreter. + +py-execute-line-python3\.2-dedicated-switch +------------------------------------------- +Send line at point to Python3.2 unique interpreter and switch to result. + +py-execute-line-python3\.3 +-------------------------- +Send line at point to Python3.3 interpreter. + +py-execute-line-python3\.3-switch +--------------------------------- +Send line at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-python3\.3-no-switch +------------------------------------ +Send line at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-python3\.3-dedicated +------------------------------------ +Send line at point to Python3.3 unique interpreter. + +py-execute-line-python3\.3-dedicated-switch +------------------------------------------- +Send line at point to Python3.3 unique interpreter and switch to result. + +py-execute-line-bpython +----------------------- +Send line at point to Bpython interpreter. + +py-execute-line-bpython-switch +------------------------------ +Send line at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. + +py-execute-line-bpython-no-switch +--------------------------------- +Send line at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' + +py-execute-line-bpython-dedicated +--------------------------------- +Send line at point to Bpython unique interpreter. + +py-execute-line-bpython-dedicated-switch +---------------------------------------- +Send line at point to Bpython unique interpreter and switch to result. + +;;; Subprocess utilities and filters +------------------------------------ + + +py-remove-overlays-at-point +--------------------------- +Remove overlays as set when `py-highlight-error-source-p' is non-nil. + +py-down-exception +----------------- +Go to the next line down in the traceback. + +With C-u (programmatically, optional argument +BOTTOM), jump to the bottom (innermost) exception in the exception +stack. + +py-up-exception +--------------- +Go to the previous line up in the traceback. + +With C-u (programmatically, optional argument TOP) +jump to the top (outermost) exception in the exception stack. + +py-mouseto-exception +-------------------- +Jump to the code which caused the Python exception at EVENT. +EVENT is usually a mouse click. + +py-goto-exception +----------------- +Go to the line indicated by the traceback. + +py-output-buffer-filter +----------------------- +Clear output buffer from py-shell-input prompt etc. + +py-send-string +-------------- +Evaluate STRING in inferior Python process. + +py-send-file +------------ +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. + diff --git a/elpa/python-mode-6.1.3/doc/variables-python-mode.org b/elpa/python-mode-6.1.3/doc/variables-python-mode.org new file mode 100644 index 000000000..cc261e7a3 --- /dev/null +++ b/elpa/python-mode-6.1.3/doc/variables-python-mode.org @@ -0,0 +1,833 @@ +python-mode.el variables + +** python-mode-modeline-display + String to display in Emacs modeline + +** py-indent-offset + Amount of offset per level of indentation. +`M-x py-guess-indent-offset' can usually guess a good value when +you're editing someone else's Python code. + +** py-backslashed-lines-indent-offset + Amount of offset per level of indentation of backslashed. +No semantic indent, which diff to `py-indent-offset' indicates + +** pdb-path + 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 + +** py-verbose-p + If indenting functions should report reached indent level. + +Default is nil. + +** py-store-result-p + When non-nil, put resulting string of `py-execute-...' into kill-ring, so it might be yanked. + +Default is nil + +** py-load-skeletons-p + If skeleton definitions should be loaded, default is nil. + +** py-load-pymacs-p + If Pymacs related stuff should be loaded. + +Default is nil. + +Pymacs has been written by François Pinard and many others. +See original source: http://pymacs.progiciels-bpi.ca + +** py-smart-operator-mode-p + If python-mode calls (smart-operator-mode-on) + +Default is non-nil. + +** py-sexp-function + When set, it's value is called instead of `forward-sexp', `backward-sexp' + +Default is nil. + +** py-autopair-mode + If python-mode calls (autopair-mode-on) + +Default is nil +Load `autopair-mode' written by Joao Tavora +URL: http://autopair.googlecode.com + +** py-no-completion-calls-dabbrev-expand-p + If completion function should call dabbrev-expand when no completion found. Default is `t' + +See also `py-indent-no-completion-p' + +** py-indent-no-completion-p + If completion function should insert a TAB when no completion found. Default is `t' + +See also `py-no-completion-calls-dabbrev-expand-p' + +** py-set-fill-column-p + If python-mode should set fill-column + +according values in `py-comment-fill-column' and `py-docstring-fill-column'. +Default is nil + +** py-autofill-timer-delay + Delay when idle before functions ajusting `py-docstring-fill-column' resp. `py-comment-fill-column' are called. + +** py-docstring-fill-column + Value of `fill-column' to use when filling a docstring. +Any non-integer value means do not use a different value of +`fill-column' when filling docstrings. + +** py-comment-fill-column + Value of `fill-column' to use when filling a comment. +Any non-integer value means do not use a different value of +`fill-column' when filling docstrings. + +** py-fontify-shell-buffer-p + 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 + +** py-modeline-display-full-path-p + 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. + +** py-modeline-acronym-display-home-p + If the modeline acronym should contain chars indicating the home-directory. + +Default is nil + +** py-install-directory + Directory where python-mode.el and it's subdirectories should be installed. Needed for completion and other environment stuff only. + +** py-guess-py-install-directory-p + If in cases, `py-install-directory' isn't set, `py-set-load-path'should guess it from `buffer-file-name'. + +** py-extensions + File where extensions to python-mode.el should be installed. Used by virtualenv support. + +** py-pylint-offer-current-p + If current buffers file should be offered for check. + +Default is non-nil. If nil, `py-pylint-run' offers filename from history + +** py-hide-show-minor-mode-p + If hide-show minor-mode should be on, default is nil. + +** empty-comment-line-separates-paragraph-p + Consider paragraph start/end lines with nothing inside but comment sign. + +Default is non-nil + +** py-if-name-main-permission-p + Allow execution of code inside blocks started +by "if __name__== '__main__':". + +Default is non-nil + +** py-use-font-lock-doc-face-p + If documention string inside of def or class get `font-lock-doc-face'. + +`font-lock-doc-face' inherits `font-lock-string-face'. +Call M-x `customize-face' in order to have a visible effect. + +** py-defun-use-top-level-p + When non-nil, keys C-M-a, C-M-e address top-level form. + +Default is nil. + +Beginning- end-of-defun forms use +commands `py-beginning-of-top-level', `py-end-of-top-level' + +mark-defun marks top-level form at point etc. + + +** py-tab-shifts-region-p + If `t', TAB will indent/cycle the region, not just the current line. + +Default is nil + +** py-tab-indents-region-p + When `t' and first TAB doesn't shift, indent-region is called. + +Default is nil + +** py-block-comment-prefix-p + If py-comment inserts py-block-comment-prefix. + +Default is t + +** py-org-cycle-p + When non-nil, command `org-cycle' is available at shift-TAB, + +Default is nil. + +** ipython-complete-use-separate-shell-p + If `ipython-complete' should use a separate shell. Thus prompt-counter is not incremented by completion. + +** py-outline-minor-mode-p + If outline minor-mode should be on, default is `t'. + +** py-outline-mode-keywords + Keywords composing visible heads. + +** py-start-run-py-shell + If `python-mode' should start a python-shell, `py-shell'. + +Default is `nil'. + +** py-start-run-ipython-shell + If `python-mode' should start an ipython-shell. + +Default is `nil'. + +** py-close-provides-newline + If a newline is inserted, when line after block isn't empty. Default is non-nil. + +** py-dedent-keep-relative-column + If point should follow dedent or kind of electric move to end of line. Default is t - keep relative position. + +** py-indent-honors-multiline-listing + If `t', indents to 1+ column of opening delimiter. If `nil', indent adds one level to the beginning of statement. Default is `nil'. + +** py-indent-paren-spanned-multilines-p + If non-nil, indents elements of list a value of `py-indent-offset' to first element: + +def foo(): + if (foo && + baz): + bar() + +Default lines up with first element: + +def foo(): + if (foo && + baz): + bar() + + +** py-indent-honors-inline-comment + If non-nil, indents to column of inlined comment start. +Default is nil. + +** py-closing-list-dedents-bos + When non-nil, indent list's closing delimiter like start-column. + +It will be lined up under the first character of + the line that starts the multi-line construct, as in: + +my_list = [ + 1, 2, 3, + 4, 5, 6, +] + +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', +) + +Default is nil, i.e. + +my_list = [ + 1, 2, 3, + 4, 5, 6, + ] +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', + ) + +Examples from PEP8 + + +** py-closing-list-space + Number of chars, closing parenthesis outdent from opening, default is 1 + +** py-closing-list-keeps-space + If non-nil, closing parenthesis dedents onto column of opening plus `py-closing-list-space', default is nil + +** py-electric-kill-backward-p + Affects `py-electric-backspace'. Default is nil. + +If behind a delimited form of braces, brackets or parentheses, +backspace will kill it's contents + +With when cursor after +my_string[0:1] +--------------^ + +==> + +my_string[] +----------^ + +In result cursor is insided emptied delimited form. + +** py-electric-colon-active-p + `py-electric-colon' feature. Default is `nil'. See lp:837065 for discussions. + +See also `py-electric-colon-bobl-only' + +** py-electric-colon-bobl-only + When inserting a colon, do not indent lines unless at beginning of block + +See lp:1207405 resp. `py-electric-colon-active-p' + +** py-electric-colon-greedy-p + If py-electric-colon should indent to the outmost reasonable level. + +If nil, default, it will not move from at any reasonable level. + +** py-electric-colon-newline-and-indent-p + If non-nil, `py-electric-colon' will call `newline-and-indent'. Default is `nil'. + +** py-electric-comment-p + If "#" should call `py-electric-comment'. Default is `nil'. + +** py-electric-comment-add-space-p + If py-electric-comment should add a space. Default is `nil'. + +** py-mark-decorators + If py-mark-def-or-class functions should mark decorators too. Default is `nil'. + +** py-tab-indent + Non-nil means TAB in Python mode calls `py-indent-line'. + +** py-return-key + Which command should call. + +** py-complete-function + When set, enforces function todo completion, default is nil. + +Normally python-mode, resp. inferior-python-mode know best which function to use. + +** ipython-complete-function + Function used for completion in IPython shell buffers. + +** py-encoding-string + Default string specifying encoding of a Python file. + +** py-shebang-startstring + Detecting the shell in head of file. + +** py-python-command-args + List of string arguments to be used when starting a Python shell. + +** py-jython-command-args + List of string arguments to be used when starting a Jython shell. + +** py-cleanup-temporary + If temporary buffers and files used by functions executing region should be deleted afterwards. + +** py-execute-no-temp-p + Seems Emacs-24.3 provided a way executing stuff without temporary files. + +** py-lhs-inbound-indent + When line starts a multiline-assignment: How many colums indent should be more than opening bracket, brace or parenthesis. + +** py-continuation-offset + Additional amount of offset to give for some continuation lines. +Continuation lines are those that immediately follow a backslash +terminated line. + +** py-indent-tabs-mode + Python-mode starts `indent-tabs-mode' with the value specified here, default is nil. + +** py-smart-indentation + 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'. + +** py-block-comment-prefix + String used by M-x 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. + +** py-indent-comments + When t, comment lines are indented. + +** py-uncomment-indents-p + When non-nil, after uncomment indent lines. + +** py-separator-char + Values set by defcustom only will not be seen in batch-mode. + +** 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. + +** py-beep-if-tab-change + Ring the bell if `tab-width' is changed. +If a comment of the form + + # vi:set tabsize=: + +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 , `tab-width' is set to , 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. + +** py-jump-on-exception + 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. + +** py-ask-about-save + If not nil, ask about which buffers to save before executing some code. +Otherwise, all modified buffers are saved without asking. + +** py-backspace-function + Function called by `py-electric-backspace' when deleting backwards. + +** py-delete-function + Function called by `py-electric-delete' when deleting forwards. + +** py-pdbtrack-do-tracking-p + 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. + +** py-pdbtrack-filename-mapping + 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. + +** py-pdbtrack-minor-mode-string + String to use in the minor mode list when pdbtrack is enabled. + +** py-import-check-point-max + 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. + +** py-jython-packages + Imported packages that imply `jython-mode'. + +** py-current-defun-show + 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'. + +** py-current-defun-delay + When called interactively, `py-current-defun' should wait PY-WHICH-FUNC-DELAY seconds at the definition name found, before returning to previous position. + +** py-send-receive-delay + Seconds to wait for output, used by `py-send-receive'. + +** py-honor-IPYTHONDIR-p + When non-nil ipython-history file is constructed by $IPYTHONDIR +followed by "/history". Default is nil. + +Otherwise value of py-ipython-history is used. + +** py-ipython-history + ipython-history default file. Used when py-honor-IPYTHONDIR-p is nil (default) + +** py-honor-PYTHONHISTORY-p + When non-nil python-history file is set by $PYTHONHISTORY +Default is nil. + +Otherwise value of py-python-history is used. + +** py-python-history + python-history default file. Used when py-honor-PYTHONHISTORY-p is nil (default) + +** py-master-file + If non-nil, M-x 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: + + + +** py-pychecker-command + Shell command used to run Pychecker. + +** py-pychecker-command-args + List of string arguments to be passed to pychecker. + +** py-pep8-command + Shell command used to run pep8. + +** py-pep8-command-args + List of string arguments to be passed to pylint. + +Default is "" + +** py-pyflakespep8-command + Shell command used to run `pyflakespep8'. + +** py-pyflakespep8-command-args + List of string arguments to be passed to pyflakespep8. + +Default is "" + +** py-pyflakes-command + Shell command used to run Pyflakes. + +** py-pyflakes-command-args + List of string arguments to be passed to pyflakes. + +Default is "" + +** py-pylint-command + Shell command used to run Pylint. + +** py-pylint-command-args + List of string arguments to be passed to pylint. + +Default is "--errors-only" + +** py-shell-input-prompt-1-regexp + A regular expression to match the input prompt of the shell. + +** py-shell-input-prompt-2-regexp + A regular expression to match the input prompt of the shell after the + first line of input. + +** py-shell-prompt-read-only + If non-nil, the python prompt is read only. Setting this +variable will only effect new shells. + +** py-fileless-buffer-use-default-directory-p + When `py-use-current-dir-when-execute-p' is non-nil and no buffer-file exists, value of `default-directory' sets current working directory of Python output shell + +** py-keep-shell-dir-when-execute-p + Don't change Python shell's current working directory when sending code. + +See also `py-execute-directory' + +** py-switch-buffers-on-execute-p + When non-nil switch to the Python output buffer. + +** py-split-windows-on-execute-p + When non-nil split windows. + +** py-max-split-windows + When split windows is enabled the maximum windows to allow + before reusing other windows. + +** py-split-windows-on-execute-function + How window should get splitted to display results of py-execute-... functions. + +** py-hide-show-keywords + Keywords composing visible heads. +Also used by (minor-)outline-mode + +** py-hide-show-hide-docstrings + Controls if doc strings can be hidden by hide-show + +** py-paragraph-fill-docstring-p + If `py-fill-paragraph', when inside a docstring, should fill the complete string. + +Default is nil. + +Convenient use of `M-q' inside docstrings +See also `py-docstring-style' + + +** python-mode-hook + Hook run after entering python-mode-modeline-display mode. +No problems result if this variable is not bound. +`add-hook' automatically binds it. (This is true for all hook variables.) + +** py-imenu-create-index-p + Non-nil means Python mode creates and displays an index menu of functions and global variables. + +** py-imenu-create-index-function + Switch between `py-imenu-create-index-new', which also lists modules variables, and series 5. index-machine + +** py-shell-name + A PATH/TO/EXECUTABLE or default value `py-shell' may look for, if no shell is specified by command. + +** py-shell-toggle-1 + A PATH/TO/EXECUTABLE or default value used by `py-toggle-shell'. + +** py-shell-toggle-2 + A PATH/TO/EXECUTABLE or default value used by `py-toggle-shell'. + +** py-match-paren-mode + 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. + +** py-match-paren-key + String used by M-x 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. + +** py-kill-empty-line + If t, py-indent-forward-line kills empty lines. + +** py-remove-cwd-from-path + 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). + +** py-imenu-show-method-args-p + Controls echoing of arguments of functions & methods in the Imenu buffer. +When non-nil, arguments are printed. + +** py-history-filter-regexp + Input matching this regexp is not saved on the history list. +Default ignores all inputs of 0, 1, or 2 non-blank characters. + +** inferior-python-filter-regexp + Input matching this regexp is not saved on the history list. +Default ignores all inputs of 0, 1, or 2 non-blank characters. + +** py-set-complete-keymap-p + If `py-complete-initialize', which sets up enviroment for Pymacs based py-complete, should load it's keys into `python-mode-map' + +Default is nil. +See also resp. edit `py-complete-set-keymap' + +** py-use-local-default + 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. + +** py-highlight-error-source-p + When py-execute-... commands raise an error, respective code in source-buffer will be highlighted. Default is nil. + +M-x `py-remove-overlays-at-point' removes that highlighting. + + +** py-set-pager-cat-p + If the shell environment variable $PAGER should set to `cat'. + +If `t', use `C-c C-r' to jump to beginning of output. Then scroll normally. + +Avoids lp:783828, "Terminal not fully functional", for help('COMMAND') in python-shell + +When non-nil, imports module `os' + +** py-prompt-on-changed-p + When called interactively, ask for save before a changed buffer is sent to interpreter. + +Default is `t' + +** py-dedicated-process-p + If commands executing code use a dedicated shell. + +Default is nil + +** py-shell-local-path + If `py-use-local-default' is non-nil, `py-shell' will use EXECUTABLE indicated here incl. path. + +** py-edit-only-p + When `t' `python-mode' will not take resort nor check for installed Python executables. Default is nil. + +See bug report at launchpad, lp:944093. + +** py-force-py-shell-name-p + When `t', execution with kind of Python specified in `py-shell-name' is enforced, possibly shebang doesn't take precedence. + +** python-mode-v5-behavior-p + Execute region through `shell-command-on-region' as +v5 did it - lp:990079. This might fail with certain chars - see UnicodeEncodeError lp:550661 + +** py-trailing-whitespace-smart-delete-p + Default is nil. When t, python-mode calls + (add-hook 'before-save-hook 'delete-trailing-whitespace nil 'local) + +Also commands may delete trailing whitespace by the way. +When editing other peoples code, this may produce a larger diff than expected + +** py-newline-delete-trailing-whitespace-p + Delete trailing whitespace maybe left by `py-newline-and-indent'. + +Default is `t'. See lp:1100892 + +** py-warn-tmp-files-left-p + Messages a warning, when `py-temp-directory' contains files susceptible being left by previous Python-mode sessions. See also lp:987534 + +** py-ipython-execute-delay + Delay needed by execute functions when no IPython shell is running. + +** python-shell-buffer-name + Default buffer name for Python interpreter. + +** python-shell-interpreter + Default Python interpreter for shell. + +** python-shell-prompt-regexp + Regular Expression matching top-level input prompt of python shell. +It should not contain a caret (^) at the beginning. + +** py-ffap-p + Select python-modes way to find file at point. + +Default is nil + +** python-ffap-setup-code + Python code to get a module path. + +** py-ffap-string-code + Python code used to get a string with the path of a module. + +** py-eldoc-setup-code + Python code to setup documentation retrieval. + +** py-setup-codes + List of code run by `py-shell-send-setup-codes'. + +** py-shell-prompt-regexp + Regular Expression matching top-level input prompt of python shell. +It should not contain a caret (^) at the beginning. + +** python-shell-completion-setup-code + Code used to setup completion in inferior Python processes. + +** 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''')) + +** strip-chars-before + Regexp indicating which chars shall be stripped before STRING - which is defined by `string-chars-preserve'. + +** strip-chars-after + Regexp indicating which chars shall be stripped after STRING - which is defined by `string-chars-preserve'. + +** py-docstring-style + Implemented styles are DJANGO, ONETWO, PEP-257, PEP-257-NN, +SYMMETRIC, and NIL. + +A value of NIL won't care about quotes +position and will treat docstrings a normal string, any other +value may result in one of the following docstring styles: + +DJANGO: + + """ + Process foo, return bar. + """ + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +ONETWO: + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +PEP-257: + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +PEP-257-NN: + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +SYMMETRIC: + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +** py-execute-directory + When set, stores the file's default directory-name py-execute-... functions act upon. + +Used by Python-shell for output of `py-execute-buffer' and related commands. See also `py-use-current-dir-when-execute-p' + +** py-use-current-dir-when-execute-p + When `t', current directory is used by Python-shell for output of `py-execute-buffer' and related commands. + +See also `py-execute-directory' + +** py-shell-prompt-output-regexp + Regular Expression matching output prompt of python shell. +It should not contain a caret (^) at the beginning. + +** py-output-buffer + When `py-enforce-output-buffer-p' is non-nil, provides the +default for output-buffer. + +** py-enforce-output-buffer-p + When non-nil, current value of `py-output-buffer' is used for output, +regardless of environment. Default is nil + +** py-underscore-word-syntax-p + 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 + diff --git a/elpa/python-mode-6.1.3/doc/variables-python-mode.rst b/elpa/python-mode-6.1.3/doc/variables-python-mode.rst new file mode 100644 index 000000000..632e84a38 --- /dev/null +++ b/elpa/python-mode-6.1.3/doc/variables-python-mode.rst @@ -0,0 +1,995 @@ +python-mode.el variables + +==================== + +python-mode-modeline-display +---------------------------- +String to display in Emacs modeline + +py-indent-offset +---------------- +Amount of offset per level of indentation. +`M-x py-guess-indent-offset' can usually guess a good value when +you're editing someone else's Python code. + +py-backslashed-lines-indent-offset +---------------------------------- +Amount of offset per level of indentation of backslashed. +No semantic indent, which diff to `py-indent-offset' indicates + +pdb-path +-------- +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 + +py-verbose-p +------------ +If indenting functions should report reached indent level. + +Default is nil. + +py-store-result-p +----------------- +When non-nil, put resulting string of `py-execute-...' into kill-ring, so it might be yanked. + +Default is nil + +py-load-skeletons-p +------------------- +If skeleton definitions should be loaded, default is nil. + +py-load-pymacs-p +---------------- +If Pymacs related stuff should be loaded. + +Default is nil. + +Pymacs has been written by François Pinard and many others. +See original source: http://pymacs.progiciels-bpi.ca + +py-smart-operator-mode-p +------------------------ +If python-mode calls (smart-operator-mode-on) + +Default is non-nil. + +py-sexp-function +---------------- +When set, it's value is called instead of `forward-sexp', `backward-sexp' + +Default is nil. + +py-autopair-mode +---------------- +If python-mode calls (autopair-mode-on) + +Default is nil +Load `autopair-mode' written by Joao Tavora +URL: http://autopair.googlecode.com + +py-no-completion-calls-dabbrev-expand-p +--------------------------------------- +If completion function should call dabbrev-expand when no completion found. Default is `t' + +See also `py-indent-no-completion-p' + +py-indent-no-completion-p +------------------------- +If completion function should insert a TAB when no completion found. Default is `t' + +See also `py-no-completion-calls-dabbrev-expand-p' + +py-set-fill-column-p +-------------------- +If python-mode should set fill-column + +according values in `py-comment-fill-column' and `py-docstring-fill-column'. +Default is nil + +py-autofill-timer-delay +----------------------- +Delay when idle before functions ajusting `py-docstring-fill-column' resp. `py-comment-fill-column' are called. + +py-docstring-fill-column +------------------------ +Value of `fill-column' to use when filling a docstring. +Any non-integer value means do not use a different value of +`fill-column' when filling docstrings. + +py-comment-fill-column +---------------------- +Value of `fill-column' to use when filling a comment. +Any non-integer value means do not use a different value of +`fill-column' when filling docstrings. + +py-fontify-shell-buffer-p +------------------------- +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 + +py-modeline-display-full-path-p +------------------------------- +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. + +py-modeline-acronym-display-home-p +---------------------------------- +If the modeline acronym should contain chars indicating the home-directory. + +Default is nil + +py-install-directory +-------------------- +Directory where python-mode.el and it's subdirectories should be installed. Needed for completion and other environment stuff only. + +py-guess-py-install-directory-p +------------------------------- +If in cases, `py-install-directory' isn't set, `py-set-load-path'should guess it from `buffer-file-name'. + +py-extensions +------------- +File where extensions to python-mode.el should be installed. Used by virtualenv support. + +py-pylint-offer-current-p +------------------------- +If current buffers file should be offered for check. + +Default is non-nil. If nil, `py-pylint-run' offers filename from history + +py-hide-show-minor-mode-p +------------------------- +If hide-show minor-mode should be on, default is nil. + +empty-comment-line-separates-paragraph-p +---------------------------------------- +Consider paragraph start/end lines with nothing inside but comment sign. + +Default is non-nil + +py-if-name-main-permission-p +---------------------------- +Allow execution of code inside blocks started +by "if __name__== '__main__':". + +Default is non-nil + +py-use-font-lock-doc-face-p +--------------------------- +If documention string inside of def or class get `font-lock-doc-face'. + +`font-lock-doc-face' inherits `font-lock-string-face'. +Call M-x `customize-face' in order to have a visible effect. + +py-defun-use-top-level-p +------------------------ +When non-nil, keys C-M-a, C-M-e address top-level form. + +Default is nil. + +Beginning- end-of-defun forms use +commands `py-beginning-of-top-level', `py-end-of-top-level' + +mark-defun marks top-level form at point etc. + + +py-tab-shifts-region-p +---------------------- +If `t', TAB will indent/cycle the region, not just the current line. + +Default is nil + +py-tab-indents-region-p +----------------------- +When `t' and first TAB doesn't shift, indent-region is called. + +Default is nil + +py-block-comment-prefix-p +------------------------- +If py-comment inserts py-block-comment-prefix. + +Default is t + +py-org-cycle-p +-------------- +When non-nil, command `org-cycle' is available at shift-TAB, + +Default is nil. + +ipython-complete-use-separate-shell-p +------------------------------------- +If `ipython-complete' should use a separate shell. Thus prompt-counter is not incremented by completion. + +py-outline-minor-mode-p +----------------------- +If outline minor-mode should be on, default is `t'. + +py-outline-mode-keywords +------------------------ +Keywords composing visible heads. + +py-start-run-py-shell +--------------------- +If `python-mode' should start a python-shell, `py-shell'. + +Default is `nil'. + +py-start-run-ipython-shell +-------------------------- +If `python-mode' should start an ipython-shell. + +Default is `nil'. + +py-close-provides-newline +------------------------- +If a newline is inserted, when line after block isn't empty. Default is non-nil. + +py-dedent-keep-relative-column +------------------------------ +If point should follow dedent or kind of electric move to end of line. Default is t - keep relative position. + +py-indent-honors-multiline-listing +---------------------------------- +If `t', indents to 1+ column of opening delimiter. If `nil', indent adds one level to the beginning of statement. Default is `nil'. + +py-indent-paren-spanned-multilines-p +------------------------------------ +If non-nil, indents elements of list a value of `py-indent-offset' to first element: + +def foo(): + if (foo && + baz): + bar() + +Default lines up with first element: + +def foo(): + if (foo && + baz): + bar() + + +py-indent-honors-inline-comment +------------------------------- +If non-nil, indents to column of inlined comment start. +Default is nil. + +py-closing-list-dedents-bos +--------------------------- +When non-nil, indent list's closing delimiter like start-column. + +It will be lined up under the first character of + the line that starts the multi-line construct, as in: + +my_list = [ + 1, 2, 3, + 4, 5, 6, +] + +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', +) + +Default is nil, i.e. + +my_list = [ + 1, 2, 3, + 4, 5, 6, + ] +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', + ) + +Examples from PEP8 + + +py-closing-list-space +--------------------- +Number of chars, closing parenthesis outdent from opening, default is 1 + +py-closing-list-keeps-space +--------------------------- +If non-nil, closing parenthesis dedents onto column of opening plus `py-closing-list-space', default is nil + +py-electric-kill-backward-p +--------------------------- +Affects `py-electric-backspace'. Default is nil. + +If behind a delimited form of braces, brackets or parentheses, +backspace will kill it's contents + +With when cursor after +my_string[0:1] +--------------^ + +==> + +my_string[] +----------^ + +In result cursor is insided emptied delimited form. + +py-electric-colon-active-p +-------------------------- +`py-electric-colon' feature. Default is `nil'. See lp:837065 for discussions. + +See also `py-electric-colon-bobl-only' + +py-electric-colon-bobl-only +--------------------------- +When inserting a colon, do not indent lines unless at beginning of block + +See lp:1207405 resp. `py-electric-colon-active-p' + +py-electric-colon-greedy-p +-------------------------- +If py-electric-colon should indent to the outmost reasonable level. + +If nil, default, it will not move from at any reasonable level. + +py-electric-colon-newline-and-indent-p +-------------------------------------- +If non-nil, `py-electric-colon' will call `newline-and-indent'. Default is `nil'. + +py-electric-comment-p +--------------------- +If "#" should call `py-electric-comment'. Default is `nil'. + +py-electric-comment-add-space-p +------------------------------- +If py-electric-comment should add a space. Default is `nil'. + +py-mark-decorators +------------------ +If py-mark-def-or-class functions should mark decorators too. Default is `nil'. + +py-tab-indent +------------- +Non-nil means TAB in Python mode calls `py-indent-line'. + +py-return-key +------------- +Which command should call. + +py-complete-function +-------------------- +When set, enforces function todo completion, default is nil. + +Normally python-mode, resp. inferior-python-mode know best which function to use. + +ipython-complete-function +------------------------- +Function used for completion in IPython shell buffers. + +py-encoding-string +------------------ +Default string specifying encoding of a Python file. + +py-shebang-startstring +---------------------- +Detecting the shell in head of file. + +py-python-command-args +---------------------- +List of string arguments to be used when starting a Python shell. + +py-jython-command-args +---------------------- +List of string arguments to be used when starting a Jython shell. + +py-cleanup-temporary +-------------------- +If temporary buffers and files used by functions executing region should be deleted afterwards. + +py-execute-no-temp-p +-------------------- +Seems Emacs-24.3 provided a way executing stuff without temporary files. + +py-lhs-inbound-indent +--------------------- +When line starts a multiline-assignment: How many colums indent should be more than opening bracket, brace or parenthesis. + +py-continuation-offset +---------------------- +Additional amount of offset to give for some continuation lines. +Continuation lines are those that immediately follow a backslash +terminated line. + +py-indent-tabs-mode +------------------- +Python-mode starts `indent-tabs-mode' with the value specified here, default is nil. + +py-smart-indentation +-------------------- +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'. + +py-block-comment-prefix +----------------------- +String used by M-x 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. + +py-indent-comments +------------------ +When t, comment lines are indented. + +py-uncomment-indents-p +---------------------- +When non-nil, after uncomment indent lines. + +py-separator-char +----------------- +Values set by defcustom only will not be seen in batch-mode. + +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. + +py-beep-if-tab-change +--------------------- +Ring the bell if `tab-width' is changed. +If a comment of the form + + # vi:set tabsize=: + +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 , `tab-width' is set to , 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. + +py-jump-on-exception +-------------------- +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. + +py-ask-about-save +----------------- +If not nil, ask about which buffers to save before executing some code. +Otherwise, all modified buffers are saved without asking. + +py-backspace-function +--------------------- +Function called by `py-electric-backspace' when deleting backwards. + +py-delete-function +------------------ +Function called by `py-electric-delete' when deleting forwards. + +py-pdbtrack-do-tracking-p +------------------------- +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. + +py-pdbtrack-filename-mapping +---------------------------- +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. + +py-pdbtrack-minor-mode-string +----------------------------- +String to use in the minor mode list when pdbtrack is enabled. + +py-import-check-point-max +------------------------- +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. + +py-jython-packages +------------------ +Imported packages that imply `jython-mode'. + +py-current-defun-show +--------------------- +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'. + +py-current-defun-delay +---------------------- +When called interactively, `py-current-defun' should wait PY-WHICH-FUNC-DELAY seconds at the definition name found, before returning to previous position. + +py-send-receive-delay +--------------------- +Seconds to wait for output, used by `py-send-receive'. + +py-honor-IPYTHONDIR-p +--------------------- +When non-nil ipython-history file is constructed by $IPYTHONDIR +followed by "/history". Default is nil. + +Otherwise value of py-ipython-history is used. + +py-ipython-history +------------------ +ipython-history default file. Used when py-honor-IPYTHONDIR-p is nil (default) + +py-honor-PYTHONHISTORY-p +------------------------ +When non-nil python-history file is set by $PYTHONHISTORY +Default is nil. + +Otherwise value of py-python-history is used. + +py-python-history +----------------- +python-history default file. Used when py-honor-PYTHONHISTORY-p is nil (default) + +py-master-file +-------------- +If non-nil, M-x 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: + + + +py-pychecker-command +-------------------- +Shell command used to run Pychecker. + +py-pychecker-command-args +------------------------- +List of string arguments to be passed to pychecker. + +py-pep8-command +--------------- +Shell command used to run pep8. + +py-pep8-command-args +-------------------- +List of string arguments to be passed to pylint. + +Default is "" + +py-pyflakespep8-command +----------------------- +Shell command used to run `pyflakespep8'. + +py-pyflakespep8-command-args +---------------------------- +List of string arguments to be passed to pyflakespep8. + +Default is "" + +py-pyflakes-command +------------------- +Shell command used to run Pyflakes. + +py-pyflakes-command-args +------------------------ +List of string arguments to be passed to pyflakes. + +Default is "" + +py-pylint-command +----------------- +Shell command used to run Pylint. + +py-pylint-command-args +---------------------- +List of string arguments to be passed to pylint. + +Default is "--errors-only" + +py-shell-input-prompt-1-regexp +------------------------------ +A regular expression to match the input prompt of the shell. + +py-shell-input-prompt-2-regexp +------------------------------ +A regular expression to match the input prompt of the shell after the + first line of input. + +py-shell-prompt-read-only +------------------------- +If non-nil, the python prompt is read only. Setting this +variable will only effect new shells. + +py-fileless-buffer-use-default-directory-p +------------------------------------------ +When `py-use-current-dir-when-execute-p' is non-nil and no buffer-file exists, value of `default-directory' sets current working directory of Python output shell + +py-keep-shell-dir-when-execute-p +-------------------------------- +Don't change Python shell's current working directory when sending code. + +See also `py-execute-directory' + +py-switch-buffers-on-execute-p +------------------------------ +When non-nil switch to the Python output buffer. + +py-split-windows-on-execute-p +----------------------------- +When non-nil split windows. + +py-max-split-windows +-------------------- +When split windows is enabled the maximum windows to allow + before reusing other windows. + +py-split-windows-on-execute-function +------------------------------------ +How window should get splitted to display results of py-execute-... functions. + +py-hide-show-keywords +--------------------- +Keywords composing visible heads. +Also used by (minor-)outline-mode + +py-hide-show-hide-docstrings +---------------------------- +Controls if doc strings can be hidden by hide-show + +py-paragraph-fill-docstring-p +----------------------------- +If `py-fill-paragraph', when inside a docstring, should fill the complete string. + +Default is nil. + +Convenient use of `M-q' inside docstrings +See also `py-docstring-style' + + +python-mode-hook +---------------- +Hook run after entering python-mode-modeline-display mode. +No problems result if this variable is not bound. +`add-hook' automatically binds it. (This is true for all hook variables.) + +py-imenu-create-index-p +----------------------- +Non-nil means Python mode creates and displays an index menu of functions and global variables. + +py-imenu-create-index-function +------------------------------ +Switch between `py-imenu-create-index-new', which also lists modules variables, and series 5. index-machine + +py-shell-name +------------- +A PATH/TO/EXECUTABLE or default value `py-shell' may look for, if no shell is specified by command. + +py-shell-toggle-1 +----------------- +A PATH/TO/EXECUTABLE or default value used by `py-toggle-shell'. + +py-shell-toggle-2 +----------------- +A PATH/TO/EXECUTABLE or default value used by `py-toggle-shell'. + +py-match-paren-mode +------------------- +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. + +py-match-paren-key +------------------ +String used by M-x 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. + +py-kill-empty-line +------------------ +If t, py-indent-forward-line kills empty lines. + +py-remove-cwd-from-path +----------------------- +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). + +py-imenu-show-method-args-p +--------------------------- +Controls echoing of arguments of functions & methods in the Imenu buffer. +When non-nil, arguments are printed. + +py-history-filter-regexp +------------------------ +Input matching this regexp is not saved on the history list. +Default ignores all inputs of 0, 1, or 2 non-blank characters. + +inferior-python-filter-regexp +----------------------------- +Input matching this regexp is not saved on the history list. +Default ignores all inputs of 0, 1, or 2 non-blank characters. + +py-set-complete-keymap-p +------------------------ +If `py-complete-initialize', which sets up enviroment for Pymacs based py-complete, should load it's keys into `python-mode-map' + +Default is nil. +See also resp. edit `py-complete-set-keymap' + +py-use-local-default +-------------------- +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. + +py-highlight-error-source-p +--------------------------- +When py-execute-... commands raise an error, respective code in source-buffer will be highlighted. Default is nil. + +M-x `py-remove-overlays-at-point' removes that highlighting. + + +py-set-pager-cat-p +------------------ +If the shell environment variable $PAGER should set to `cat'. + +If `t', use `C-c C-r' to jump to beginning of output. Then scroll normally. + +Avoids lp:783828, "Terminal not fully functional", for help('COMMAND') in python-shell + +When non-nil, imports module `os' + +py-prompt-on-changed-p +---------------------- +When called interactively, ask for save before a changed buffer is sent to interpreter. + +Default is `t' + +py-dedicated-process-p +---------------------- +If commands executing code use a dedicated shell. + +Default is nil + +py-shell-local-path +------------------- +If `py-use-local-default' is non-nil, `py-shell' will use EXECUTABLE indicated here incl. path. + +py-edit-only-p +-------------- +When `t' `python-mode' will not take resort nor check for installed Python executables. Default is nil. + +See bug report at launchpad, lp:944093. + +py-force-py-shell-name-p +------------------------ +When `t', execution with kind of Python specified in `py-shell-name' is enforced, possibly shebang doesn't take precedence. + +python-mode-v5-behavior-p +------------------------- +Execute region through `shell-command-on-region' as +v5 did it - lp:990079. This might fail with certain chars - see UnicodeEncodeError lp:550661 + +py-trailing-whitespace-smart-delete-p +------------------------------------- +Default is nil. When t, python-mode calls + (add-hook 'before-save-hook 'delete-trailing-whitespace nil 'local) + +Also commands may delete trailing whitespace by the way. +When editing other peoples code, this may produce a larger diff than expected + +py-newline-delete-trailing-whitespace-p +--------------------------------------- +Delete trailing whitespace maybe left by `py-newline-and-indent'. + +Default is `t'. See lp:1100892 + +py-warn-tmp-files-left-p +------------------------ +Messages a warning, when `py-temp-directory' contains files susceptible being left by previous Python-mode sessions. See also lp:987534 + +py-ipython-execute-delay +------------------------ +Delay needed by execute functions when no IPython shell is running. + +python-shell-buffer-name +------------------------ +Default buffer name for Python interpreter. + +python-shell-interpreter +------------------------ +Default Python interpreter for shell. + +python-shell-prompt-regexp +-------------------------- +Regular Expression matching top-level input prompt of python shell. +It should not contain a caret (^) at the beginning. + +py-ffap-p +--------- +Select python-modes way to find file at point. + +Default is nil + +python-ffap-setup-code +---------------------- +Python code to get a module path. + +py-ffap-string-code +------------------- +Python code used to get a string with the path of a module. + +py-eldoc-setup-code +------------------- +Python code to setup documentation retrieval. + +py-setup-codes +-------------- +List of code run by `py-shell-send-setup-codes'. + +py-shell-prompt-regexp +---------------------- +Regular Expression matching top-level input prompt of python shell. +It should not contain a caret (^) at the beginning. + +python-shell-completion-setup-code +---------------------------------- +Code used to setup completion in inferior Python processes. + +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''')) + +strip-chars-before +------------------ +Regexp indicating which chars shall be stripped before STRING - which is defined by `string-chars-preserve'. + +strip-chars-after +----------------- +Regexp indicating which chars shall be stripped after STRING - which is defined by `string-chars-preserve'. + +py-docstring-style +------------------ +Implemented styles are DJANGO, ONETWO, PEP-257, PEP-257-NN, +SYMMETRIC, and NIL. + +A value of NIL won't care about quotes +position and will treat docstrings a normal string, any other +value may result in one of the following docstring styles: + +DJANGO: + + """ + Process foo, return bar. + """ + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +ONETWO: + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +PEP-257: + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + + """ + +PEP-257-NN: + + """Process foo, return bar.""" + + """Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +SYMMETRIC: + + """Process foo, return bar.""" + + """ + Process foo, return bar. + + If processing fails throw ProcessingError. + """ + +py-execute-directory +-------------------- +When set, stores the file's default directory-name py-execute-... functions act upon. + +Used by Python-shell for output of `py-execute-buffer' and related commands. See also `py-use-current-dir-when-execute-p' + +py-use-current-dir-when-execute-p +--------------------------------- +When `t', current directory is used by Python-shell for output of `py-execute-buffer' and related commands. + +See also `py-execute-directory' + +py-shell-prompt-output-regexp +----------------------------- +Regular Expression matching output prompt of python shell. +It should not contain a caret (^) at the beginning. + +py-output-buffer +---------------- +When `py-enforce-output-buffer-p' is non-nil, provides the +default for output-buffer. + +py-enforce-output-buffer-p +-------------------------- +When non-nil, current value of `py-output-buffer' is used for output, +regardless of environment. Default is nil + +py-underscore-word-syntax-p +--------------------------- +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 + diff --git a/elpa/python-mode-6.1.3/extensions/column-marker.el b/elpa/python-mode-6.1.3/extensions/column-marker.el new file mode 100644 index 000000000..97a7d0745 --- /dev/null +++ b/elpa/python-mode-6.1.3/extensions/column-marker.el @@ -0,0 +1,259 @@ +;;; column-marker.el --- Highlight certain character columns +;; +;; Filename: column-marker.el +;; Description: Highlight certain character columns +;; Author: Rick Bielawski +;; Maintainer: Rick Bielawski +;; Created: Tue Nov 22 10:26:03 2005 +;; Version: +;; Last-Updated: Fri Jan 22 11:28:48 2010 (-0800) +;; By: dradams +;; Update #: 312 +;; Keywords: tools convenience highlight +;; Compatibility: GNU Emacs 21, GNU Emacs 22, GNU Emacs 23 +;; +;; Features that might be required by this library: +;; +;; None +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; Highlights the background at a given character column. +;; +;; Commands `column-marker-1', `column-marker-2', and +;; `column-marker-3' each highlight a given column (using different +;; background colors, by default). +;; +;; - With no prefix argument, each highlights the current column +;; (where the cursor is). +;; +;; - With a non-negative numeric prefix argument, each highlights that +;; column. +;; +;; - With plain `C-u' (no number), each turns off its highlighting. +;; +;; - With `C-u C-u', each turns off all column highlighting. +;; +;; If two commands highlight the same column, the last-issued +;; highlighting command shadows the other - only the last-issued +;; highlighting is seen. If that "topmost" highlighting is then +;; turned off, the other highlighting for that column then shows +;; through. +;; +;; Examples: +;; +;; M-x column-marker-1 highlights the column where the cursor is, in +;; face `column-marker-1'. +;; +;; C-u 70 M-x column-marker-2 highlights column 70 in face +;; `column-marker-2'. +;; +;; C-u 70 M-x column-marker-3 highlights column 70 in face +;; `column-marker-3'. The face `column-marker-2' highlighting no +;; longer shows. +;; +;; C-u M-x column-marker-3 turns off highlighting for column-marker-3, +;; so face `column-marker-2' highlighting shows again for column 70. +;; +;; C-u C-u M-x column-marker-1 (or -2 or -3) erases all column +;; highlighting. +;; +;; These commands use `font-lock-fontify-buffer', so syntax +;; highlighting (`font-lock-mode') must be turned on. There might be +;; a performance impact during refontification. +;; +;; +;; Installation: Place this file on your load path, and put this in +;; your init file (`.emacs'): +;; +;; (require 'column-marker) +;; +;; Other init file suggestions (examples): +;; +;; ;; Highlight column 80 in foo mode. +;; (add-hook 'foo-mode-hook (lambda () (interactive) (column-marker-1 80))) +;; +;; ;; Use `C-c m' interactively to highlight with face `column-marker-1'. +;; (global-set-key [?\C-c ?m] 'column-marker-1) +;; +;; +;; Please report any bugs! +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Change log: +;; +;; 2009/12/10 dadams +;; column-marker-internal: Quote the face. Thx to Johan Bockgård. +;; 2009/12/09 dadams +;; column-marker-find: fset a symbol to the function, and return the symbol. +;; 2008/01/21 dadams +;; Renamed faces by dropping suffix "-face". +;; 2006/08/18 dadams +;; column-marker-create: Add newlines to doc-string sentences. +;; 2005/12/31 dadams +;; column-marker-create: Add marker to column-marker-vars inside the defun, +;; so it is done in the right buffer, updating column-marker-vars buffer-locally. +;; column-marker-find: Corrected comment. Changed or to progn for clarity. +;; 2005/12/29 dadams +;; Updated wrt new version of column-marker.el (multi-column characters). +;; Corrected stray occurrences of column-marker-here to column-marker-1. +;; column-marker-vars: Added make-local-variable. +;; column-marker-create: Changed positive to non-negative. +;; column-marker-internal: Turn off marker when col is negative, not < 1. +;; 2005-12-29 RGB +;; column-marker.el now supports multi-column characters. +;; 2005/11/21 dadams +;; Combined static and dynamic. +;; Use separate faces for each marker. Different interactive spec. +;; 2005/10/19 RGB +;; Initial release of column-marker.el. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; 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 2, 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; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth +;; Floor, Boston, MA 02110-1301, USA. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Code: + +;;;;;;;;;;;;;;;;;;;;;; + + +(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 +(autoload 'column-marker-1 "column-marker" "Highlight a column." t) + +;;;;;;;;;;;;;;;;;; + +(provide 'column-marker) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; column-marker.el ends here diff --git a/elpa/python-mode-6.1.3/extensions/column-marker.elc b/elpa/python-mode-6.1.3/extensions/column-marker.elc new file mode 100644 index 0000000000000000000000000000000000000000..99914c371d6cad6c26d363a4ddb8f75e49ea71a6 GIT binary patch literal 7190 zcmeHMZExGi5%!mBZS_mgYf%(epcA=wrdpHca!Dz662tLJ&=fh`;gV}`I0X$&t|Y?L zQsIjo-LLO6OG>h2$BECqemKMcX_7lLJ3Bki%tPwo$@8N>t*x!K9zJ|XN7;Ciq$;M< zDUHK&l!V29Vs#Nlqf+GuIv)mhrL}bU%Bc!xm?yELt58SEiLxj+2gsCT8( zMUv@aC(6=ljKMHJQ@Nv3Gee^3ge}my%2|v&-;s`I#x9a_L}8jzHYt;F@>5u{9j9dm zUyhQZcC9K@LGe_F<0PUui;6N&^sv~*XkL^Q#xa&SpGWLE-tH9}aRwVYD=Er!8A7-! z2lfLz(e{%UN6(&7Gz#-DLR5=wGkvIIDl&>fO{a>|EL@tTSxiAH%+o~WRE{9%$$DPw z+@1c|fxG^-S}iN8iZUD9v5L|#SN0%`6m2c-k}YVTSPc@bRto{4G^0fP`^k4s>*N z)S@j`A5%{=0S{AaV6Q5 z2jS)(rcdwyT3)X&B^2rbDb}AtUP4pC4+)J+gT^7*Jv=;QnI%QvHHyB#;9=hjdcS>& zRrT8RqlqoAdnJZ6$+MxRrtVq1@$EyiyJ%wAT?aMWw97i1P%*JVXcM_=EH%}WiiwJx zb_cibO_aA)hMmAvl_o39hY0#Vli?`E!Hw3m3e)3_vv1l|Ovk5LYIC|!d&}wTSIhu( z2B(o&?+7-kvC`!>jTUyQJjbKP9(3B&Zq&4`)exlNT#<%e4tlUKblC>F^UMHCo`Rk% z>`YST18u+TSAjl?Jp68msYJvX*oiyhVp5RWZ7L1WYH!f+|dE_GVdoUQR6W59rrH zwrd%5e$1tdNv)U+$a+jZo*~`X6o!#kI9qX+a)~kkT()0(x8m}AQchep!KRpLnS~Ek z-ppw2Kjw+Z<#G0}4yWDhGM1iJs6w?XOkeKqN9Q$(-mFG;cV*|bDZ;`NP0=e*^^oY; z8<1FFhS7xV2Pc{_N9Le)5a{Te=T7T8#XH}W!kK0bf$gSbzF7|1I6GH%nb}a^x~T@D z2*+IapbgBS%5X_C1#Z3HzTfwR_%j}$fYoIVMGU2AQQ~mzucJ^2Q+Z60gR!8{(0Ct#$uzJd;#ZBy+zg!l!@r17exWnrG$S#||pJtmhdWc12Z zSG?iH0eFw$)rwIVu^!?1lG*+Fy@?R7AE4n*z;QrG%4lTAVTowgh!yrs1ETYAmbe*a z$UshNv;_paV}J^D1Pwa8-L408fT4KaF1`5S>sh<6Q`@{LjIuPYiTY|=;rB1RGdeBg z_)M{hBjAHjMtCKh_n=W$rFi*Oghe>57u95vPT4NEHI!S|OvaXKq}9b*HR}HdGBPh{ z03(*q@V|+O$a@?A0wClcnUyeY2yovvK;fI`eAU;FAmYI32zQUx zn8x(_8cc-&E`Uj#fxP3R+JvDp#yAMgrm+gh6O`xFVdm{J`UC>1OXh)RcCJjGpQ-6Z zmd7=RbeH>=Z3i>@3)LU{b zrx)DJ3`yZ;7Od|x0{Yq{{rcg(4Zby)Vb&fbFZ&uv4QjoIvpiVaIAA<{&o^JOj*((q zFt*$tT9k0V01Cuka2xEe^#=!^v)J!uGLRfRVSztDz;|FnxPNC=%pAD5kS`f?Li|u) zUz)?)xIc4eWuEjy^Yr_RiNNTW^M?78;Xuoen@<9kx*>D zgMAo^-rb-W_@4g@Ls4FWVpsHT`GH8@9*XrRuuo9D5sLB?6h9J*%@@@VLs8xhid`wi z0*d%Fu;78S-$uB$hE<85K*D(S)1_E>*=^%1X8n_c`yl9mIJfwn?L3KBf2QfQ{tM^@ B*F*pS literal 0 HcmV?d00001 diff --git a/elpa/python-mode-6.1.3/extensions/highlight-indentation.el b/elpa/python-mode-6.1.3/extensions/highlight-indentation.el new file mode 100644 index 000000000..02a34c4ac --- /dev/null +++ b/elpa/python-mode-6.1.3/extensions/highlight-indentation.el @@ -0,0 +1,103 @@ +;;; highlight-indentation.el --- Function for highlighting indentation +;; Original Author: Anton Johansson - http://antonj.se +;; Created: Dec 15 23:42:04 2010 +;; URL: https://github.com/antonj/Highlight-Indentation-for-Emacs + +;; 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 2 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. +;; +;;; Commentary: +;; Customize `highlight-indent-face' to suit your theme. + +;;; Code: + +(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) +(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.") + +(setq-default highlight-indent-offset 4) + +(defvar ruby-indent-level nil) +;; lp:1067928 +;; (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 ((and (eq major-mode 'python-mode)(boundp 'py-indent-offset)) + py-indent-offset) + ;; support both python.el + ((or (eq major-mode 'python-mode)(eq major-mode 'python)) + python-indent) + ((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))) + +(provide 'highlight-indentation) + +;;; highlight-indentation.el ends here diff --git a/elpa/python-mode-6.1.3/extensions/highlight-indentation.elc b/elpa/python-mode-6.1.3/extensions/highlight-indentation.elc new file mode 100644 index 0000000000000000000000000000000000000000..c0e36b43ffff0ebbad45b5d46fde55ef4b14b10d GIT binary patch literal 3088 zcmcgu{cqbg5cO~CJS-df!-ioSc2(Ba1}fS5u+t+3wnv&&m%?dgvNUZlj%XQPu|!K zjQ^yBQGy6GN@dPR8!<)>&skJC@rY*&Hd-uIDhoT8F}J6V>-Z!7R`H?|vZzL>n5P+r zvPBW|LNSGDhi4{|DCn{FMCZKJ=HvyA?|5eILa3BjmXTa2k&D00#>(lN#gkN2%@OO0 zR}?P`mWzmD8C9wj#k{(Q)v{8=;uu$5$8q-^Z-2u_Ea9V&iXw>v!njt6eIGN0{p*XP z<70|aRPpGnj(L=^lH2F3 z6l@02Y^^vIA|vZKp^Tq%)HFd&)^MOIm30O@bBaZ^$k-A!V~Q%pO67#biJZ^jcvdF~ zvYE+YA>7I%*wMNrVcuD*1Y6P-?#Mqd$yV;-?|q&hh#lu z6*|-$A(5RN>hg54Ft0_-E5}036u_0RI#Zk1mPvwj3Qj4wtV>zXmMzWL4bDtOb{_;j zJw<7$s!L99wgU7nfl)LZZ)+*RJ*SXpmjfBjMoMJ8ozvMD{Goax69;a z5A&wbtM0k(d4(ZUdjq-4j?$s7+Z#Fr17#2b+!@@|fG}Iy3t|P70gz{Nboch1&!1VR z-Yo^;bS4enp2%iZ6jmZ8?E z?jqXhKZkG;{B$Injem&cDzexqu^BasMb&_ybuw7a+8z<5wC(9jy6 z*>c!n%XK^+-y@Nb%!N`s?l=8pUx*kQdLba9pw@W}M1WY0yhn9e>VxF$FIgJt{xI%Q z#K9e{#^x^F7-;VmzHht;t?$ADpbr#4Z)mS+k1sIif78?dyjQ(2!J_+%p1Y&%G&N3i zbKvKf*G&SivGB=uA$`cx&V~q>J-E?(bZ{@?+KK5E4{`jg7 zUkj;r=zBE8b}gyvdahWkr8%(H#!{;}-7<8l2}Qf+1Ehdt<$eH^BrQm-;3m zS+;M5_8rk?p0?1%g$nzZ5x@l!i0(M7e&{Y!choA%U%8_|grkq8cQYq_yth1~%QZUt_ z;>5UaKr49n-Ot>?bOw|AHu4Ld2Ur#i#kWe@ z(?p#m3*xA-ksO5P))}cvJN8v$9iR|?vp=2bf+dR!4xv4V(hj&*4n4SYMfBh^Dq6j+ zw_D&98sz?%c09 +;; Keywords: languages, processes, python, oop + +;; Copyright (C) 1992,1993,1994 Tim Peters + +;; Author: 2003-2013 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 . + +;;; 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) +(ignore-errors (require 'flymake)) +(require 'imenu) +(require 'thingatpt) + +(defgroup python-mode nil + "Support for the Python programming language, " + :group 'languages + :prefix "py-") + +(defconst py-version "6.1.3") + +;;; Customization +(defcustom python-mode-modeline-display "Py" + "String to display in Emacs modeline " + + :type 'string + :group 'python-mode) + +(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 py-backslashed-lines-indent-offset 5 + "Amount of offset per level of indentation of backslashed. +No semantic indent, which diff to `py-indent-offset' indicates " + :type 'integer + :group 'python-mode) +(make-variable-buffer-local 'py-backslashed-lines-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-max-help-buffer-p nil + "If \"\*Python-Help\*\"-buffer should appear as the only visible. + +Default is nil. In help-buffer, \"q\" will close it. " + +:type 'boolean +:group 'python-mode) + +(defcustom py-store-result-p nil + "When non-nil, put resulting string of `py-execute-...' into kill-ring, so it might be yanked. + +Default is nil" + + :type 'boolean + :group 'python-mode) + +(defcustom py-load-skeletons-p nil + "If skeleton definitions should be loaded, default is nil. " + + :type 'boolean + :group 'python-mode) + +(defcustom py-load-pymacs-p nil + "If Pymacs related stuff should be loaded. + +Default is nil. + +Pymacs has been written by François Pinard and many others. +See original source: http://pymacs.progiciels-bpi.ca" + + :type 'boolean + :group 'python-mode) + +(defun py-smart-operator-check () + "Check, if smart-operator-mode is loaded resp. available. + +Give some hints, if not." + (interactive) + (if (featurep 'smart-operator) + 't + (progn + (and (boundp 'py-smart-operator-mode-p) py-smart-operator-mode-p (message "%s" "Don't see smart-operator.el. Make sure, it's installed. See in menu Options, Manage Emacs Packages. Or get it from source: URL: http://xwl.appspot.com/ref/smart-operator.el") + nil)))) + +(defcustom py-empty-line-closes-p nil + "When non-nil, dedent after empty line following block + +if True: + print(\"Part of the if-statement\") + +print(\"Not part of the if-statement\") + +Default is nil + +If non-nil, a C-j from empty line dedents. +" + + :type 'boolean + :group 'python-mode) + +(defun py-autopair-check () + "Check, if autopair-mode is available. + +Give some hints, if not." + (interactive) + (if (featurep 'autopair) + 't + (progn + (message "%s" "Don't see autopair.el. Make sure, it's installed. If not, maybe see source: URL: http://autopair.googlecode.com") + nil))) + +(defcustom py-smart-operator-mode-p nil + "If python-mode calls (smart-operator-mode-on) + +Default is non-nil. " + + :type 'boolean + :group 'python-mode + :set (lambda (symbol value) + (and (py-smart-operator-check) + (set-default symbol value) + (smart-operator-mode (if value 1 0))))) +(make-variable-buffer-local 'py-smart-operator-mode-p) + +(defcustom py-sexp-function nil + "When set, it's value is called instead of `forward-sexp', `backward-sexp' + +Default is nil. " + + :type '(choice + (const :tag "default" nil) + (const :tag "py-end-of-partial-expression" py-end-of-partial-expression) + (const :tag "py-end-of-expression" py-end-of-expression)) + :group 'python-mode) +(make-variable-buffer-local 'py-sexp-function) + +(defvar py-autopair-mode nil) +(defvar highlight-indent-active nil) +(defvar smart-operator-mode nil) + +(defvar py-fill-column-orig fill-column) +(defvar py-autofill-timer nil) + +(defvar py-python-completions "*Python Completions*" + "Buffer name for Python-shell completions, internally used") + +(defvar py-ipython-completions "*IPython Completions*" + "Buffer name for IPython-shell completions, internally used") + +(defvar py-close-completions-timer nil + "Internally used by `py-timer-close-completion-buffer") + +(defcustom py-autopair-mode nil + "If python-mode calls (autopair-mode-on) + +Default is nil +Load `autopair-mode' written by Joao Tavora +URL: http://autopair.googlecode.com " + :type 'boolean + :group 'python-mode + :set (lambda (symbol value) + (and + ;; (py-autopair-check) + (set-default symbol value) + (autopair-mode (if value 1 0))))) + +(defcustom py-no-completion-calls-dabbrev-expand-p t + "If completion function should call dabbrev-expand when no completion found. Default is `t' + +See also `py-indent-no-completion-p'" + :type 'boolean + :group 'python-mode) + +(defcustom py-indent-no-completion-p nil + "If completion function should insert a TAB when no completion found. Default is `nil' + +See also `py-no-completion-calls-dabbrev-expand-p'" + :type 'boolean + :group 'python-mode) + +(defcustom py-set-fill-column-p nil + "If python-mode should set fill-column + +according values in `py-comment-fill-column' and `py-docstring-fill-column'. +Default is nil" + + :type 'boolean + :group 'python-mode) + +(defcustom py-autofill-timer-delay 1 + "Delay when idle before functions ajusting `py-docstring-fill-column' resp. `py-comment-fill-column' are called. " + :type 'integer + + :group 'python-mode) + +(defcustom py-docstring-fill-column 72 + "Value of `fill-column' to use when filling a docstring. +Any non-integer value means do not use a different value of +`fill-column' when filling docstrings." + :type '(choice (integer) + (const :tag "Use the current `fill-column'" t)) + :group 'python-mode) + +(defcustom py-comment-fill-column 79 + "Value of `fill-column' to use when filling a comment. +Any non-integer value means do not use a different value of +`fill-column' when filling docstrings." + :type '(choice (integer) + (const :tag "Use the current `fill-column'" t)) + :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) + +(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-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-pylint-offer-current-p t + "If current buffers file should be offered for check. + +Default is non-nil. If nil, `py-pylint-run' offers filename from history " + + :type 'boolean + :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 empty-comment-line-separates-paragraph-p t + "Consider paragraph start/end lines with nothing inside but comment sign. + +Default is non-nil" + :type 'boolean + :group 'python-mode) + +(defcustom py-if-name-main-permission-p t + "Allow execution of code inside blocks started +by \"if __name__== '__main__':\". + +Default is non-nil" + + :type 'boolean + :group 'python-mode) + +(defcustom py-use-font-lock-doc-face-p nil + "If documention string inside of def or class get `font-lock-doc-face'. + +`font-lock-doc-face' inherits `font-lock-string-face'. +Call M-x `customize-face' in order to have a visible effect. " + + :type 'boolean + :group 'python-mode) + +(defcustom py-defun-use-top-level-p nil + "When non-nil, keys C-M-a, C-M-e address top-level form. + +Default is nil. + +Beginning- end-of-defun forms use +commands `py-beginning-of-top-level', `py-end-of-top-level' + +mark-defun marks top-level form at point etc. +" + + :type 'boolean + :group 'python-mode) + +(defcustom py-tab-shifts-region-p nil + "If `t', TAB will indent/cycle the region, not just the current line. + +Default is nil" + + :type 'boolean + :group 'python-mode) + +(defcustom py-tab-indents-region-p nil + "When `t' and first TAB doesn't shift, indent-region is called. + +Default is nil" + + :type 'boolean + :group 'python-mode) + +(defcustom py-block-comment-prefix-p t + "If py-comment inserts py-block-comment-prefix. + +Default is t" + + :type 'boolean + :group 'python-mode) + +(defcustom py-org-cycle-p nil + "When non-nil, command `org-cycle' is available at shift-TAB, + +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 nil + "If `python-mode' should start a python-shell, `py-shell'. + +Default is `nil'. " + :type 'boolean + :group 'python-mode) + +(defcustom py-start-run-ipython-shell nil + "If `python-mode' should start an ipython-shell. + +Default is `nil'. " + :type 'boolean + :group 'python-mode) + +(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-paren-spanned-multilines-p nil + "If non-nil, indents elements of list a value of `py-indent-offset' to first element: + +def foo(): + if (foo && + baz): + bar() + +Default lines up with first element: + +def foo(): + if (foo && + baz): + bar() +" + :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 + "When non-nil, indent list's closing delimiter like start-column. + +It will be lined up under the first character of + the line that starts the multi-line construct, as in: + +my_list = [ + 1, 2, 3, + 4, 5, 6, +] + +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', +) + +Default is nil, i.e. + +my_list = [ + 1, 2, 3, + 4, 5, 6, + ] +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', + ) + +Examples from PEP8 +" + + :type 'boolean + :group 'python-mode) + +(defcustom py-closing-list-space 1 + "Number of chars, closing parenthesis outdent from opening, default is 1 " + :type 'number + :group 'python-mode) + +(defcustom py-closing-list-keeps-space nil + "If non-nil, closing parenthesis dedents onto column of opening plus `py-closing-list-space', default is nil " + :type 'boolean + :group 'python-mode) + +(defcustom py-electric-kill-backward-p nil + "Affects `py-electric-backspace'. Default is nil. + +If behind a delimited form of braces, brackets or parentheses, +backspace will kill it's contents + +With when cursor after +my_string[0:1] +--------------^ + +==> + +my_string[] +----------^ + +In result cursor is insided emptied delimited form." + + :type 'boolean + :group 'python-mode) + +(defcustom py-electric-colon-active-p nil + "`py-electric-colon' feature. Default is `nil'. See lp:837065 for discussions. + +See also `py-electric-colon-bobl-only' " + :type 'boolean + :group 'python-mode) + +(defcustom py-electric-colon-bobl-only t + + "When inserting a colon, do not indent lines unless at beginning of block + +See lp:1207405 resp. `py-electric-colon-active-p' " + + :type 'boolean + :group 'python-mode) + +(defcustom py-electric-colon-greedy-p nil + "If py-electric-colon should indent to the outmost reasonable level. + +If nil, default, it will not move from at any reasonable level. " + :type 'boolean + :group 'python-mode) + +(defcustom py-electric-colon-newline-and-indent-p nil + "If non-nil, `py-electric-colon' will call `newline-and-indent'. Default is `nil'. " + :type 'boolean + :group 'python-mode) + +(defcustom py-electric-comment-p nil + "If \"#\" should call `py-electric-comment'. Default is `nil'. " + :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-return-key 'py-newline-and-indent + "Which command should call. " + :type '(choice + (const :tag "default" py-newline-and-indent) + (const :tag "newline" newline) + (const :tag "py-newline-and-indent" py-newline-and-indent) + (const :tag "py-newline-and-dedent" py-newline-and-dedent) + ) + :group 'python-mode) + +(defcustom py-complete-function 'py-shell-complete + "When set, enforces function todo completion, default is nil. + +Normally python-mode, resp. inferior-python-mode know best which function to use. " + :type '(choice + (const :tag "default" nil) + (const :tag "Pymacs based py-complete-completion-at-point" py-complete-completion-at-point) + (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. " + :type '(choice (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) + +(defcustom py-encoding-string " # -*- coding: utf-8 -*-" + "Default string specifying encoding of a Python file. " + :type 'string + :group 'python-mode) + +(defcustom py-shebang-startstring "#! /bin/env" + "Detecting the shell in head of file. " + :type 'string + :group 'python-mode) + +(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) + +(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-flake8-command "" + "Which command to call flakes8. + +If empty, python-mode will guess some " + :type 'string + :group 'python-mode) + +(make-obsolete-variable 'py-jpython-command-args 'py-jython-command-args nil) + +(defcustom py-flake8-command-args "" + "Arguments used by flake8. + +Default is the empty string. " + :type 'string + :group 'python-mode) + +(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-execute-no-temp-p nil + "Seems Emacs-24.3 provided a way executing stuff without temporary files. " + :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-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-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) + +(defcustom py-uncomment-indents-p nil + "When non-nil, after uncomment indent lines. " + :type 'boolean + :group 'python-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) +;; used as a string finally +;; kept a character not to break existing customizations +(and (characterp py-separator-char)(setq py-separator-char (char-to-string py-separator-char))) + +(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) + +(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=: + +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 , `tab-width' is set to , 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-new-shell-delay 0.2 + "If a new comint buffer is connected to Python, commands like completion might need some delay. " + + :type 'integer + :group 'python-mode) + +(defcustom py-send-receive-delay 5 + "Seconds to wait for output, used by `py-send-receive'. " + + :type 'number + :group 'python-mode) + +(defcustom py-honor-IPYTHONDIR-p nil + "When non-nil ipython-history file is constructed by $IPYTHONDIR +followed by \"/history\". Default is nil. + +Otherwise value of py-ipython-history is used. " + :type 'boolean + :group 'python-mode) + +(defcustom py-ipython-history "~/.ipython/history" + "ipython-history default file. Used when py-honor-IPYTHONDIR-p is nil (default) " + + :type 'string + :group 'python-mode) + +(defcustom py-honor-PYTHONHISTORY-p nil + "When non-nil python-history file is set by $PYTHONHISTORY +Default is nil. + +Otherwise value of py-python-history is used. " + :type 'boolean + :group 'python-mode) + +(defcustom py-python-history "~/.python_history" + "python-history default file. Used when py-honor-PYTHONHISTORY-p is nil (default) " + + :type 'string + :group 'python-mode) + +(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) + +(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") + +(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") + +(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-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") + +(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") + +(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") + +(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") + +(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-max-specpdl-size max-specpdl-size + "Heuristic exit. Limiting number of recursive calls by py-end-of-statement and related functions. Default is max-specpdl-size. + +This treshold is just an approximation. It might set far higher maybe. + +See lp:1235375. In case code is not to navigate due to errors, `which-function-mode' and others might make Emacs hang. Rather exit than. " + + :type 'number + :group 'python-mode) + +(defcustom py-shell-prompt-read-only t + "If non-nil, the python prompt is read only. Setting this +variable will only effect new shells." + :type 'boolean + :group 'python-mode) + +(defcustom py-fileless-buffer-use-default-directory-p t + "When `py-use-current-dir-when-execute-p' is non-nil and no buffer-file exists, value of `default-directory' sets current working directory of Python output shell" + :type 'boolean + :group 'python-mode) + +(defcustom py-keep-shell-dir-when-execute-p nil + "Don't change Python shell's current working directory when sending code. + +See also `py-execute-directory'" + :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-max-split-windows 2 + "When split windows is enabled the maximum windows to allow + before reusing other windows." + :type 'number + :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 py-paragraph-fill-docstring-p nil + "If `py-fill-paragraph', when inside a docstring, should fill the complete string. + +Default is nil. + +Convenient use of `M-q' inside docstrings +See also `py-docstring-style' +" + + :type 'boolean + :group 'python-mode) +(make-variable-buffer-local 'py-paragraph-fill-docstring-p) + +(defcustom python-mode-hook nil + "Hook run when entering Python mode." + :group 'python-mode + :type 'hook) + +(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-imenu-create-index-function 'py-imenu-create-index-new + "Switch between `py-imenu-create-index-new', which also lists modules variables, and series 5. index-machine" + :type '(choice (const :tag "'py-imenu-create-index-new, also lists modules variables " py-imenu-create-index-new) + (const :tag "py-imenu-create-index, series 5. index-machine" py-imenu-create-index-function)) + :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) +(defvaralias 'py-python-command '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-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 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 inferior-python-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 py-set-complete-keymap-p nil + "If `py-complete-initialize', which sets up enviroment for Pymacs based py-complete, should load it's keys into `python-mode-map' + +Default is nil. +See also resp. edit `py-complete-set-keymap' " + + :type 'boolean + :group 'python-mode) + +(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 py-highlight-error-source-p nil + "When py-execute-... commands raise an error, respective code in source-buffer will be highlighted. Default is nil. + +M-x `py-remove-overlays-at-point' removes that highlighting. + " + :type 'boolean + :group 'python-mode) + +(defcustom py-set-pager-cat-p nil + "If the shell environment variable $PAGER should set to `cat'. + +If `t', use `C-c C-r' to jump to beginning of output. Then scroll normally. + +Avoids lp:783828, \"Terminal not fully functional\", for help('COMMAND') in python-shell + +When non-nil, imports module `os' " + + :type 'boolean + :group 'python-mode) + +(defcustom py-prompt-on-changed-p t + "When called interactively, ask for save before a changed buffer is sent to interpreter. + +Default is `t'" + + :type 'boolean + :group 'python-mode) + +(defcustom py-dedicated-process-p nil + "If commands executing code use a dedicated shell. + +Default is nil") + +(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) + +(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) + +(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) + +(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-trailing-whitespace-smart-delete-p nil + "Default is nil. When t, python-mode calls + (add-hook 'before-save-hook 'delete-trailing-whitespace nil 'local) + +Also commands may delete trailing whitespace by the way. +When editing other peoples code, this may produce a larger diff than expected " + :type 'boolean + :group 'python-mode) + +(defcustom py-newline-delete-trailing-whitespace-p t + "Delete trailing whitespace maybe left by `py-newline-and-indent'. + +Default is `t'. See lp:1100892 " + :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) + +(defcustom python-shell-buffer-name "Python" + "Default buffer name for Python interpreter." + :type 'string + :group 'python-mode) + +(defcustom python-shell-interpreter "python" + "Default Python interpreter for shell." + :type 'string + :group 'python-mode) + +(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) + +(defvar py-ffap-p nil) +(defvar py-ffap nil) +(defvar python-ffap nil) +(defvar ffap-alist nil) + +(defun py-set-ffap-form () + (cond ((and py-ffap-p py-ffap) + (eval-after-load "ffap" + '(push '(python-mode . py-module-path) ffap-alist)) + (setq ffap-alist (remove '(python-mode . py-ffap-module-path) ffap-alist)) + (setq ffap-alist (remove '(inferior-python-mode . py-ffap-module-path) + ffap-alist))) + (t (setq ffap-alist (remove '(python-mode . py-ffap-module-path) ffap-alist)) + (setq ffap-alist (remove '(inferior-python-mode . py-ffap-module-path) + ffap-alist)) + (setq ffap-alist (remove '(python-mode . py-module-path) ffap-alist))))) + +(defcustom py-ffap-p nil + + "Select python-modes way to find file at point. + +Default is nil " + + :type '(choice + (const :tag "default" nil) + (const :tag "use py-ffap" py-ffap)) + :group 'python-mode + :set (lambda (symbol value) + (set-default symbol value) + (py-set-ffap-form))) + +(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) + +(defcustom py-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) + +(defcustom py-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) + +(defcustom py-setup-codes '(python-shell-completion-setup-code + python-ffap-setup-code + py-eldoc-setup-code) + "List of code run by `py-shell-send-setup-codes'." + :type '(repeat symbol) + :group 'python-mode) + +(defcustom py-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) +(defvar py-shell-prompt-regexp ">>> ") + +(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) + +(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'''))" + :type 'string + :group 'python-mode) + +(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) + +(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 py-docstring-style 'pep-257-nn + "Implemented styles are DJANGO, ONETWO, PEP-257, PEP-257-NN, +SYMMETRIC, and NIL. + +A value of NIL won't care about quotes +position and will treat docstrings a normal string, any other +value may result in one of the following docstring styles: + +DJANGO: + + \"\"\" + Process foo, return bar. + \"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +ONETWO: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +PEP-257: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +PEP-257-NN: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +SYMMETRIC: + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\"" + :type '(choice + (const :tag "Don't format docstrings" nil) + (const :tag "Django's coding standards style." django) + (const :tag "One newline and start and Two at end style." onetwo) + (const :tag "PEP-257 with 2 newlines at end of string." pep-257) + (const :tag "PEP-257 with 1 newline at end of string." pep-257-nn) + (const :tag "Symmetric style." symmetric)) + :group 'python-mode) + +;; Faces +(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) + +(defvar virtualenv-old-path) + +(defvar virtualenv-old-exec-path) + +(defvar py-underscore-word-syntax-p t + "This is set later by defcustom, only initial value here. + +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 also command `toggle-py-underscore-word-syntax-p' ") + +(defvar python-mode-message-string "python-mode.el" + "Reports the python-mode branch in use.") + +(defvar py-local-command nil + "Returns locally used executable-name. ") +(make-variable-buffer-local 'py-local-command) + +(defvar py-this-abbrevs-changed nil + "Internally used by python-mode-hook") + +(defvar py-local-versioned-command nil + "Returns locally used executable-name including its version. ") +(make-variable-buffer-local 'py-local-versioned-command) + +(defvar py-preoutput-leftover nil) +(defvar py-preoutput-skip-next-prompt nil) + +(defvar py-shell-complete-debug nil + "For interal use when debugging." ) + +(defcustom py-debug-p nil + "When non-nil, keep resp. store information useful for debugging. + +Temporary files are not deleted. Other functions might implement +some logging etc. " + :type 'boolean + :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\\)") + +(defvar py-shebang-regexp "#![ \t]?\\([^ \t\n]+\\)[ \t]*\\([biptj]+ython[^ \t\n]*\\)" + "Detecting the shell in head of file. ") + +(defvar py-separator-char 47 + "Values set by defcustom only will not be seen in batch-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:" py-separator-char "Users")) + (setq erg (concat "c:" 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 ") + +(defvar py-exec-command nil + "Internally used. ") +(make-variable-buffer-local 'py-exec-command) + +(defvar py-buffer-name nil + "Internal use. ") + +(defvar py-orig-buffer-or-file nil + "Internal use. ") + +(defvar py-python-major-version nil + "Internally used. ") +(make-variable-buffer-local 'py-python-major-version) + +(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) + +(defvar py-pychecker-history nil) + +(defvar py-pep8-history nil) + +(defvar py-pyflakespep8-history nil) + +(defvar py-pyflakes-history nil) + +(defvar py-pylint-history nil) + +(defvar ipython-de-input-prompt-regexp "In \\[[0-9]+\\]:\\|^[ ]\\{3\\}[.]\\{3,\\}:" + "A regular expression to match the IPython input prompt. ") + +;; make sure it's set that way +(setq ipython-de-input-prompt-regexp "In \\[[0-9]+\\]:\\|^[ ]\\{3\\}[.]\\{3,\\}:") + +(defvar ipython-de-output-prompt-regexp "^Out\\[[0-9]+\\]: " + "A regular expression to match the output prompt of IPython.") + +(defvar py-force-local-shell-p nil + "Used internally, see `toggle-force-local-shell'. ") + +(defvar python-mode-v5-behavior nil) + +(defvar py-bol-forms-last-indent nil + "For internal use. Stores indent from last py-end-of-FORM-bol command. +When this-command is py-beginning-of-FORM-bol, last-command's indent will be considered in order to jump onto right beginning position.") + +;; 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))))) + +(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) + (if py-underscore-word-syntax-p + (modify-syntax-entry ?\_ "w" table) + (modify-syntax-entry ?\_ "_" table)) + table)) + +(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.") + +(defvar eldoc-documentation-function) + +(defvar py-completion-last-window-configuration nil + "Internal use: restore py-restore-window-configuration when completion is done resp. abandoned. ") + +(defvar ipython-version nil) + +(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))))) +") + +(defcustom py-execute-directory nil + "When set, stores the file's default directory-name py-execute-... functions act upon. + +Used by Python-shell for output of `py-execute-buffer' and related commands. See also `py-use-current-dir-when-execute-p'" + :type 'string + :group 'python-mode) + +(defcustom py-use-current-dir-when-execute-p t + "When `t', current directory is used by Python-shell for output of `py-execute-buffer' and related commands. + +See also `py-execute-directory'" + :type 'boolean + :group 'python-mode) + +(defcustom py-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 + ) + +(defcustom py-keep-windows-configuration nil + "If a windows is splitted displaying results, this is directed by variable `py-split-windows-on-execute-p'. Also setting `py-switch-buffers-on-execute-p' affects window-configuration. While commonly a screen splitted into source and Python-shell buffer is assumed, user may want to keep a different config. + +See lp:1239498 + +Setting `py-keep-windows-configuration' to `t' will restore windows-config regardless of settings mentioned above. However, if an error occurs, it's displayed. + +To suppres window-changes due to error-signaling also, set `py-keep-windows-configuration' onto 'force + +Default is nil " + + :type '(choice + (const :tag "nil" nil) + (const :tag "t" t) + (const :tag "force" 'force)) + :group 'python-mode) + +(defcustom py-output-buffer "*Python Output*" + "When `py-enforce-output-buffer-p' is non-nil, provides the +default for output-buffer. " + :type 'string + :group 'python-mode) +(make-variable-buffer-local 'py-output-buffer) + +(defcustom py-enforce-output-buffer-p nil + "When non-nil, current value of `py-output-buffer' is used for output, +regardless of environment. Default is nil" + + :type 'boolean + :group 'python-mode) + +(defvar py-exception-buffer nil + "Set internally, remember source buffer where error might occur. ") + +(defvar py-string-delim-re "\\(\"\"\"\\|'''\\|\"\\|'\\)" + "When looking at beginning of string. ") + +(defvar py-labelled-re "[ \\t]*:[[:print:]]+" + "When looking at label. ") + +(defvar py-expression-skip-regexp "[^ (=:#\t\r\n\f]" + "py-expression assumes chars indicated possible composing a py-expression, skip it. ") + +(defvar py-expression-skip-chars "^ (:=#\t\r\n\f" + "py-expression assumes chars indicated possible composing a py-expression, skip it. ") + +(defvar py-expression-re "[^ =:#\t\r\n\f]+" + "py-expression assumes chars indicated possible composing a py-expression, when looking-at or -back. ") + +(defvar py-not-expression-regexp "[ .=:#\t\r\n\f)]" + "py-expression assumes chars indicated probably will not compose a py-expression. ") + +(defvar py-not-expression-chars " .=#\t\r\n\f" + "py-expression assumes chars indicated probably will not compose a py-expression. ") + +(defvar py-partial-expression-backward-chars "^ ,\"'()[]{}:#\t\r\n\f" + "py-partial-expression assumes chars indicated possible composing a py-partial-expression, skip it. ") +;; (setq py-partial-expression-backward-chars "^ ,\"'([{:#\t\r\n\f") + +(defvar py-partial-expression-forward-chars "^ \"')}]:#\t\r\n\f") +;; (setq py-partial-expression-forward-chars "^ \"')}]:#\t\r\n\f") + +(defvar py-partial-expression-regexp "[^ .=:#\t\r\n\f]" + "py-partial-expression assumes chars indicated possible composing a py-partial-expression, when looking-at or -back. ") + +(defvar py-not-partial-expression-regexp "[ .=:#\t\r\n\f)]" + "py-partial-expression assumes chars indicated probably will not compose a py-partial-expression. ") + +(defvar py-operator-regexp "[ \t]*\\(\\.\\|+\\|-\\|*\\|//\\|//\\|&\\|%\\||\\|\\^\\|>>\\|<<\\|<\\|<=\\|>\\|>=\\|==\\|!=\\)[ \t]*" + "Matches most of Python operators inclusive whitespaces around. + +See also `py-assignment-regexp' ") + +(defvar py-assignment-regexp "[ \t]*=[^=]" + "Matches assignment operator inclusive whitespaces around. + +See also `py-operator-regexp' ") + +(defvar py-delimiter-regexp "\\(,\\|;\\|:\\)[ \t\n]" + "Delimiting elements of lists or other programming constructs. ") + +(defvar py-delimiter-chars ",;." + "Chars delimiting elements of lists or other programming constructs. ") + +(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) + +(defvar py-traceback-line-re + "[ \t]+File \"\\([^\"]+\\)\", line \\([0-9]+\\)" + "Regular expression that describes tracebacks.") + +(defvar py-preoutput-result nil + "Data from last `_emacs_out' line seen by the preoutput filter.") + +(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) + +(defvar inferior-python-mode-abbrev-table nil + "Not in use.") + +(defvar py-pdbtrack-input-prompt) + +(defvar py-pydbtrack-input-prompt) + +(defvar py-pdbtrack-is-tracking-p nil) + +(defvar py-shell-map nil + "Keymap used in *Python* shell buffers.") + +(defvar py-font-lock-keywords nil + "Additional expressions to highlight in Python mode.") + +(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'.") + +(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") + +(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") + +(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") + +(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. ") + +(defvar py-preoutput-result nil + "Data from last `_emacs_out' line seen by the preoutput filter.") + +(defvar py-import nil) + +(defvar py-imenu-class-regexp + (concat ; <> + "\\(" ; + "^[ \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 ; <> + "\\(" ; + "^[ \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.") + +(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.") + +(defvar py-imenu-generic-regexp nil) + +(defvar py-imenu-generic-parens nil) + +(defvar imenu-max-items) + +(defvar py-mode-output-map nil + "Keymap used in *Python Output* buffers.") + +(defvar inferior-python-mode-map + (let ((map (copy-keymap comint-mode-map))) + ;; (substitute-key-definition 'complete-symbol 'py-shell-complete map global-map) + (substitute-key-definition 'complete-symbol 'completion-at-point map global-map) + (define-key map (kbd "RET") 'comint-send-input) + (and py-complete-function + (define-key map [tab] 'py-complete-function)) + (define-key map "\C-c-" 'py-up-exception) + (define-key map "\C-c=" 'py-down-exception) + map)) + +(defvar py-menu) + +(defvar py-already-guessed-indent-offset nil + "Internal use by py-indent-line. + +When `this-command' is `eq' to `last-command', use the guess already computed. ") +(make-variable-buffer-local 'py-already-guessed-indent-offset) + +(defvar skeleton-further-elements) + +;; (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)) +(defvar inferior-python-mode-syntax-table + (let ((st (make-syntax-table python-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)) + +(defvar py-imports nil) + +(defvar smart-operator-mode nil) +(defvar autopair-mode nil) + +(defvar highlight-indent-active nil) +(defvar highlight-indentation nil + "Menu PyEdit fails when not bound") +(make-variable-buffer-local 'highlight-indentation) + +;;(eval-when-compile (load (concat (py-normalize-directory py-install-directory) "extensions" py-separator-char "highlight-indentation.el"))) + +;;; 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]*\\_[: \n\t]" + "Regular expression matching keyword which closes a try-block. ") + +(defconst py-except-re + "[ \t]*\\_[:( \n\t]*" + "Regular expression matching keyword which composes a try-block. ") + +(defconst py-else-re + "[ \t]*\\_[: \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-1-re-raw + (list + "elif" + "else" + "except" + "for" + "if" + "try" + "while" + )) + +(defconst py-no-outdent-2-re-raw + (list + "break" + "continue" + "pass" + "raise" + "return" + )) + +(defconst py-no-outdent-re + (concat + "[ \t]*\\_<\\(" + (regexp-opt py-no-outdent-1-re-raw) + "\\)\\_>[( \t]+.*:[( \t]\\_<\\(" + (regexp-opt py-no-outdent-2-re-raw) + "\\)\\_>[)\t]*$") + "Regular expression matching lines not to augment indent after. + +See py-no-outdent-1-re-raw, py-no-outdent-2-re-raw for better readable content ") + +(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\\|with\\)\\_>[:( \n\t]*" + "Matches the beginning of an `for', `if', `try' or `with' block. ") + +(defconst py-try-block-re "[ \t]*\\_[: \n\t]" + "Matches the beginning of a `try' block. ") + +(defconst py-if-block-re "[ \t]*\\_[: \n\t]" + "Matches the beginning of an `if' 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-raw + (list + "elif" + "else" + "except" + "finally" + "for" + "if" + "try" + "while" + "with") + "Matches the beginning of a compound statement or it's clause. ") + +(defvar py-block-or-clause-re + (concat + "[ \t]*\\_<\\(" + (regexp-opt py-block-or-clause-re-raw) + "\\)\\_>[( \t]*.*:?") + "See py-block-or-clause-re-raw, which it reads. ") + +(defconst py-extended-block-or-clause-re-raw + (list + "class" + "def" + "elif" + "else" + "except" + "finally" + "for" + "if" + "try" + "while" + "with") + "Matches the beginning of a compound statement or it's clause. ") + +(defconst py-extended-block-or-clause-re + (concat + "[ \t]*\\_<\\(" + (regexp-opt py-extended-block-or-clause-re-raw) + "\\)\\_>[( \t]*.*:?") + "See py-block-or-clause-re-raw, which it reads. ") + +(defconst py-top-level-form-re + (concat + "^\\_<[a-zA-Z_]\\|^\\_<\\(" + (regexp-opt py-extended-block-or-clause-re-raw) + "\\)\\_>[( \t]*.*:?") + "A form which starts at zero indent level, but is not a comment. ") + +(defconst py-block-keywords + (concat + "\\_<\\(" + (regexp-opt py-block-or-clause-re-raw) + "\\)\\_>") + "Matches known keywords opening a block. ") + +(defconst py-clause-re-raw + (list + "elif" + "else" + "except" + "finally" + ) + "Matches the beginning of a clause. ") + +(defconst py-clause-re + (concat + "[ \t]*\\_<\\(" + (regexp-opt py-clause-re-raw) + "\\)\\_>[( \t]*.*:?") + "See py-clause-re-raw, which it reads. ") + +(defconst py-elif-re "[ \t]*\\_<\\elif\\_>[:( \n\t]*" + "Matches the beginning of a compound if-statement's clause exclusively. ") + +(defconst py-try-clause-re + (concat + "[ \t]*\\_<\\(" + (mapconcat 'identity + (list + "else" + "except" + "finally") + "\\|") + "\\)\\_>[( \t]*.*:") + "Matches the beginning of a compound try-statement's clause. ") + +(defconst py-if-re "[ \t]*\\_[( \n\t]*" + "Matches the beginning of a compound statement saying `if'. ") + +(defconst py-try-re "[ \t]*\\_[:( \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 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)))) + +;;; Toggle +;; py-docstring-style forms +(defun toggle-py-nil-docstring-style (&optional arg) + "If nil docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg (if (eq py-docstring-style nil) -1 1)))) + (if (< 0 arg) + (setq py-docstring-style 'nil) + (setq py-docstring-style nil)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style)) + +(defun py-nil-docstring-style-on (&optional arg) + "Make sure, nil docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-nil-docstring-style arg)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun py-nil-docstring-style-off () + "Make sure, nil docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (toggle-py-nil-docstring-style -1) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun toggle-py-onetwo-docstring-style (&optional arg) + "If onetwo docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg (if (eq py-docstring-style 'onetwo) -1 1)))) + (if (< 0 arg) + (setq py-docstring-style 'onetwo) + (setq py-docstring-style nil)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style)) + +(defun py-onetwo-docstring-style-on (&optional arg) + "Make sure, onetwo docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-onetwo-docstring-style arg)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun py-onetwo-docstring-style-off () + "Make sure, onetwo docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (toggle-py-onetwo-docstring-style -1) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun toggle-py-pep-257-docstring-style (&optional arg) + "If pep-257 docstring-style should be on or off. + + Returns value of `py-pep-257-docstring-style' switched to. " + (interactive) + (let ((arg (or arg (if (eq py-docstring-style 'pep-257) -1 1)))) + (if (< 0 arg) + (setq py-docstring-style 'pep-257) + (setq py-docstring-style nil)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style)) + +(defun py-pep-257-docstring-style-on (&optional arg) + "Make sure, pep-257 docstring-style' is on. + +Returns value of `py-pep-257-docstring-style'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-pep-257-docstring-style arg)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun py-pep-257-docstring-style-off () + "Make sure, pep-257 docstring-style is off. + +Returns value of `py-pep-257-docstring-style'. " + (interactive) + (toggle-py-pep-257-docstring-style -1) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun toggle-py-pep-257-nn-docstring-style (&optional arg) + "If pep-257-nn docstring-style should be on or off. + + Returns value of `py-pep-257-nn-docstring-style' switched to. " + (interactive) + (let ((arg (or arg (if (eq py-docstring-style 'pep-257-nn) -1 1)))) + (if (< 0 arg) + (setq py-docstring-style 'pep-257-nn) + (setq py-docstring-style nil)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style)) + +(defun py-pep-257-nn-docstring-style-on (&optional arg) + "Make sure, pep-257-nn docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-pep-257-nn-docstring-style arg)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun py-pep-257-nn-docstring-style-off () + "Make sure, pep-257-nn docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (toggle-py-pep-257-nn-docstring-style -1) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun toggle-py-symmetric-docstring-style (&optional arg) + "If symmetric docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg (if (eq py-docstring-style 'symmetric) -1 1)))) + (if (< 0 arg) + (setq py-docstring-style 'symmetric) + (setq py-docstring-style nil)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style)) + +(defun py-symmetric-docstring-style-on (&optional arg) + "Make sure, symmetric docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-symmetric-docstring-style arg)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun py-symmetric-docstring-style-off () + "Make sure, symmetric docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (toggle-py-symmetric-docstring-style -1) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun toggle-py-django-docstring-style (&optional arg) + "If django docstring-style should be on or off. + + Returns value of `py-docstring-style' switched to. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg (if (eq py-docstring-style 'django) -1 1)))) + (if (< 0 arg) + (setq py-docstring-style 'django) + (setq py-docstring-style nil)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style)) + +(defun py-django-docstring-style-on (&optional arg) + "Make sure, django docstring-style' is on. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-django-docstring-style arg)) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +(defun py-django-docstring-style-off () + "Make sure, django docstring-style is off. + + Returns value of `py-docstring-style'. +To set permanently, customize this variable " + (interactive) + (toggle-py-django-docstring-style -1) + (when (or py-verbose-p (interactive-p)) (message "py-docstring-style: %s" py-docstring-style)) + py-docstring-style) + +;; py-underscore-word-syntax-p forms +(defun toggle-py-underscore-word-syntax-p (&optional arg) + "If `py-underscore-word-syntax-p' should be on or off. + + Returns value of `py-underscore-word-syntax-p' switched to. " + (interactive) + (let ((arg (or arg (if py-underscore-word-syntax-p -1 1)))) + (if (< 0 arg) + (progn + (setq py-underscore-word-syntax-p t) + (modify-syntax-entry ?\_ "w" python-mode-syntax-table)) + (setq py-underscore-word-syntax-p nil) + (modify-syntax-entry ?\_ "_" python-mode-syntax-table)) + (when (or py-verbose-p (interactive-p)) (message "py-underscore-word-syntax-p: %s" py-underscore-word-syntax-p)) + py-underscore-word-syntax-p)) + +(defun py-underscore-word-syntax-p-on (&optional arg) + "Make sure, py-underscore-word-syntax-p' is on. + +Returns value of `py-underscore-word-syntax-p'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-underscore-word-syntax-p arg)) + (when (or py-verbose-p (interactive-p)) (message "py-underscore-word-syntax-p: %s" py-underscore-word-syntax-p)) + py-underscore-word-syntax-p) + +(defun py-underscore-word-syntax-p-off () + "Make sure, `py-underscore-word-syntax-p' is off. + +Returns value of `py-underscore-word-syntax-p'. " + (interactive) + (toggle-py-underscore-word-syntax-p -1) + (when (or py-verbose-p (interactive-p)) (message "py-underscore-word-syntax-p: %s" py-underscore-word-syntax-p)) + py-underscore-word-syntax-p) + +(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 + :set (lambda (symbol value) + (set-default symbol value) + (toggle-py-underscore-word-syntax-p (if value 1 0)))) + +;; py-electric-comment-p forms +(defun toggle-py-electric-comment-p (&optional arg) + "If `py-electric-comment-p' should be on or off. + + Returns value of `py-electric-comment-p' switched to. " + (interactive) + (let ((arg (or arg (if py-electric-comment-p -1 1)))) + (if (< 0 arg) + (setq py-electric-comment-p t) + (setq py-electric-comment-p nil)) + (when (or py-verbose-p (interactive-p)) (message "py-electric-comment-p: %s" py-electric-comment-p)) + py-electric-comment-p)) + +(defun py-electric-comment-p-on (&optional arg) + "Make sure, py-electric-comment-p' is on. + +Returns value of `py-electric-comment-p'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-electric-comment-p arg)) + (when (or py-verbose-p (interactive-p)) (message "py-electric-comment-p: %s" py-electric-comment-p)) + py-electric-comment-p) + +(defun py-electric-comment-p-off () + "Make sure, `py-electric-comment-p' is off. + +Returns value of `py-electric-comment-p'. " + (interactive) + (toggle-py-electric-comment-p -1) + (when (or py-verbose-p (interactive-p)) (message "py-electric-comment-p: %s" py-electric-comment-p)) + py-electric-comment-p) + +;; toggle-force-local-shell +(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) + +;; py-toggle-indent-tabs-mode +(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-on (arg) + "Switch `indent-tabs-mode' on. " + (interactive "p") + (py-indent-tabs-mode (abs arg)(interactive-p))) + +(defun py-indent-tabs-mode-off (arg) + "Switch `indent-tabs-mode' off. " + (interactive "p") + (py-indent-tabs-mode (- (abs arg))(interactive-p))) + +;; py-jump-on-exception forms +(defun toggle-py-jump-on-exception (&optional arg) + "If `py-jump-on-exception' should be on or off. + + Returns value of `py-jump-on-exception' switched to. " + (interactive) + (let ((arg (or arg (if py-jump-on-exception -1 1)))) + (if (< 0 arg) + (setq py-jump-on-exception t) + (setq py-jump-on-exception nil)) + (when (or py-verbose-p (interactive-p)) (message "py-jump-on-exception: %s" py-jump-on-exception)) + py-jump-on-exception)) + +(defun py-jump-on-exception-on (&optional arg) + "Make sure, py-jump-on-exception' is on. + +Returns value of `py-jump-on-exception'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-jump-on-exception arg)) + (when (or py-verbose-p (interactive-p)) (message "py-jump-on-exception: %s" py-jump-on-exception)) + py-jump-on-exception) + +(defun py-jump-on-exception-off () + "Make sure, `py-jump-on-exception' is off. + +Returns value of `py-jump-on-exception'. " + (interactive) + (toggle-py-jump-on-exception -1) + (when (or py-verbose-p (interactive-p)) (message "py-jump-on-exception: %s" py-jump-on-exception)) + py-jump-on-exception) + +;; python-mode-v5-behavior-p forms +(defun toggle-python-mode-v5-behavior-p (&optional arg) + "If `python-mode-v5-behavior-p' should be on or off. + + Returns value of `python-mode-v5-behavior-p' switched to. " + (interactive) + (let ((arg (or arg (if python-mode-v5-behavior-p -1 1)))) + (if (< 0 arg) + (setq python-mode-v5-behavior-p t) + (setq python-mode-v5-behavior-p nil)) + (when (or py-verbose-p (interactive-p)) (message "python-mode-v5-behavior-p: %s" python-mode-v5-behavior-p)) + python-mode-v5-behavior-p)) + +(defun python-mode-v5-behavior-p-on (&optional arg) + "Make sure, `python-mode-v5-behavior-p' is on. + +Returns value of `python-mode-v5-behavior-p'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-python-mode-v5-behavior-p arg)) + (when (or py-verbose-p (interactive-p)) (message "python-mode-v5-behavior-p: %s" python-mode-v5-behavior-p)) + python-mode-v5-behavior-p) + +(defun python-mode-v5-behavior-p-off () + "Make sure, `python-mode-v5-behavior-p' is off. + +Returns value of `python-mode-v5-behavior-p'. " + (interactive) + (toggle-python-mode-v5-behavior-p -1) + (when (or py-verbose-p (interactive-p)) (message "python-mode-v5-behavior-p: %s" python-mode-v5-behavior-p)) + python-mode-v5-behavior-p) + +;; +(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) + +;; split-windows-on-execute +(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) + +;; highlight-indentation +(defun py-toggle-highlight-indentation (&optional indent) + "If `highlight-indentation-p' should be on or off. " + (interactive "P") + (unless (featurep 'highlight-indentation) + (load (concat (py-normalize-directory py-install-directory) "extensions" py-separator-char "highlight-indentation.el"))) + (highlight-indentation indent) + (when py-verbose-p (message "highlight-indent-active: %s" highlight-indent-active)) + highlight-indent-active) + +(defun py-highlight-indentation-off () + "If `highlight-indentation-p' should be on or off. " + (interactive) + (unless (featurep 'highlight-indentation) + (load (concat (py-normalize-directory py-install-directory) "extensions" py-separator-char "highlight-indentation.el"))) + (highlight-indentation-off) + (when py-verbose-p (message "highlight-indent-active: %s" highlight-indent-active)) + highlight-indent-active) + +(defun py-highlight-indentation-on () + "If `highlight-indentation-p' should be on or off. " + (interactive "P") + (unless (featurep 'highlight-indentation) + (load (concat (py-normalize-directory py-install-directory) "extensions" py-separator-char "highlight-indentation.el"))) + (highlight-indentation-on) + (when py-verbose-p (message "highlight-indent-active: %s" highlight-indent-active)) + highlight-indent-active) + +;; Smart indentation +(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) + (progn + (setq py-smart-indentation t) + (py-guess-indent-offset)) + (setq py-smart-indentation nil) + (setq py-indent-offset (default-value 'py-indent-offset))) + (when (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) + +;; Smart operator +(defun toggle-py-smart-operator-mode-p (&optional arg) + "If `py-smart-operator-mode-p' should be on or off. + + Returns value of `py-smart-operator-mode-p' switched to. " + (interactive) + (and (py-smart-operator-check) + (setq py-smart-operator-mode-p (smart-operator-mode (if smart-operator-mode 0 1))))) + +(defun py-smart-operator-mode-p-on () + "Make sure, py-smart-operator-mode-p' is on. + +Returns value of `py-smart-operator-mode-p'. " + (interactive) + (and (py-smart-operator-check) + (setq py-smart-operator-mode-p (smart-operator-mode 1)))) + +(defun py-smart-operator-mode-p-off () + "Make sure, py-smart-operator-mode-p' is off. + +Returns value of `py-smart-operator-mode-p'. " + (interactive) + (setq py-smart-operator-mode-p (smart-operator-mode 0))) + +;; py-use-current-dir-when-execute-p forms +(defun toggle-py-use-current-dir-when-execute-p (&optional arg) + "If `py-use-current-dir-when-execute-p' should be on or off. + + Returns value of `py-use-current-dir-when-execute-p' switched to. " + (interactive) + (let ((arg (or arg (if py-use-current-dir-when-execute-p -1 1)))) + (if (< 0 arg) + (setq py-use-current-dir-when-execute-p t) + (setq py-use-current-dir-when-execute-p nil)) + (when (or py-verbose-p (interactive-p)) (message "py-use-current-dir-when-execute-p: %s" py-use-current-dir-when-execute-p)) + py-use-current-dir-when-execute-p)) + +(defun py-use-current-dir-when-execute-p-on (&optional arg) + "Make sure, py-use-current-dir-when-execute-p' is on. + +Returns value of `py-use-current-dir-when-execute-p'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-use-current-dir-when-execute-p arg)) + (when (or py-verbose-p (interactive-p)) (message "py-use-current-dir-when-execute-p: %s" py-use-current-dir-when-execute-p)) + py-use-current-dir-when-execute-p) + +(defun py-use-current-dir-when-execute-p-off () + "Make sure, `py-use-current-dir-when-execute-p' is off. + +Returns value of `py-use-current-dir-when-execute-p'. " + (interactive) + (toggle-py-use-current-dir-when-execute-p -1) + (when (or py-verbose-p (interactive-p)) (message "py-use-current-dir-when-execute-p: %s" py-use-current-dir-when-execute-p)) + py-use-current-dir-when-execute-p) + +;; py-autopair-mode forms +(defalias 'toggle-py-autopair-mode 'py-toggle-autopair-mode) +(defun py-toggle-autopair-mode (&optional arg) + "If `py-autopair-mode' should be on or off. + + Returns value of `py-autopair-mode' switched to. " + (interactive) + (and (py-autopair-check) + (setq py-autopair-mode (autopair-mode (if autopair-mode 0 1))))) + +(defun py-autopair-mode-on () + "Make sure, py-autopair-mode' is on. + +Returns value of `py-autopair-mode'. " + (interactive) + (and (py-autopair-check) + (setq py-autopair-mode (autopair-mode 1)))) + +(defun py-autopair-mode-off () + "Make sure, py-autopair-mode' is off. + +Returns value of `py-autopair-mode'. " + (interactive) + (setq py-autopair-mode (autopair-mode 0))) + +;; py-switch-buffers-on-execute-p forms +(defun toggle-py-switch-buffers-on-execute-p (&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 (or py-verbose-p (interactive-p)) (message "py-switch-buffers-on-execute-p: %s" py-switch-buffers-on-execute-p)) + py-switch-buffers-on-execute-p)) + +(defun py-switch-buffers-on-execute-p-on (&optional arg) + "Make sure, `py-py-switch-buffers-on-execute-p' is on. + +Returns value of `py-switch-buffers-on-execute-p'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-switch-buffers-on-execute-p arg)) + (when (or py-verbose-p (interactive-p)) (message "py-switch-buffers-on-execute-p: %s" py-switch-buffers-on-execute-p)) + py-switch-buffers-on-execute-p) + +(defun py-switch-buffers-on-execute-p-off () + "Make sure, `py-switch-buffers-on-execute-p' is off. + +Returns value of `py-switch-buffers-on-execute-p'. " + (interactive) + (toggle-py-switch-buffers-on-execute-p -1) + (when (or py-verbose-p (interactive-p)) (message "py-switch-buffers-on-execute-p: %s" py-switch-buffers-on-execute-p)) + py-switch-buffers-on-execute-p) + +;; py-split-windows-on-execute-p forms +(defun toggle-py-split-windows-on-execute-p (&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 (or py-verbose-p (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-p-on (&optional arg) + "Make sure, `py-py-split-windows-on-execute-p' is on. + +Returns value of `py-split-windows-on-execute-p'. " + (interactive) + (let ((arg (or arg 1))) + (toggle-py-split-windows-on-execute-p arg)) + (when (or py-verbose-p (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-p-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-p -1) + (when (or py-verbose-p (interactive-p)) (message "py-split-windows-on-execute-p: %s" py-split-windows-on-execute-p)) + py-split-windows-on-execute-p) + +(defun py-toggle-sexp-function () + "Opens customization " + (interactive) + (customize-variable 'py-sexp-function)) + +;;; +;; Stolen from org-mode +(defun py-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 +`py-setup-codes' list." + (let ((process (get-buffer-process (current-buffer)))) + (accept-process-output process 1) + (dolist (code py-setup-codes) + (when code + (py-send-string (symbol-value code) process))))) + +(defun py-shell-get-process-name (py-dedicated-process-p) + "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 py-dedicated-process-p + 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 py-shell-get-process (&optional argprompt py-dedicated-process-p shell switch py-buffer-name) + "Get appropriate Python process for current buffer and return it." + (interactive) + (let ((erg (get-buffer-process (py-shell argprompt py-dedicated-process-p shell py-buffer-name t)))) + (when (interactive-p) (message "%S" erg)) + erg)) + +(defun py-shell-send-string (string &optional process msg filename) + "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 (get-buffer-process (py-shell)))) + (lines (split-string string "\n")) + (temp-file-name (concat (with-current-buffer (process-buffer process) + (file-remote-p default-directory)) + (py-normalize-directory py-temp-directory) + "psss-temp.py")) + (file-name (or filename (buffer-file-name) temp-file-name))) + (if (> (length lines) 1) + (let* () + ;; ((temporary-file-directory + ;; (if (file-remote-p default-directory) + ;; (concat (file-remote-p default-directory) "/tmp") + ;; temporary-file-directory)) + ;; (temp-file-name (make-temp-file "py")) + ;; (file-name (or (buffer-file-name) temp-file-name))) + (with-temp-file temp-file-name + (insert string) + (delete-trailing-whitespace)) + (py-send-file temp-file-name process temp-file-name)) + (process-send-string process string) + ;; (comint-send-string process string) + (when (or (not (string-match "\n$" string)) + (string-match "\n[ \t].*\n?$" string)) + (process-send-string process "\n"))))) + +(defun py-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) + wait + (process (or process (progn (setq wait 0.2)(get-buffer-process (py-shell))))) + ;; (comint-preoutput-filter-functions + ;; (append comint-preoutput-filter-functions + ;; '(ansi-color-filter-apply + ;; (lambda (string) + ;; (setq output-buffer (concat output-buffer string)) + ;; "")))) + ) + (and wait (sit-for wait)) + (py-shell-send-string string process msg) + (accept-process-output process 1) + (when output-buffer + (replace-regexp-in-string + (if (> (length py-shell-prompt-output-regexp) 0) + (format "\n*%s$\\|^%s\\|\n$" + py-shell-prompt-regexp + (or py-shell-prompt-output-regexp "")) + (format "\n*$\\|^%s\\|\n$" + py-shell-prompt-regexp)) + "" output-buffer)))) + +(defun py-send-string-return-output (string &optional process msg) + "Send STRING to PROCESS and return output. + +When MSG is non-nil messages the first line of STRING. Return +the output." + (let* (output-buffer + (process (or process (get-buffer-process (py-shell)))) + (comint-preoutput-filter-functions + (append comint-preoutput-filter-functions + '(ansi-color-filter-apply + (lambda (string) + (setq output-buffer (concat output-buffer string)) + ""))))) + (py-shell-send-string string process msg) + (accept-process-output process 1) + (when output-buffer + (setq output-buffer + (replace-regexp-in-string + (if (> (length py-shell-prompt-output-regexp) 0) + (format "\n*%s$\\|^%s\\|\n$" + python-shell-prompt-regexp + (or py-shell-prompt-output-regexp "")) + (format "\n*$\\|^%s\\|\n$" + python-shell-prompt-regexp)) + "" output-buffer))) + output-buffer)) + +(defun py-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 (get-buffer-process (py-shell)))) + (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")) + (py-shell-send-string + (format + (concat "__pyfile = open('''%s''');" + "exec(compile(__pyfile.read(), '''%s''', 'exec'));" + "__pyfile.close()") + file-name file-name) + process))) + +(defun py-switch-to-shell () + "Switch to inferior Python process buffer." + (interactive) + (pop-to-buffer (py-shell) t)) + +;;; + +(defun py-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 + (py-send-string-no-output + (format completion-code input) process))) + (when (> (length completions) 2) + (split-string completions "^'\\|^\"\\|;\\|'$\\|\"$" t))))) + +(defun py-shell--do-completion-at-point (process imports input orig) + "Do completion at point for PROCESS." + (with-syntax-table py-dotted-expression-syntax-table + (when imports (py-send-string-no-output imports process)) + (let* ((code python-shell-module-completion-string-code) + (completions + (py-shell-completion--get-completions + input process code)) + (completion (when completions + (try-completion input completions)))) + ;; (set-buffer oldbuf) + (with-current-buffer oldbuf + ;; (goto-char orig) + (cond ((eq completion t) + (if py-no-completion-calls-dabbrev-expand-p + (or (ignore-errors (dabbrev-expand nil))(when py-indent-no-completion-p + (tab-to-tab-stop))) + (when py-indent-no-completion-p + (tab-to-tab-stop))) + nil) + ((null completion) + (if py-no-completion-calls-dabbrev-expand-p + (or (dabbrev-expand nil)(when py-indent-no-completion-p + (tab-to-tab-stop))(message "Can't find completion ")) + (when py-indent-no-completion-p + (tab-to-tab-stop))) + nil) + ((not (string= input completion)) + (progn (delete-char (- (length input))) + (insert completion) + (move-marker pos (point)) + ;; minibuffer.el expects a list, a bug IMO + nil)) + (t + (with-output-to-temp-buffer py-python-completions + (display-completion-list + (all-completions input completions))) + (move-marker pos (point)) + nil)) + (and (goto-char pos) + nil))))) + +(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))) + +(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))))) +") + +(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))) + +;;; Helper commands +(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))) + +;; Strip CHARS from STRING +(defun string-strip (str &optional chars-before chars-after) + "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. " + (let ((s-c-b (or chars-before + strip-chars-before)) + (s-c-a (or chars-after + strip-chars-after)) + (erg str)) + (setq erg (replace-regexp-in-string s-c-b "" erg)) + (setq erg (replace-regexp-in-string s-c-a "" erg)) + erg)) + +(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 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 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-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 "\\_[: \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 "\\[: \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 "\\[: \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 "\\_[: \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 "\\_[ \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))))))) + +(defun 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-*$")))) + +(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)))) + +(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 py-args-to-list (string) + (let ((where (string-match "[ \t]" string))) + (cond ((null where) (list string)) + ((not (= where 0)) + (cons (substring string 0 where) + (py-args-to-list (substring string (+ 1 where))))) + (t (let ((pos (string-match "[^ \t]" string))) + (if pos (py-args-to-list (substring string pos)))))))) + +;; 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-preoutput-filter (s) + "`comint-preoutput-filter-functions' function: ignore prompts not at bol." + (when py-preoutput-leftover + (setq s (concat py-preoutput-leftover s)) + (setq py-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 py-preoutput-skip-next-prompt + (string-match comint-prompt-regexp line)) + (setq py-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 'py-preoutput-result)) + (progn + (setq py-preoutput-result (match-string 1 line)) + (set (make-local-variable 'py-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 py-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 py-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 'py-preoutput-leftover) s) + res) + (t (concat res s))))) + +(defun py-send-command (command) + "Like `py-send-string' but resets `compilation-shell-minor-mode'." + (when (py-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-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 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-proc (&optional py-dedicated-process-p) + "Return the current Python process. + +Start a new process if necessary. " + (interactive) + (let (py-split-windows-on-execute-p + (erg + (cond ((and (not py-dedicated-process-p) (comint-check-proc (current-buffer))) + (get-buffer-process (buffer-name (current-buffer)))) + ((not py-dedicated-process-p) + (get-buffer-process (py-shell nil nil nil nil t))) + ((py-shell nil py-dedicated-process-p nil nil t))))) + (when (interactive-p) (message "%S" erg)) + erg)) + +(defun py-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 (get-buffer-process (py-shell)))) + (save-excursion + (save-match-data + (re-search-backward " *\\=" nil t))))) + + + +(defun py-outline-level () + "`outline-level' function for Python mode. +The level is the number of `py-indent-offset' steps of indentation +of current line." + (let ((erg (1+ (/ (current-indentation) py-indent-offset)))) + (when (interactive-p) (message "%s" erg)) + erg)) + +;; FFAP support +(defalias 'py-module-path 'py-ffap-module-path) + +(defun py-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))) + (py-shell-get-process)))) + (if (not process) + nil + (let ((module-file + (py-send-string-no-output + (format py-ffap-string-code module) process))) + (when module-file + (substring-no-properties module-file 1 -1)))))) + +(add-hook 'python-mode-hook 'py-set-ffap-form) + + +;;; +(defconst py-space-backslash-table + (let ((table (copy-syntax-table python-mode-syntax-table))) + (modify-syntax-entry ?\\ " " table) + table) + "`python-mode-syntax-table' with backslash given whitespace syntax.") + +;; have to bind py-file-queue before installing the kill-emacs-hook + +(define-abbrev-table 'python-mode-abbrev-table ()) + +(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)' +(setq py-pdbtrack-input-prompt "^[(<]*[Ii]?[Pp]y?db[>)]+ ") +(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.") + + +;; Bindings +(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 `' &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.") + +(defconst py-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:'\\)\\(?2:'\\)\\(?3:'\\)\\(?4:'\\)\\(?5:'\\)\\(?6:'\\)\\|\\(?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)))) + +(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. + ))) + + +(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)) + + +;;; Keymap and syntax +;; Font-lock and syntax +(setq py-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" "except" "raise" + "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)) + ;; Builtin Exceptions + (,(rx word-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" "NoResultFound" + "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") + word-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) + ;; (,(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 + ("\\([._[:word:]]+\\)\\(?:\\[[^]]+]\\)?[[:space:]]*\\(?:\\(?:\\*\\*\\|//\\|<<\\|>>\\|[%&*+/|^-]\\)?=\\)" + (1 py-variable-name-face nil nil)) + ;; 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)) + (res nil)) + (while (and (setq res (re-search-forward re limit t)) + (goto-char (match-end 1)) + (nth 1 (syntax-ppss)) + ;; (python-syntax-context 'paren) + )) + res)) + (1 py-variable-name-face nil nil)) + ;; 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. + ))) + +;; An auxiliary syntax table which places underscore and dot in the +;; symbol class for simplicity + +;; 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) + +;; 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)) + +(defun py-docstring-p (&optional beginning-of-string-position) + "Check to see if there is a docstring at POS." + (let* (pps + (pos (or beginning-of-string-position + (and (nth 3 (setq pps (syntax-ppss))) (nth 8 pps))))) + (save-restriction + (widen) + (save-excursion + (and pos (goto-char pos)) + (if (looking-at-p "'''\\|\"\"\"") + (progn + (py-beginning-of-statement) + (or (bobp) + (py-beginning-of-def-or-class-p))) + nil))))) + +(defun py-font-lock-syntactic-face-function (state) + (if (nth 3 state) + (if (py-docstring-p (nth 8 state)) + font-lock-doc-face + font-lock-string-face) + font-lock-comment-face)) + +(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 \"#\" 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. + +Switched by `py-electric-colon-active-p', default is nil +See also `py-electric-colon-greedy-p' " + (interactive "*P") + (cond ((not py-electric-colon-active-p) + (self-insert-command (prefix-numeric-value arg))) + ((and py-electric-colon-bobl-only (save-excursion (py-beginning-of-statement) (not (py-beginning-of-block-p)))) + (self-insert-command (prefix-numeric-value arg))) + ((eq 4 (prefix-numeric-value arg)) + (self-insert-command 1)) + (t (insert ":") + (unless (py-in-string-or-comment-p) + (let ((orig (copy-marker (point))) + (indent (py-compute-indentation))) + (unless (or (eq (current-indentation) indent) + (and (not py-electric-colon-greedy-p) + (eq (current-indentation)(save-excursion (beginning-of-line) (py-beginning-of-block)(current-indentation)))) + (and (py-top-level-form-p)(< (current-indentation) indent))) + (beginning-of-line) + (delete-horizontal-space) + (indent-to indent)) + (goto-char orig)) + (when py-electric-colon-newline-and-indent-p + (py-newline-and-indent)))))) + +(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) + (skip-chars-forward " \t") + (setq erg (looking-at py-extended-block-or-clause-re) + ;; (or (looking-at py-class-re) + ;; (looking-at py-def-re)) + )) + erg)) + + +;; Electric deletion +(defun py-empty-out-list-backward () + "Deletes all elements from list before point. " + (interactive "*") + (and (member (char-before) (list ?\) ?\] ?\})) + (let ((orig (point)) + (thischar (char-before)) + pps cn) + (forward-char -1) + (setq pps (syntax-ppss)) + (if (and (not (nth 8 pps)) (nth 1 pps)) + (progn + (goto-char (nth 1 pps)) + (forward-char 1)) + (cond ((or (eq thischar 41)(eq thischar ?\))) + (setq cn "(")) + ((or (eq thischar 125) (eq thischar ?\})) + (setq cn "{")) + ((or (eq thischar 93)(eq thischar ?\])) + (setq cn "["))) + (skip-chars-backward (concat "^" cn))) + (delete-region (point) orig) + (insert-char thischar 1) + (forward-char -1)))) + +(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) + (cond ((looking-back "^[ \t]+") + (let* ((remains (% (current-column) py-indent-offset))) + (if (< 0 remains) + (delete-char (- remains)) + (indent-line-to (- (current-indentation) py-indent-offset))))) + ((and py-electric-kill-backward-p (member (char-before) (list ?\) ?\] ?\}))) + (py-empty-out-list-backward)) + (t (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)) + (if indent-tabs-mode + (insert (make-string 1 9)) + (insert (make-string py-indent-offset 32)))) + (t + (if (and (eq need cui)(not (eq cuc cui))) + (back-to-indentation) + (beginning-of-line) + (delete-horizontal-space) + (indent-to need)))))) + +(defun py-indent-fix-region-intern (beg end) + "Used when `py-tab-indents-region-p' is non-nil. " + (let (indent) + (save-excursion + (save-restriction + (beginning-of-line) + (narrow-to-region beg end) + (forward-line 1) + (narrow-to-region (line-beginning-position) end) + (beginning-of-line) + (delete-region (point) (progn (skip-chars-forward " \t\r\n\f") (point))) + (indent-to (py-compute-indentation)) + (while + (< (line-end-position) end) + (forward-line 1) + (beginning-of-line) + (delete-region (point) (progn (skip-chars-forward " \t\r\n\f") (point))) + (indent-to (py-compute-indentation)))))) + ;; (exchange-point-and-mark) + ) + +(defun py--indent-line-intern (need cui py-indent-offset col &optional beg end region) + (if py-tab-indent + (progn + (and py-tab-indents-region-p region + (py-indent-fix-region-intern beg end)) + (cond ((eq need cui) + (if (or (eq this-command last-command) + (eq this-command 'py-indent-line)) + (if (and py-tab-shifts-region-p region) + (while (and (goto-char beg) (< 0 (current-indentation))) + (py-shift-region-left 1 beg end)) + (beginning-of-line) + (delete-horizontal-space) + (if (<= (line-beginning-position) (+ (point) (- col cui))) + (forward-char (- col cui)) + (beginning-of-line))))) + ((< cui need) + (if (and py-tab-shifts-region-p region) + (progn + (py-shift-region-right 1)) + (progn + (beginning-of-line) + (delete-horizontal-space) + (indent-to (+ (* (/ cui py-indent-offset) py-indent-offset) py-indent-offset)) + (forward-char (- col cui))))) + ((< need cui) + (if (and py-tab-shifts-region-p region) + (progn + (when (eq (point) (region-end)) + (exchange-point-and-mark)) + (while (< 0 (current-indentation)) + (py-shift-region-left 1))) + (beginning-of-line) + (delete-horizontal-space))) + (t + (if (and py-tab-shifts-region-p region) + (progn + ;; (when (eq (point) (region-end)) + ;; (exchange-point-and-mark)) + (while (< (current-indentation) need) + (py-shift-region-right 1))) + (beginning-of-line) + (delete-horizontal-space) + (indent-to need) + (back-to-indentation) + (if (<= (line-beginning-position) (+ (point) (- col cui))) + (forward-char (- col cui)) + (beginning-of-line)))))) + (insert-tab))) + +(defun py--indent-line-base () + (unless (and (not (eq this-command last-command)) + (eq cui need)) + (cond ((eq 4 (prefix-numeric-value arg)) + (if (and (eq cui (current-indentation)) + (<= need cui)) + (if indent-tabs-mode (insert "\t")(insert (make-string py-indent-offset 32))) + (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 need cui this-indent-offset col beg end region)) + (t (py--indent-line-intern need cui this-indent-offset col beg end region))))) + +(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 + +When bound to TAB, C-q TAB inserts a TAB. + +When `py-tab-shifts-region-p' is `t', not just the current line, +but the region is shiftet that way. + +If `py-tab-indents-region-p' is `t' and first TAB doesn't shift +--as indent is at outmost reasonable--, indent-region is called. + +C-q TAB inserts a literal TAB-character. +" + (interactive "P") + (let ((orig (copy-marker (point))) + (cui (current-indentation)) + need) + (if (interactive-p) + ;; TAB-leaves-point-in-the-wrong-lp-1178453-test + (let ((region (use-region-p)) + col beg end done) + (unless (eq this-command last-command) + (setq py-already-guessed-indent-offset nil)) + (and region + (setq beg (region-beginning)) + (setq end (region-end)) + (save-excursion + (goto-char beg) + (setq cui (current-indentation)) + (setq col (current-column)))) + (let* ((col (or col (current-column))) + (this-indent-offset + (cond ((and py-smart-indentation (not (eq this-command last-command))) + (py-guess-indent-offset)) + ((and py-smart-indentation (eq this-command last-command) py-already-guessed-indent-offset) + py-already-guessed-indent-offset) + (t (default-value 'py-indent-offset))))) + (setq need (if (and (eq this-command last-command) py-already-guessed-indent-offset) + (if region + (save-excursion + ;; if previous command was an indent + ;; already, position reached might + ;; produce false guesses + (goto-char beg) (py-compute-indentation beg nil nil nil nil nil py-already-guessed-indent-offset)) + (py-compute-indentation nil nil nil nil nil nil py-already-guessed-indent-offset)) + (if region + (save-excursion (goto-char beg) (py-compute-indentation nil nil nil nil nil nil this-indent-offset)) + (py-compute-indentation nil nil nil nil nil nil this-indent-offset)))) + (py--indent-line-base) + (if region + (and (or py-tab-shifts-region-p + py-tab-indents-region-p) + (not (eq (point) orig)) + (exchange-point-and-mark)) + (and (< (current-column) (current-indentation))(back-to-indentation))) + (when (and (interactive-p) py-verbose-p)(message "%s" (current-indentation))) + (current-indentation))) + (setq need (py-compute-indentation)) + (unless (eq cui need) + (beginning-of-line) + (delete-horizontal-space) + (indent-to need) + (if (< (point) orig) (goto-char orig)(back-to-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 ((orig (point)) + erg pos) + (newline) + (if (and py-empty-line-closes-p (or (eq this-command last-command)(py-after-empty-line))) + (setq erg (indent-to-column (save-excursion (py-beginning-of-statement)(- (current-indentation) py-indent-offset)))) + (when (or py-newline-delete-trailing-whitespace-p py-trailing-whitespace-smart-delete-p) + (setq pos (copy-marker (point))) + (save-excursion + (goto-char orig) + (if (and (bolp)(eolp)) + (if (string-match "23.4" emacs-version) + (progn (save-restriction + (narrow-to-region (point) pos) + (delete-trailing-whitespace))) + (delete-trailing-whitespace (line-beginning-position) pos)) + (skip-chars-backward " \t") + (if (string-match "23.4" emacs-version) + (progn (save-restriction + (narrow-to-region (point) pos) + (delete-trailing-whitespace))) + (delete-trailing-whitespace (point) (marker-position pos)))))) + (setq erg (indent-to-column (py-compute-indentation)))) + (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 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) + +;; Guess indent offset +(defun py-guessed-sanity-check (guessed) + (and (>= guessed 2)(<= guessed 8)(eq 0 (% guessed 2)))) + +(defun py-guess-indent-final (indents orig) + "Calculate and do sanity-check. " + (let* ((first (car indents)) + (second (cadr indents)) + (erg (if (and first second) + (if (< second first) + ;; (< (point) orig) + (- first second) + (- second first)) + (default-value 'py-indent-offset)))) + (setq erg (and (py-guessed-sanity-check erg) erg)) + erg)) + +(defun py-guess-indent-forward () + "Called when moving to end of a form and `py-smart-indentation' is on. " + (interactive) + (let* ((first (if + (py-beginning-of-statement-p) + (current-indentation) + (progn + (py-end-of-statement) + (py-beginning-of-statement) + (current-indentation)))) + (second (if (or (looking-at py-extended-block-or-clause-re)(eq 0 first)) + (progn + (py-end-of-statement) + (py-end-of-statement) + (py-beginning-of-statement) + (current-indentation)) + ;; when not starting from block, look above + (while (and (re-search-backward py-extended-block-or-clause-re nil 'movet 1) + (or (>= (current-indentation) first) + (nth 8 (syntax-ppss))))) + (current-indentation)))) + (list first second))) + +(defun py-guess-indent-backward () + "Called when moving to beginning of a form and `py-smart-indentation' is on. " + (let* ((cui (current-indentation)) + (indent (if (< 0 cui) cui 999)) + (pos (progn (while (and (re-search-backward py-extended-block-or-clause-re nil 'movet 1) + (or (>= (current-indentation) indent) + (nth 8 (syntax-ppss))))) + (unless (bobp) (point)))) + (first (and pos (current-indentation))) + (second (and pos (py-end-of-statement) (py-end-of-statement) (py-beginning-of-statement)(current-indentation)))) + (list first second))) + +(defun py-guess-indent-offset (&optional direction) + "Guess `py-indent-offset'. + +Set local value of `py-indent-offset', return it + +Might change local value of `py-indent-offset' only when called +downwards from beginning of block followed by a statement. Otherwise default-value is returned. +" + (interactive) + (save-excursion + (let* ((orig (point)) + (indents + (cond (direction + (if (eq 'forward direction) + (py-guess-indent-forward) + (py-guess-indent-backward))) + ;; guess some usable indent is above current position + ((eq 0 (current-indentation)) + (py-guess-indent-forward)) + (t (py-guess-indent-backward)))) + (erg (py-guess-indent-final indents orig))) + (if erg (setq py-indent-offset erg) + (setq py-indent-offset + (default-value 'py-indent-offset))) + (when (interactive-p) (message "%s" 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) + (save-excursion + (let ((end (py-beginning-of-def-or-class))) + (py-end-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") + (setq count (or count 1)) + (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") + (setq count (or count 1)) + (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)) + (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 (interactive-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 (interactive-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 (interactive-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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-shift-minor-block-left (&optional arg) + "Dedent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use \[universal-argument] to specify a different value. + +Returns outmost indentation reached. +A minor block is started by a `for', `if', `try' or `with'. " + (interactive "*P") + (let ((erg (py-shift-forms-base "minor-block" (- (or arg py-indent-offset))))) + (when (interactive-p) (message "%s" erg)) + erg)) + +(defun py-shift-minor-block-right (&optional arg) + "Indent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use \[universal-argument] to specify a different value. + +Returns outmost indentation reached. +A minor block is started by a `for', `if', `try' or `with'. " + (interactive "*P") + (let ((erg (py-shift-forms-base "minor-block" (or arg py-indent-offset)))) + (when (interactive-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 (interactive-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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-shift-block-or-clause-right (&optional arg) + "Indent block-or-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 "block-or-clause" (or arg py-indent-offset)))) + (when (interactive-p) (message "%s" erg)) + erg)) + +(defun py-shift-block-or-clause-left (&optional arg) + "Dedent block-or-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 "block-or-clause" (- (or arg py-indent-offset))))) + (when (interactive-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 (interactive-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 (interactive-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 (interactive-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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-shift-def-or-class-right (&optional arg) + "Indent def-or-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 "def-or-class" (or arg py-indent-offset)))) + (when (interactive-p) (message "%s" erg)) + erg)) + +(defun py-shift-def-or-class-left (&optional arg) + "Dedent def-or-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 "def-or-class" (- (or arg py-indent-offset))))) + (when (interactive-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 (interactive-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 (interactive-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 (interactive-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 (interactive-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 recursive) + "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) + (if (and (bolp)(eolp)) + (forward-line 1) + (py-indent-and-forward))) + (unless (and (bolp)(eolp)) (py-indent-line)) + (goto-char orig))) + +;;; Positions +(defun py-beginning-of-paragraph-position () + "Returns beginning of paragraph position. " + (interactive) + (save-excursion + (let ((erg (progn + (py-beginning-of-paragraph) + (point)))) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-paragraph) + (point)))) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-block)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-beginning-of-minor-block-position () + "Returns beginning of minor-block position. " + (interactive) + (save-excursion + (let ((erg (py-beginning-of-minor-block))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-end-of-minor-block-position () + "Returns end of minor-block position. " + (interactive) + (save-excursion + (let ((erg (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-minor-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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-statement)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-beginning-of-comment-position () + "Returns beginning of comment position. " + (interactive) + (save-excursion + (let ((erg (py-beginning-of-comment))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-end-of-comment-position () + "Returns end of comment position. " + (interactive) + (save-excursion + (let ((erg (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-comment)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-beginning-of-top-level-position () + "Returns beginning of top-level position. " + (interactive) + (save-excursion + (let ((erg (py-beginning-of-top-level))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-end-of-top-level-position () + "Returns end of top-level position. " + (interactive) + (save-excursion + (let ((erg (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-top-level)))) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-partial-expression)))) + (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 (progn + (when (looking-at "[ \\t\\r\\n\\f]*$") + (skip-chars-backward " \t\r\n\f") + (forward-char -1)) + (py-end-of-expression)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +;;; some more Positions not generated by +;; `py-write-beg-end-position-forms' +(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)))) + +;;; 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-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 (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)))) + +(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)))))) + +(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)))) + +;;; Comments, Filling +(defun py-beginning-of-comment () + "Go to the beginning of current line's comment, if any. + +Returns position if succesful. " + (interactive) + (save-restriction + (widen) + (let ((pps (syntax-ppss))) + (when (nth 4 pps) + (goto-char + (nth 8 pps)))))) + +(defun py-end-of-comment () + "Go to the end of comment at point. + +Returns position, nil if not in comment." + + (interactive) + (let ((orig (point)) + last) + (while (and (not (eobp)) (or (looking-at (concat "[ \t]*" comment-start))(nth 4 (syntax-ppss))(and (bolp)(eolp)))) + (unless (and (bolp)(eolp)) + (setq last (point))) + (forward-line 1)) + (if last + (progn + (goto-char last) + (end-of-line) + (skip-chars-backward " \t\r\n\f") + (point)) + last))) + +;;; Comment forms +(defun py-comment-region (beg end &optional arg) + "Like `comment-region' but uses double hash (`#') comment starter." + (interactive "r\nP") + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start))) + (comment-region beg end arg))) + +(defun py-comment-block (&optional beg end arg) + "Comments block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-block-position))) + (end (or end (py-end-of-block-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-minor-block (&optional beg end arg) + "Comments minor-block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-minor-block-position))) + (end (or end (py-end-of-minor-block-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-top-level (&optional beg end arg) + "Comments top-level form at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-top-level-position))) + (end (or end (py-end-of-top-level-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-clause (&optional beg end arg) + "Comments clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-clause-position))) + (end (or end (py-end-of-clause-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-block-or-clause (&optional beg end arg) + "Comments block-or-clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-block-or-clause-position))) + (end (or end (py-end-of-block-or-clause-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-def (&optional beg end arg) + "Comments def at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-def-position))) + (end (or end (py-end-of-def-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-class (&optional beg end arg) + "Comments class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-class-position))) + (end (or end (py-end-of-class-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-def-or-class (&optional beg end arg) + "Comments def-or-class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-def-or-class-position))) + (end (or end (py-end-of-def-or-class-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +(defun py-comment-statement (&optional beg end arg) + "Comments statement at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default" + (interactive "*") + (save-excursion + (let ((comment-start (if py-block-comment-prefix-p + py-block-comment-prefix + comment-start)) + (beg (or beg (py-beginning-of-statement-position))) + (end (or end (py-end-of-statement-position)))) + (goto-char beg) + (push-mark) + (goto-char end) + (comment-region beg end arg)))) + +;; Comment forms +(defun py-uncomment-intern (beg end) + (uncomment-region beg end) + (when py-uncomment-indents-p + (py-indent-region beg end))) + +(defun py-uncomment (&optional beg end) + "Uncomment commented lines at point. + +If region is active, restrict uncommenting at region " + (interactive "*") + (save-excursion + (save-restriction + (when (use-region-p) + (narrow-to-region (region-beginning) (region-end))) + (let* (last + (beg (or beg (save-excursion + (while (and (py-beginning-of-comment) (setq last (point))(prog1 (forward-line -1)(end-of-line)))) + last)))) + (and (py-end-of-comment)) + (py-uncomment-intern beg (point)))))) + +(defun py-delete-comments-in-def-or-class () + "Delete all commented lines in def-or-class at point" + (interactive "*") + (save-excursion + (let ((beg (py-beginning-of-def-or-class-position)) + (end (py-end-of-def-or-class-position))) + (and beg end (py--delete-comments-intern beg end))))) + +(defun py-delete-comments-in-class () + "Delete all commented lines in class at point" + (interactive "*") + (save-excursion + (let ((beg (py-beginning-of-class-position)) + (end (py-end-of-class-position))) + (and beg end (py--delete-comments-intern beg end))))) + +(defun py-delete-comments-in-block () + "Delete all commented lines in block at point" + (interactive "*") + (save-excursion + (let ((beg (py-beginning-of-block-position)) + (end (py-end-of-block-position))) + (and beg end (py--delete-comments-intern beg end))))) + +(defun py-delete-comments-in-region (beg end) + "Delete all commented lines in region. " + (interactive "r*") + (save-excursion + (py--delete-comments-intern beg end))) + +(defun py--delete-comments-intern (beg end) + (save-restriction + (narrow-to-region beg end) + (goto-char beg) + (while (and (< (line-end-position) end) (not (eobp))) + (beginning-of-line) + (if (looking-at (concat "[ \t]*" comment-start)) + (delete-region (point) (1+ (line-end-position))) + (forward-line 1))))) +;;; +(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-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-comment (&optional justify) + "Fill the comment paragraph at point" + (interactive "*P") + (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-until-found (search-string liste) + "Search liste for search-string until found. " + (let ((liste liste) element) + (while liste + (if (member search-string (car liste)) + (setq element (car liste) liste nil)) + (setq liste (cdr liste))) + element)) + +(defun py-end-of-string (&optional beginning-of-string-position) + "Go to end of string at point, return position. + +Takes the result of (syntax-ppss)" + (interactive) + (let ((beginning-of-string-position (or beginning-of-string-position (and (nth 3 (syntax-ppss))(nth 8 (syntax-ppss))) + (and (looking-at "\"\"\"\\|'''\\|\"\\|\'")(match-beginning 0)))) + erg) + (if beginning-of-string-position + (progn + (goto-char beginning-of-string-position) + (goto-char (scan-sexps (point) 1)) + (setq erg (point))) + (error (concat "py-end-of-string: don't see end-of-string at " (buffer-name (current-buffer)) "at pos " (point)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-fill-this-paragraph (justify style) + "Fill just the paragraph at point. " + (interactive "*") + (py-fill-string justify style (if (py-beginning-of-paragraph-p) (point) (progn (py-beginning-of-paragraph)(point))) (progn (py-end-of-paragraph)(point)))) + +(defun py-fill-paragraph (&optional justify style start end docstring) + "`fill-paragraph-function' + +If `py-paragraph-fill-docstring-p' and inside a docstring, the whole docstring is formatted. +See also `py-fill-string' " + (interactive "P") + (or (fill-comment-paragraph justify) + (let* ((orig (copy-marker (point))) + (pps (syntax-ppss)) + (docstring (and + ;; py-paragraph-fill-docstring-p + + (or docstring (py-docstring-p (nth 8 pps))))) + (beg (cond (start) + ((use-region-p) + (region-beginning)) + ((and docstring + ;; (or py-paragraph-fill-docstring-p + ;; pep-257-nn, delimiters are on first line + ;; (and + ;; (eq py-docstring-style 'pep-257-nn) + (ignore-errors (<= (py-beginning-of-paragraph-position)(nth 8 pps)))) + (nth 8 pps)) + (t (py-beginning-of-paragraph-position)))) + (end (copy-marker + (cond (end) + ((use-region-p) (region-end)) + (docstring (py-end-of-string (nth 8 pps))) + (t (if (or (looking-at paragraph-start)(re-search-forward paragraph-start nil t 1)) + (progn (skip-chars-backward " \t\r\n\f")(point)) + (point)))))) + (style (or style py-docstring-style)) + (this-end (point-min)) + last) + ;; (when (and (nth 3 pps) (< beg (nth 8 pps)) + ;; docstring + ;; (setq beg (nth 8 pps))) + ;; (setq end (py-end-of-string (nth 8 pps)))) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (cond + ;; Comments + ((nth 4 pps) + (py-fill-comment justify)) + ;; Strings/Docstrings + ((or (nth 3 pps) + (equal (string-to-syntax "|") + (syntax-after (point))) + (looking-at py-string-delim-re)) + (goto-char beg) + (if (and py-paragraph-fill-docstring-p docstring + ;; (re-search-forward (concat "^" py-labelled-re) nil t) + ) + (progn + (goto-char beg) + ;; must process one by one + (while (and (not (eobp)) (setq last (point)) (forward-paragraph) (< last (point))(< (point) end)(setq this-end (point))) + (save-restriction + (narrow-to-region last this-end) + (goto-char last) + ;; (if (re-search-forward (concat "^" py-labelled-re) nil t this-end) + ;; (py-fill-labelled-string last this-end) + + (py-fill-string justify style last this-end pps 'no) + ;;) + (goto-char this-end) + (widen)))) + (goto-char orig) + (py-fill-this-paragraph justify style))) + ;; Decorators + ((save-excursion + (and (py-beginning-of-statement) + (equal (char-after) + ;; (back-to-indentation) + ;; (point)) + ?\@))) + (py-fill-decorator justify)) + (t (goto-char orig) + (py-fill-string justify style (if (py-beginning-of-paragraph-p) (point) (py-beginning-of-paragraph)) (py-end-of-paragraph)))))) + (goto-char orig) + (back-to-indentation)) + (recenter-top-bottom) + ;; fill-paragraph expexts t + t)) + +(defun py-fill-labelled-string (beg end) + "Fill string or paragraph containing lines starting with label + +See lp:1066489 " + (interactive "r*") + (let ((end (copy-marker end)) + (last (copy-marker (point))) + this-beg this-end) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (goto-char beg) + (skip-chars-forward " \t\r\n\f") + (if (looking-at py-labelled-re) + (progn + (setq this-beg (line-beginning-position)) + (goto-char (match-end 0)) + (while (and (not (eobp)) (re-search-forward py-labelled-re end t 1)(< last (match-beginning 0))(setq last (match-beginning 0))) + (save-match-data (fill-region this-beg (1- (line-beginning-position)))) + (setq this-beg (line-beginning-position)) + (goto-char (match-end 0))))))))) + +(defun py-fill-string (&optional justify style beg end pps docstring) + "String fill function for `py-fill-paragraph'. +JUSTIFY should be used (if applicable) as in `fill-paragraph'. + +DOCSTRING is either a boolean or 'no +If `py-paragraph-fill-docstring-p' is `t', `M-q` fills the +complete docstring according to setting of `py-docstring-style' " + (interactive "P") + (save-excursion + (save-restriction + (let* ((style (or style py-docstring-style)) + (fill-column (if (integerp py-docstring-fill-column) + py-docstring-fill-column + fill-column)) + ;; unset python-mode value this time + forward-sexp-function + (orig (point-marker)) + (pps-raw (or pps (syntax-ppss))) + (pps (or (nth 8 pps-raw)(and (equal (string-to-syntax "|") + (syntax-after (point))) + (skip-chars-forward "\"'") + (syntax-ppss)) + (and (equal (string-to-syntax "|") + (syntax-after (1- (point)))) + (skip-chars-backward "\"'") + (syntax-ppss)))) + ;; if beginning of string is closer than arg beg, use this + (beg (or (and (numberp beg) + (ignore-errors (copy-marker beg))) + (cond ((and (nth 3 pps) (nth 8 pps)) + (goto-char (nth 8 pps)) + (skip-chars-forward "\"'") + (copy-marker (point))) + ((equal (string-to-syntax "|") + (syntax-after (point))) + (copy-marker (point)))))) + ;; Assume docstrings at BOL resp. indentation + (docstring (unless (eq 'no docstring) + (py-docstring-p (nth 8 pps)))) + (end (or (ignore-errors (and end (goto-char end) (skip-chars-backward "\"' \t\f\n")(copy-marker (point)))) + (progn (or (eq (marker-position beg) (point)) (goto-char (nth 8 pps))) + (forward-sexp) + ;; (scan-sexps (point) 1) + (skip-chars-backward "\"'") (point-marker)))) + multi-line-p + delimiters-style + erg) + ;; whitespace and newline will be added according to mode again + (goto-char beg) + (setq beg (progn (skip-chars-forward "\"'") (copy-marker (point)))) + (and docstring + (delete-region (point) (progn (skip-chars-forward " \t\r\n\f") (skip-chars-forward " \t\r\n\f")(point)))) + (goto-char end) + (and docstring + (delete-region (point) (progn (skip-chars-backward " \t\r\n\f")(point)))) + (cond + ((and docstring + (string-match (concat "^" py-labelled-re) (buffer-substring-no-properties beg end))) + (py-fill-labelled-string beg end)) + ((and docstring) + (narrow-to-region beg end) + (fill-region (point-min) (point-max))) + (t (narrow-to-region beg end) + (sit-for 0.1) + (fill-region beg end))) + (and docstring (setq multi-line-p + (> (count-matches "\n" beg end) 0))) + (and docstring + (setq delimiters-style + (case style + ;; delimiters-style is a cons cell with the form + ;; (START-NEWLINES . END-NEWLINES). When any of the sexps + ;; is NIL means to not add any newlines for start or end + ;; of docstring. See `py-docstring-style' for a + ;; graphic idea of each style. + (django (cons 1 1)) + (onetwo (and multi-line-p (cons 1 2))) + (pep-257 (and multi-line-p (cons nil 2))) + (pep-257-nn (and multi-line-p (cons nil 1))) + (symmetric (and multi-line-p (cons 1 1)))))) + (and docstring py-verbose-p (message "%s" delimiters-style)) + (widen) + (save-excursion + (when (and docstring style) + ;; Add the number of newlines indicated by the selected style + ;; at the start of the docstring. + (goto-char beg) + (and + (car delimiters-style) + (unless (or (and (bolp)(eolp)) (save-excursion (forward-line -1)(and (bolp)(eolp)))) + (or (newline (car delimiters-style)) t)) + (indent-region beg end)) + (and multi-line-p + (forward-line 1) + (unless (and (bolp)(eolp)) (insert "\n"))) + ;; Add the number of newlines indicated by the selected style + ;; at the end of the docstring. + (goto-char end) + (unless (eq (char-after) ?\n) + (and + (cdr delimiters-style) + (or (newline (cdr delimiters-style)) t))) + (setq end (progn (skip-chars-forward " \t\r\n\f")(skip-chars-forward "\"'")(copy-marker (point)))) + (setq beg (progn (goto-char beg) (skip-chars-backward " \t\r\n\f")(skip-chars-backward "\"'") (copy-marker (point))))) + (indent-region beg end) + (goto-char end) + (beginning-of-line) + (unless (eq (current-indentation) (setq erg (py-compute-indentation))) + (fixup-whitespace) + (indent-to erg))))))) + +(defun py-fill-decorator (&optional justify) + "Decorator fill function for `py-fill-paragraph'. +" + ;; (interactive "*P") + t) + +(defun py-fill-string-django (&optional justify) + "Fill docstring according to Django's coding standards style. + + \"\"\" + Process foo, return bar. + \"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style' +" + (interactive "*P") + (py-fill-string justify 'django)) + +(defun py-fill-string-onetwo (&optional justify) + "One newline and start and Two at end style. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style' +" + (interactive "*P") + (py-fill-string justify 'onetwo)) + +(defun py-fill-string-pep-257 (&optional justify) + "PEP-257 with 2 newlines at end of string. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style' +" + (interactive "*P") + (py-fill-string justify 'pep-257)) + +(defun py-fill-string-pep-257-nn (&optional justify) + "PEP-257 with 1 newline at end of string. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style' +" + (interactive "*P") + (py-fill-string justify 'pep-257-nn)) + +(defun py-fill-string-symmetric (&optional justify) + "Symmetric style. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style' +" + (interactive "*P") + (py-fill-string justify 'symmetric)) + +;; (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))))))))) + +;; Beginning-of- p +(defun py-beginning-of-top-level-p () + "Returns position, if cursor is at the beginning of a top-level, nil otherwise. " + (interactive) + (let (erg) + (and (py-beginning-of-statement-p) + (eq 0 (current-column)) + (setq erg (point)) + erg))) + +(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))) + +(defun py-beginning-of-minor-block-p () + "Returns position, if cursor is at the beginning of a minor-block, nil otherwise. + +A minor block is started by a `for', `if', `try' or `with'. +" + (when (and (looking-at py-minor-block-re) + (not (py-in-string-or-comment-p))) + (point))) + +;; End-of- p +(defun py-end-of-line-p () + "Returns position, if cursor is at the end of a line, nil otherwise. " + (when (eolp)(point))) + +(defun py-end-of-buffer-p () + "Returns position, if cursor is at the end of buffer, nil otherwise. " + (when (eobp)(point))) + +(defun py-end-of-paragraph-p () + "Returns position, if cursor is at the end of a paragraph, nil otherwise. " + (let ((orig (point)) + erg) + (if (and (eolp) (looking-at paragraph-separate)) + (setq erg (point)) + (save-excursion + (py-beginning-of-paragraph) + (py-end-of-paragraph) + (when (eq orig (point)) + (setq erg orig))) + erg))) + +(defun py-end-of-statement-p () + "Returns position, if cursor is at the end of a statement, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-statement) + (py-end-of-statement) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defun py-end-of-expression-p () + "Returns position, if cursor is at the end of a expression, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-expression) + (py-end-of-expression) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defun py-end-of-partial-expression-p () + "Returns position, if cursor is at the end of a partial-expression, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-partial-expression) + (py-end-of-partial-expression) + (when (eq orig (point)) + (setq erg orig))) + erg)) + +(defun py-end-of-block-p () + "Returns position, if cursor is at the end of a block, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-block) + (py-end-of-block) + (when (eq orig (point)) + (setq erg orig))) + erg)) + +(defun py-end-of-clause-p () + "Returns position, if cursor is at the end of a clause, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-clause) + (py-end-of-clause) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defun py-end-of-block-or-clause-p () + "Returns position, if cursor is at the end of a block-or-clause, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-block-or-clause) + (py-end-of-block-or-clause) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defun py-end-of-def-p () + "Returns position, if cursor is at the end of a def, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-def) + (py-end-of-def) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defun py-end-of-class-p () + "Returns position, if cursor is at the end of a class, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-class) + (py-end-of-class) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defun py-end-of-def-or-class-p () + "Returns position, if cursor is at the end of a def-or-class, nil otherwise. " + (let ((orig (point)) + erg) + (save-excursion + (py-beginning-of-def-or-class) + (py-end-of-def-or-class) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +;;; 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-or-clause-re)) + (erg (py-statement-opens-base regexp))) + (when (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 + (<= (line-beginning-position) orig)(looking-back "^[ \t]*")(looking-at regexp)) + (setq erg (point)))) + (when (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-of-clause-intern (&optional regexp orig) + "Used internal by functions going to the end of a current clause. " + (unless (eobp) + (let* ((regexp (or regexp py-block-or-clause-re)) + (orig (or orig (point))) + (erg (if (py-statement-opens-block-p regexp) + (point) + (py-go-to-keyword py-extended-block-or-clause-re) + (when (py-statement-opens-block-p regexp) + (point)))) + ind res) + (if erg + (progn + (setq ind (+ py-indent-offset (current-indentation))) + (py-end-of-statement) + (forward-line 1) + (setq erg (py-travel-current-indent ind))) + (goto-char orig) + (py-look-downward-for-clause)) + (when (and (bolp)(eolp)) + (skip-chars-backward " \t\r\n\f") + (py-beginning-of-comment) + (skip-chars-backward " \t\r\n\f")) + (when (eq (point) orig) + (py-look-downward-for-clause)) + (when (< orig (point)) + (setq res (point))) + res))) + +(defun py-end-base (regexp &optional orig decorator) + "Used internal by functions going to the end forms. " + (unless (eobp) + (let* ((orig (or orig (point))) + (regexp (or regexp 'py-extended-block-or-clause-re)) + (thisregexp + (cond ((eq regexp 'py-def-or-class-re) + (concat "@\\|" py-def-or-class-re)) + ((eq regexp 'py-def-re) + (concat "@\\|" py-def-re)) + ((eq regexp 'py-class-re) + (concat "@\\|" py-class-re)) + ((eq regexp 'py-minor-block-re) + py-minor-block-re) + (t (concat "@\\|" py-extended-block-or-clause-re)))) + + bofst + (this (progn (back-to-indentation) + (setq bofst (py-beginning-of-statement-p)) + (cond ((and bofst (eq regexp 'py-clause-re)(looking-at py-extended-block-or-clause-re)) + (point)) + ((and bofst (looking-at (symbol-value regexp))) + (point)) + (t + (when + (cdr-safe + (py-go-to-keyword + thisregexp)) + (when (py-statement-opens-block-p py-extended-block-or-clause-re) + (point))))))) + ind erg last pps thisindent done) + (cond (this + (setq thisindent (current-indentation)) + (cond ((and py-close-provides-newline + (or (eq regexp 'py-def-re)(eq regexp 'py-class-re)(eq regexp 'py-def-or-class-re))) + (while (and (setq last (point))(re-search-forward "^$")(skip-chars-forward " \t\r\n\f")(or (nth 8 (setq pps (syntax-ppss))) (nth 1 pps) (< thisindent (current-column))))) + ;; (goto-char last) + (skip-chars-backward " \t\r\n\f") + (setq done t) + (and (nth 8 (setq pps (syntax-ppss))) + (py-beginning-of-statement) + (py-end-of-statement))) + (t (while + (and (py-down-statement) + (or (< thisindent (current-indentation)) + (and (eq thisindent (current-indentation)) + (or (eq regexp 'py-minor-block-re) + (eq regexp 'py-block-re)) + (looking-at py-clause-re))) + (py-end-of-statement)(setq last (point)))) + (goto-char last)))) + (t (goto-char orig))) + (when (and (<= (point) orig)(not (looking-at (symbol-value regexp)))) + ;; found the end above + ;; py-travel-current-indent will stop of clause at equal indent + (when (py-look-downward-for-beginning (symbol-value regexp)) + (py-end-base regexp orig))) + (setq pps (syntax-ppss)) + (if (and (< orig (point)) (not (or (looking-at comment-start) (nth 8 pps) (nth 1 pps)))) + (point) + (goto-char (point-max)) + nil)))) + +(defun py-look-downward-for-beginning (regexp) + "When above any beginning of FORM, search downward. " + (let* ((orig (point)) + (erg orig) + (last orig) + pps) + (while (and (setq last (point)) (not (eobp)) (re-search-forward regexp nil t 1)(setq erg (match-beginning 0)) (setq pps (syntax-ppss)) + (or (nth 8 pps) (nth 1 pps)))) + (cond ((not (or (nth 8 pps) (nth 1 pps) (or (looking-at comment-start)))) + (when (ignore-errors (< orig erg)) + erg))))) + +(defun py-look-downward-for-clause (&optional ind orig regexp) + "If beginning of other clause exists downward in current block. + +If succesful return position. " + (interactive) + (unless (eobp) + (let ((ind (or ind + (save-excursion + (py-beginning-of-statement) + (if (py-statement-opens-block-p) + (current-indentation) + (- (current-indentation) py-indent-offset))))) + (orig (or orig (point))) + (regexp (or regexp py-extended-block-or-clause-re)) + erg last) + (end-of-line) + (when (re-search-forward regexp nil t 1) + (when (nth 8 (syntax-ppss)) + (while (and (re-search-forward regexp nil t 1) + (nth 8 (syntax-ppss))))) + (setq last (point)) + (back-to-indentation) + (unless (and (looking-at py-clause-re) + (not (nth 8 (syntax-ppss))) (eq (current-indentation) ind)) + (progn (setq ind (current-indentation)) + (while (and (py-end-of-statement-bol)(not (looking-at py-clause-re))(<= ind (current-indentation))))) + (if (and (looking-at py-clause-re) + (not (nth 8 (syntax-ppss))) + (< orig (point))) + (setq erg (point)) + (goto-char orig)))) + (when (interactive-p) (message "%s" erg)) + erg))) + +(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-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-def-or-class () + "Returns concatenated `def' and `class' names in hierarchical order, if cursor is inside. + +Returns \"???\" otherwise +Used by variable `which-func-functions' " + (interactive) + (let* ((orig (point)) + (first t) + def-or-class + done last erg name) + (and first (looking-at "[ \t]*\\_<\\(def\\|class\\)\\_>[ \n\t]\\([[:alnum:]_]+\\)")(not (nth 8 (syntax-ppss))) + (add-to-list 'def-or-class (match-string-no-properties 2))) + (while + (and (not (bobp)) (not done) (or (< 0 (current-indentation)) first)) + (py-beginning-of-def-or-class) + (looking-at "[ \t]*\\_<\\(def\\|class\\)\\_>[ \n\t]\\([[:alnum:]_]+\\)") + (setq last (point)) + (setq name (match-string-no-properties 2)) + (if first + (progn + (setq first nil) + (py-end-of-def-or-class) + (if + (<= orig (point)) + (goto-char last) + (setq done t) + (goto-char orig))) + t) + (unless done (add-to-list 'def-or-class name))) + (unless done (setq def-or-class (mapconcat 'identity def-or-class "."))) + (goto-char orig) + (or def-or-class (setq def-or-class "???")) + (when (interactive-p) (message "%s" def-or-class)) + def-or-class)) + +(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. ") + +;;; Beginning/End +(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-backward-expression 'py-beginning-of-expression) +(defun py-beginning-of-expression (&optional arg) + "Go to the beginning of a compound python expression. + +With numeric ARG do it that many times. + +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 "p") + (or arg (setq arg 1)) + (let (erg) + (if (< 0 arg) + (save-restriction + (widen) + (setq erg (py-beginning-of-expression-intern))) + (setq arg (abs arg)) + (setq erg (py-end-of-expression arg))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-beginning-of-expression-intern (&optional orig) + (unless (bobp) + (let ((orig (or orig (point))) + (pps (syntax-ppss)) + erg) + (cond + ((and (bolp)(eolp)) + (while + (and (and (bolp)(eolp))(not (bobp))) + (forward-line -1) + (end-of-line)) + (py-beginning-of-expression-intern orig)) + ;; lists + ((nth 1 pps) + (goto-char (nth 1 pps)) + (skip-chars-backward py-expression-skip-chars) + (while (or (looking-back (concat py-string-delim-re py-expression-re py-string-delim-re py-operator-regexp) (line-beginning-position) t) + (looking-back (concat "[[:alnum:]_]*" py-operator-regexp "[ \t]*") (line-beginning-position) t)) + (goto-char (match-beginning 0)))) + ;; listed elements + ((looking-back (concat "[^ \t\n\r\f]+" py-delimiter-regexp)) + (goto-char (match-beginning 0)) + (while (looking-back (concat "[^ \t\n\r\f]+" py-delimiter-regexp)) + (goto-char (match-beginning 0))) + (unless (or (looking-back py-assignment-regexp) (looking-back "^[ \t]*")) + (py-beginning-of-expression-intern orig))) + ;; strings + ((and (nth 3 pps)(nth 8 pps) + (goto-char (nth 8 pps))) + (cond (;; consider expression a string starting at BOL + (bolp)) + ((looking-back py-assignment-regexp)) + ((looking-back py-operator-regexp) + (when (nth 2 pps) + (goto-char (nth 2 pps)))) + (t (py-beginning-of-expression-intern orig)))) + ;; comments left + ((nth 8 pps) + (goto-char (nth 8 pps)) + (unless (bobp) + (py-beginning-of-expression-intern orig))) + ;; concatenated strings + ((looking-back (concat py-string-delim-re py-expression-re py-string-delim-re py-operator-regexp py-string-delim-re py-expression-re py-string-delim-re)) + (goto-char (match-beginning 0)) + (while (looking-back (concat py-string-delim-re py-expression-re py-string-delim-re py-operator-regexp) (line-beginning-position) t) + (goto-char (match-beginning 0))) + (skip-chars-backward py-expression-skip-chars)) + ;; before comment + ((and (looking-at "[ \t]*#") (looking-back "^[ \t]*")) + (forward-line -1) + (end-of-line) + (skip-chars-backward " \t\r\n\f") + (unless (bobp) + (forward-char -1) + (py-beginning-of-expression-intern orig))) + ;; before assignment + ((looking-back py-assignment-regexp) + (goto-char (1- (match-beginning 0))) + (forward-char -1) + (py-beginning-of-expression-intern orig)) + ((looking-back py-operator-regexp) + (goto-char (1- (match-beginning 0))) + (forward-char -1) + (unless (< 0 (abs (skip-chars-backward py-expression-skip-chars))) + (py-beginning-of-expression-intern orig))) + ((looking-back "\"\\|'") + (forward-char -1) + (skip-chars-backward "\"'") + (unless (looking-back py-assignment-regexp) + (py-beginning-of-expression-intern orig))) + ((looking-back "(\\|\\[") + (forward-char -1) + (unless (looking-back py-assignment-regexp) + (py-beginning-of-expression-intern orig))) + ((looking-back "[\])}]") + (forward-char -1) + (unless (looking-back py-assignment-regexp) + (py-beginning-of-expression-intern orig))) + ;; inside expression + ((looking-back py-expression-re) + (skip-chars-backward py-expression-skip-chars) + (unless (or (looking-back "^[ \t]*") (looking-back py-assignment-regexp)) + (py-beginning-of-expression-intern orig))) + ((looking-back (concat "[ \t]*" "[[:alnum:]_]*" py-operator-regexp "[[:alnum:]_]*") (line-beginning-position) t) + (goto-char (match-beginning 0)) + (unless (looking-back "^[ \t]*") + (py-beginning-of-expression-intern orig))) + ((and (eq (point) orig) (looking-back "[ \t\r\n\f]")) + (skip-chars-backward " \t\r\n\f") + (unless (bobp) + (forward-char -1) + (py-beginning-of-expression-intern orig))) + ((and (eq (point) orig) (not (bobp)) (looking-back py-expression-re)) + (forward-char -1) + (when (< 0 (abs (skip-chars-backward py-expression-skip-chars))) + (py-beginning-of-expression-intern orig))) + ((and (looking-at py-expression-re) (not (looking-back "[ \t\r\n\f]"))) + (unless (< 0 (abs (skip-chars-backward py-expression-skip-chars))) + (py-beginning-of-expression-intern orig))) + ((and (eq (point) orig)(looking-back "[ \t]*=")) + (goto-char (match-beginning 0)) + (skip-chars-backward " \t\r\n\f") + (py-beginning-of-expression-intern orig))) + (unless (or (eq (point) orig)(looking-at "[ \t]*#")) + (setq erg (point))) + erg))) + +(defun py-end-of-expression (&optional arg) + "Go to the end of a compound python expression. + +With numeric ARG do it that many times. + +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 "p") + (or arg (setq arg 1)) + (let (erg) + (if (< 0 arg) + (save-restriction + (widen) + (while (< 0 arg) + (setq erg (py-end-of-expression-intern)) + (setq arg (1- arg)))) + (setq arg (abs arg)) + (setq erg (py-beginning-of-expression arg))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-end-of-expression-intern (&optional orig) + (unless (eobp) + (let* ((orig (or orig (point))) + (pps (syntax-ppss)) + erg + ;; use by scan-lists + parse-sexp-ignore-comments) + (cond + ((nth 1 pps) + (goto-char (nth 1 pps)) + (let ((parse-sexp-ignore-comments t)) + (forward-list)) + (unless (or (looking-at "[ \t]*$")(looking-at py-assignment-regexp)) + (py-end-of-expression-intern orig))) + ;; in comment + ((nth 4 pps) + (or (< (point) (progn (forward-comment 1)(point)))(forward-line 1)) + (py-end-of-expression-intern orig)) + ((and (bolp)(eolp)) + (while + (and (and (bolp)(eolp))(not (eobp))) + (forward-line 1)) + (py-end-of-expression-intern orig)) + ((looking-at (concat py-string-delim-re py-expression-re py-string-delim-re py-operator-regexp py-string-delim-re py-expression-re py-string-delim-re)) + (goto-char (match-end 0)) + (while (looking-at (concat py-operator-regexp py-string-delim-re py-expression-re py-string-delim-re)) + (goto-char (match-end 0)))) + ;; inside string + ((py-in-string-p) + (when (looking-at "\"\"\"\\|'''\\|\"\\|'") + (goto-char (match-end 0))) + (while + (nth 3 (syntax-ppss)) + (forward-char 1)) + ;; (if (looking-at ":") + ;; (forward-char 1) + (unless (looking-at "[ \t]*$") + (py-end-of-expression-intern orig))) + ((looking-at "[(\[]") + (forward-list) + ;; (if (looking-at ":") + ;; (forward-char 1) + (unless (looking-at "[ \t]*$") + (py-end-of-expression-intern orig))) + ;; ((looking-at ":") + ;; (forward-char 1) + ;; (unless (or (looking-at "[ \t]*$")(looking-at py-assignment-regexp)) + ;; (py-end-of-expression-intern orig))) + ((and (looking-at "[ \t]*#")(looking-back "^[ \t]*")) + (while (and (looking-at "[ \t]*#") (not (eobp))) + (forward-line 1)) + (py-end-of-expression-intern orig)) + ((looking-at py-assignment-regexp) + (goto-char (match-end 0)) + (if (looking-at "[(\[]") + (forward-list 1) + (py-end-of-expression-intern orig))) + ((looking-at (concat "[^ \t\n\r\f]+" py-delimiter-regexp)) + (goto-char (match-end 0)) + (while (looking-at (concat "[^ \t\n\r\f]+" py-delimiter-regexp)) + (goto-char (match-end 0))) + (forward-char -1) + (unless (looking-at (concat py-assignment-regexp "\\|[ \t]*$\\|" py-delimiter-regexp)) + (py-end-of-expression-intern orig))) + ((looking-at (concat "[ \t]*" "[^ (\t\n\r\f]+" py-operator-regexp "[^ \t\n\r\f]+")) + (goto-char (match-end 0)) + (while (looking-at (concat "[ \t]*" "[^ (\t]+" py-operator-regexp "[^ \t]+")) + (goto-char (match-end 0))) + (unless (or (looking-at "[ \t]*$")(looking-at py-assignment-regexp)) + (py-end-of-expression-intern orig))) + ((looking-at py-not-expression-regexp) + (skip-chars-forward py-not-expression-chars) + (unless (or (looking-at "[ \t]*$")(looking-at py-assignment-regexp)) + (py-end-of-expression-intern orig))) + ((looking-at py-expression-skip-regexp) + (skip-chars-forward py-expression-skip-chars) + (unless (or (looking-at "[ \n\t\r\f]*$")(looking-at py-assignment-regexp)) + (py-end-of-expression-intern orig))) + ;; ((looking-at ":") + ;; (forward-char 1)) + ) + (unless (or (eq (point) orig)(and (eobp)(bolp))) + (setq erg (point))) + erg))) + +;; Partial- or Minor Expression +(defalias 'py-backward-partial-expression 'py-beginning-of-partial-expression) +(defun py-beginning-of-partial-expression (&optional orig) + (interactive) + (let (erg) + (skip-chars-backward py-partial-expression-forward-chars) + (setq erg (point)) + (when (interactive-p) (message "%s" erg)) + erg)) + +(defalias 'py-forward-partial-expression 'py-end-of-partial-expression) +(defun py-end-of-partial-expression (&optional orig) + (interactive) + (let (erg) + (skip-chars-forward py-partial-expression-backward-chars) + ;; group arg + (and + (looking-at "[\[{(]") + (goto-char (scan-sexps (point) 1))) + (setq erg (point)) + (when (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 limit) + "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) + (save-restriction + (unless (bobp) + (let* ((orig (or orig (point))) + (this (point)) + (cui (current-indentation)) + + (pps (progn (goto-char this) + (parse-partial-sexp (or limit (point-min))(point)))) + (done done) + erg) + (cond + ((and (bolp)(eolp)) + (skip-chars-backward " \t\r\n\f") + (py-beginning-of-statement orig done limit)) + ((nth 8 pps) + (and (nth 3 pps) (setq done t)) + (goto-char (nth 8 pps)) + (py-beginning-of-statement orig done limit)) + ((nth 1 pps) + (goto-char (1- (nth 1 pps))) + (setq done t) + (py-beginning-of-statement orig done limit)) + ((py-preceding-line-backslashed-p) + (forward-line -1) + (back-to-indentation) + (setq done t) + (py-beginning-of-statement orig done limit)) + ((and (looking-at "[ \t]*#")(looking-back "^[ \t]*")) + (forward-comment -1) + (while (and (not (bobp)) (looking-at "[ \t]*#")(looking-back "^[ \t]*")) + (forward-comment -1)) + (unless (bobp) + (py-beginning-of-statement orig done limit))) + ((looking-at "[ \t]*#") + (skip-chars-backward (concat "^" comment-start) (line-beginning-position)) + (back-to-indentation) + (unless (bobp) + (py-beginning-of-statement orig done limit))) + ((and (not done) (looking-at py-string-delim-re)) + (when (< 0 (abs (skip-chars-backward " \t\r\n\f"))) + (setq done t)) + (back-to-indentation) + (py-beginning-of-statement orig done limit)) + ((and (not (eq (point) orig))(looking-back "^[ \t]*")) + (setq erg (point))) + ((and (not done) (not (eq 0 (skip-chars-backward " \t\r\n\f")))) + ;; (setq done t) + (py-beginning-of-statement orig done limit)) + ((not (eq (current-column) (current-indentation))) + (if (< 0 (abs (skip-chars-backward "^\t\r\n\f"))) + (progn + (setq done t) + (back-to-indentation) + (py-beginning-of-statement orig done limit)) + (back-to-indentation) + (setq done t) + (py-beginning-of-statement orig done limit)))) + (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)))) + +(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)) + +;;; Beginning of forms +(defun py-beginning-of-form-intern (regexp &optional iact indent orig lc) + "Go to beginning of FORM. + +With INDENT, go to beginning one level above. +Whit IACT, print result in message buffer. + +Returns beginning of FORM if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let (erg) + (unless (bobp) + (let* ((orig (or orig (point))) + (indent (or indent (progn + (back-to-indentation) + (or (py-beginning-of-statement-p) + (py-beginning-of-statement)) + (current-indentation))))) + (setq erg (cond ((and (< (point) orig) (looking-at (symbol-value regexp))) + (point)) + ((and (eq 0 (current-column)) (numberp indent) (< 0 indent)) + (when (< 0 (abs (skip-chars-backward " \t\r\n\f"))) + (py-beginning-of-statement) + (unless (looking-at (symbol-value regexp)) + (cdr (py-go-to-keyword (symbol-value regexp) (current-indentation)))))) + ;; indent from first beginning of clause matters + ;; ((not (looking-at py-extended-block-or-clause-re)) + ;; (py-go-to-keyword py-extended-block-or-clause-re indent) + ;; (if (looking-at (symbol-value regexp)) + ;; (setq erg (point)) + ;; (py-beginning-of-form-intern regexp iact (current-indentation) orig))) + ((numberp indent) + (ignore-errors + (cdr (py-go-to-keyword (symbol-value regexp) indent)))) + (t (ignore-errors + (cdr (py-go-to-keyword (symbol-value regexp) + (- (progn (if (py-beginning-of-statement-p) (current-indentation) (save-excursion (py-beginning-of-statement) (current-indentation)))) py-indent-offset))))))) + (when lc (beginning-of-line) (setq erg (point))))) + (when (and py-verbose-p iact) (message "%s" erg)) + erg)) + +(defun py--narrow-in-comint-modes (&optional done limit) + "In comint-modes, limit region to previous prompt. " + (let ((pos (point)) + (limit + (or limit + (and + (or (eq major-mode 'comint-mode)(eq major-mode 'inferior-python-mode)) + (if (re-search-backward comint-prompt-regexp nil t 1) + (match-end 0) + (error (format "py-beginning-of-statement: No prompt found in %s mode" major-mode))))))) + (and limit (not done) (goto-char (match-end 0)) (skip-chars-forward " \t") (narrow-to-region (point) pos)))) + +(defun py-beginning-of-prepare (indent final-re &optional inter-re iact lc) + (let ((orig (point)) + (indent + (or indent + (progn (back-to-indentation) + (or (py-beginning-of-statement-p) + (py-beginning-of-statement)) + (cond ((eq 0 (current-indentation)) + (current-indentation)) + ((looking-at (symbol-value inter-re)) + (current-indentation)) + (t + (if (<= py-indent-offset (current-indentation)) + (- (current-indentation) (if py-smart-indentation (py-guess-indent-offset) py-indent-offset)) + py-indent-offset)))))) + erg) + (if (and (< (point) orig) (looking-at (symbol-value final-re))) + (progn + (and lc (beginning-of-line)) + (setq erg (point)) + (when (and py-verbose-p iact) (message "%s" erg)) + erg) + (py-beginning-of-form-intern final-re iact indent orig lc)))) + +(defun py-beginning-of-block (&optional indent) + "Go to beginning block, skip whitespace at BOL. + +Returns beginning of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-block-re 'py-clause-re (interactive-p))) + +(defun py-beginning-of-clause (&optional indent) + "Go to beginning clause, skip whitespace at BOL. + +Returns beginning of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-extended-block-or-clause-re 'py-extended-block-or-clause-re (interactive-p))) + +(defun py-beginning-of-block-or-clause (&optional indent) + "Go to beginning block-or-clause, skip whitespace at BOL. + +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) + (py-beginning-of-prepare indent 'py-extended-block-or-clause-re 'py-extended-block-or-clause-re (interactive-p))) + +(defun py-beginning-of-def (&optional indent) + "Go to beginning def, skip whitespace at BOL. + +Returns beginning of def if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-def-re 'py-extended-block-or-clause-re (interactive-p))) + +(defun py-beginning-of-class (&optional indent) + "Go to beginning class, skip whitespace at BOL. + +Returns beginning of class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-class-re 'py-extended-block-or-clause-re (interactive-p))) + +(defun py-beginning-of-def-or-class (&optional indent) + "Go to beginning def-or-class, skip whitespace at BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. " + (interactive) + (py-beginning-of-prepare indent 'py-def-or-class-re 'py-extended-block-or-clause-re (interactive-p))) + +(defun py-beginning-of-if-block (&optional indent) + "Go to beginning if-block, skip whitespace at BOL. + +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) + (py-beginning-of-prepare indent 'py-if-block-re 'py-clause-re (interactive-p))) + +(defun py-beginning-of-try-block (&optional indent) + "Go to beginning try-block, skip whitespace at BOL. + +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) + (py-beginning-of-prepare indent 'py-try-block-re 'py-clause-re (interactive-p))) + +(defun py-beginning-of-minor-block (&optional indent) + "Go to beginning minor-block, skip whitespace at BOL. + +Returns beginning of minor-block if successful, nil otherwise +A minor block is started by a `for', `if', `try' or `with'. +" + (interactive) + (py-beginning-of-prepare indent 'py-minor-block-re 'py-clause-re (interactive-p))) + +(defalias 'py-beginning-of-block-bol 'py-beginning-of-block-lc) +(defun py-beginning-of-block-lc (&optional indent) + "Go to beginning block, go to BOL. + +Returns beginning of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-block-re 'py-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-clause-bol 'py-beginning-of-clause-lc) +(defun py-beginning-of-clause-lc (&optional indent) + "Go to beginning clause, go to BOL. + +Returns beginning of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-extended-block-or-clause-re 'py-extended-block-or-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-block-or-clause-bol 'py-beginning-of-block-or-clause-lc) +(defun py-beginning-of-block-or-clause-lc (&optional indent) + "Go to beginning block-or-clause, go to BOL. + +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) + (py-beginning-of-prepare indent 'py-extended-block-or-clause-re 'py-extended-block-or-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-def-bol 'py-beginning-of-def-lc) +(defun py-beginning-of-def-lc (&optional indent) + "Go to beginning def, go to BOL. + +Returns beginning of def if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-def-re 'py-extended-block-or-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-class-bol 'py-beginning-of-class-lc) +(defun py-beginning-of-class-lc (&optional indent) + "Go to beginning class, go to BOL. + +Returns beginning of class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-class-re 'py-extended-block-or-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-def-or-class-bol 'py-beginning-of-def-or-class-lc) +(defun py-beginning-of-def-or-class-lc (&optional indent) + "Go to beginning def-or-class, go to BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-prepare indent 'py-def-or-class-re 'py-extended-block-or-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-if-block-bol 'py-beginning-of-if-block-lc) +(defun py-beginning-of-if-block-lc (&optional indent) + "Go to beginning if-block, go to BOL. + +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) + (py-beginning-of-prepare indent 'py-if-block-re 'py-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-try-block-bol 'py-beginning-of-try-block-lc) +(defun py-beginning-of-try-block-lc (&optional indent) + "Go to beginning try-block, go to BOL. + +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) + (py-beginning-of-prepare indent 'py-try-block-re 'py-clause-re (interactive-p) t)) + +(defalias 'py-beginning-of-minor-block-bol 'py-beginning-of-minor-block-lc) +(defun py-beginning-of-minor-block-lc (&optional indent) + "Go to beginning minor-block, go to BOL. + +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) + (py-beginning-of-prepare indent 'py-minor-block-re 'py-clause-re (interactive-p) t)) + +;;; +(defun py-beginning-of-top-level () + "Go up to beginning of statments until level of indentation is null. + +Returns position if successful, nil otherwise " + (interactive) + (let (erg) + (unless (bobp) + (while (and (not (bobp)) (setq erg (py-beginning-of-statement)) + (< 0 (current-indentation)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-end-of-top-level () + "Go to end of top-level form at point. + +Returns position if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (let ((orig (point)) + erg) + (unless (eobp) + (unless (py-beginning-of-statement-p) + (py-beginning-of-statement)) + (unless (eq 0 (current-column)) + (py-beginning-of-top-level)) + (cond ((looking-at py-def-re) + (setq erg (py-end-of-def))) + ((looking-at py-class-re) + (setq erg (py-end-of-class))) + ((looking-at py-block-re) + (setq erg (py-end-of-block))) + (t (setq erg (py-end-of-statement)))) + (unless (< orig (point)) + (while (and (not (eobp)) (py-down-statement)(< 0 (current-indentation)))) + (if (looking-at py-block-re) + (setq erg (py-end-of-block)) + (setq erg (py-end-of-statement)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg))) + +(defun py-beginning () + "Go to beginning of compound statement or definition at point. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive) + (py-beginning-of-form-intern 'py-extended-block-or-clause-re (interactive-p))) + +(defun py-end (&optional indent) + "Go to end of of compound statement or definition at point. + +Returns position block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let* ((orig (point)) + (erg (py-end-base 'py-extended-block-or-clause-re orig))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-up (&optional indent) + "Go up or to beginning of form if inside. + +If inside a delimited form --string or list-- go to it's beginning. +If not at beginning of a statement or block, go to it's beginning. +If at beginning of a statement or block, go to beginning one level above of compound statement or definition at point. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let ((pps (syntax-ppss))) + (cond ((nth 8 pps) (goto-char (nth 8 pps))) + ((nth 1 pps) (goto-char (nth 1 pps))) + ((py-beginning-of-statement-p) (py-beginning-of-form-intern 'py-extended-block-or-clause-re (interactive-p))) + (t (py-beginning-of-statement))))) + +(defun py-down (&optional indent) + + "Go to beginning one level below of compound statement or definition at point. + +If no statement or block below, but a delimited form --string or list-- go to it's beginning. Repeated call from there will behave like down-list. + +Returns position if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let* ((orig (point)) + erg + (indent (if + (py-beginning-of-statement-p) + (current-indentation) + (progn + (py-beginning-of-statement) + (current-indentation)))) + last) + (while (and (setq last (point)) (py-end-of-statement) (py-end-of-statement) (py-beginning-of-statement) (eq (current-indentation) indent))) + (if (< indent (current-indentation)) + (setq erg (point)) + (goto-char last)) + (when (< (point) orig) + (goto-char orig)) + (when (and (eq (point) orig) + (progn (forward-char 1) + (skip-chars-forward "^\"'[({" (line-end-position)) + (member (char-after) (list ?\( ?\" ?\' ?\[ ?\{))) + (setq erg (point)))) + (unless erg + (goto-char orig)) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-end-of-block (&optional indent) + "Go to end of block. + +Returns end of block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let* ((orig (point)) + (erg (py-end-base 'py-block-re orig))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-end-of-clause (&optional indent) + "Go to end of clause. + +Returns end of clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let* ((orig (point)) + (erg (py-end-base 'py-clause-re orig))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-end-of-block-or-clause (&optional indent) + "Go to end of block-or-clause. + +Returns end of block-or-clause if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (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-end-of-def (&optional indent) + "Go to end of def. + +Returns end of def if successful, nil otherwise + +With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let* ((orig (point)) + (erg (py-end-base 'py-def-re orig))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-end-of-class (&optional indent) + "Go to end of class. + +Returns end of class if successful, nil otherwise + +With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let* ((orig (point)) + (erg (py-end-base 'py-class-re orig))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-end-of-def-or-class (&optional indent) + "Go to end of def-or-class. + +Returns end of def-or-class if successful, nil otherwise + +With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. " + (interactive "P") + (let* ((orig (point)) + (erg (py-end-base 'py-def-or-class-re orig))) + (when (and py-verbose-p (interactive-p)) + (message "%s" erg)) + erg)) + +(defun py-end-of-if-block (&optional indent) + "Go to end of if-block. + +Returns end of if-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (let* ((orig (point)) + (erg (py-end-base 'py-if-block-re orig))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-end-of-try-block (&optional indent) + "Go to end of try-block. + +Returns end of try-block if successful, nil otherwise + +Referring python program structures see for example: +http://docs.python.org/reference/compound_stmts.html" + (interactive "P") + (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-end-of-minor-block (&optional indent) + "Go to end of minor-block. + +Returns end of minor-block if successful, nil otherwise + +A minor block is started by a `for', `if', `try' or `with'. +" + (interactive "P") + (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) + +;;; Forms +;; 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)))) + +;; 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-go-to-keyword (regexp &optional maxindent) + "Returns a list, whose car is indentation, cdr position. " + (let ((orig (point)) + (maxindent (or maxindent (and (< 0 (current-indentation))(current-indentation)) + ;; make maxindent large enough if not set + (* 99 py-indent-offset))) + (first t) + done erg cui) + (while (and (not done) (not (bobp))) + (while (and (re-search-backward regexp nil 'move 1)(nth 8 (syntax-ppss)))) + ;; (or (< (point) orig) (py-beginning-of-statement)) + (if (and (looking-at regexp)(if maxindent + (<= (current-indentation) maxindent) t)) + (progn + (setq erg (point)) + (setq done t)) + (when (and first (not maxindent)) + (setq maxindent (current-indentation)) + (setq first nil)))) + (when erg (setq erg (cons (current-indentation) erg))) + erg)) + +(defun py-go-to-keyword-above (regexp &optional maxindent) + "Returns a list, whose car is indentation, cdr position. " + (let ((orig (point)) + (maxindent (or maxindent (and (< 0 (current-indentation))(current-indentation)) + ;; make maxindent large enough if not set + (* 99 py-indent-offset))) + (first t) + done erg cui) + (while (and (not done) (not (bobp))) + (py-beginning-of-statement) + (if (and (looking-at regexp)(if maxindent + (< (current-indentation) maxindent) t)) + (progn + (setq erg (point)) + (setq done t)) + (when (and first (not maxindent)) + (setq maxindent (current-indentation)) + (setq first nil)))) + (when erg + (if (looking-at regexp) + (setq erg (cons (current-indentation) erg)) + (setq erg nil + ))) + erg)) + +(defun py-eos-handle-comment-start () + (end-of-line) + (forward-comment 99999) + ;; (skip-chars-forward (concat "^" comment-start) (line-end-position)) + ;; (skip-chars-backward " \t\r\n\f" (line-beginning-position)) + ) + +(defun py-eos-handle-doublequoted-string-start (this) + "Internal use, find possible end of statement from string start. " + (when + (and (setq this (point)) (progn (while (and (not (eobp)) (search-forward (match-string-no-properties 0) nil t 1) (nth 8 (syntax-ppss)))) (< this (point)))) + (skip-chars-forward (concat "^" comment-start) (line-end-position)) + (skip-chars-backward " \t\r\n\f"))) + +(defun py-eos-handle-singlequoted-string-start (this) + "Internal use, find possible end of statement from string start. " + (when + (and (setq this (point)) (progn (ignore-errors (goto-char (scan-sexps (point) 1))) (< this (point)))) + (skip-chars-forward (concat "^" comment-start) (line-end-position)) + (skip-chars-backward " \t\r\n\f"))) + +(defun py-handle-eol () + (skip-chars-backward " \t\r\n\f" (line-beginning-position)) + (when (py-beginning-of-comment) + (skip-chars-backward " \t\r\n\f" (line-beginning-position)))) + +(defun py-eos-handle-string-start (this) + "Internal use, find possible end of statement from string start. " + (when + (and (setq this (point)) (progn (or (if (save-match-data (string-match "'" (match-string-no-properties 0))) (ignore-errors (goto-char (scan-sexps (point) 1)))) (while (and (search-forward (match-string-no-properties 0) nil t 1) (nth 8 (syntax-ppss))))) (< this (point)))) + (skip-chars-forward (concat "^" comment-start) (line-end-position)) + (skip-chars-backward " \t\r\n\f"))) + +(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--skip-to-comment-or-semicolon () + (and (< 0 (abs (skip-chars-forward "^#;" (line-end-position)))) + (if (eq ?\; (char-after)) + (skip-chars-forward ";" (line-end-position)) + (skip-chars-backward " \t" (line-beginning-position))) + (setq done t))) + +(defun py--eos-in-string () + "Return stm, i.e. if string is part of a (print)-statement. " + (let ((orig (point)) + pos stm) + (goto-char (nth 8 pps)) + (unless (looking-back "^[ \t]*") + (setq stm t)) + ;; go to end of string + (and (member (char-after) (list ?' ?\")) + (ignore-errors (setq pos (scan-sexps (point) 1))) + (goto-char pos)) + ;; if no closing string delimiter, pos doesn't exist + (unless (or stm (not pos)) + (setq done t) + (unless (eq 10 (char-after)) + (and (< 0 (abs (skip-chars-forward "^;#" (line-end-position)))) + (eq ?\; (char-after)) + (skip-chars-forward ";")))) + stm)) + +(defun py--end-of-comment-intern (pos) + (while (and (not (eobp)) + (forward-comment 99999))) + ;; forward-comment fails sometimes + (and (eq pos (point)) (prog1 (forward-line 1) (back-to-indentation)) + (while (member (char-after) (list ?# 10))(forward-line 1)(back-to-indentation)))) + +(defun py--end-of-statement-intern () + (py--skip-to-comment-or-semicolon) + (let ((pos (point)) + (pps (syntax-ppss)) + stm) + (cond ((nth 3 pps) + (and (py--eos-in-string) (py--end-of-statement-intern))) + ((nth 4 pps) + (py--end-of-comment-intern pos)) + ((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) + (skip-chars-forward "^#" (line-end-position)) + (skip-chars-backward " \t\r\n\f" (line-beginning-position)) + (py-end-of-statement orig done repeat)) + (goto-char orig))))))) + +(defun py-end-of-statement (&optional orig done repeat) + "Go to the last char of current statement. + +To go just beyond the final line of the current statement, use `py-down-statement-bol'. + +Optional argument REPEAT, the number of loops done already, is checked for py-max-specpdl-size error. Avoid eternal loops due to missing string delimters etc. " + (interactive) + (unless (eobp) + (let ((repeat (or (and repeat (1+ repeat)) 0)) + (orig (or orig (point))) + erg pos last + ;; use by scan-lists + parse-sexp-ignore-comments + forward-sexp-function + stringchar stm pps) + (unless done + (py--skip-to-comment-or-semicolon)) + (setq pps (syntax-ppss)) + ;; (origline (or origline (py-count-lines))) + (cond + ;; wich-function-mode, lp:1235375 + ((< py-max-specpdl-size repeat) + (error "py-end-of-statement reached loops max. If no error, customize `py-max-specpdl-size'")) + ;; list + ((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) + (skip-chars-forward "^#" (line-end-position)) + (skip-chars-backward " \t\r\n\f" (line-beginning-position)) + (py-end-of-statement orig done repeat)) + (goto-char orig)))) + ;; string + ((nth 3 pps) + (and (py--eos-in-string) (py--end-of-statement-intern)) + (setq pps (syntax-ppss)) + (unless (and done (not (or (nth 1 pps) (nth 8 pps)))) (py-end-of-statement orig t repeat))) + ;; in comment + ((nth 4 pps) + (py--end-of-comment-intern (point)) + (py--skip-to-comment-or-semicolon) + ;; (and (not done) + ;; (< 0 (abs (skip-chars-forward "^;#" (line-end-position)))) + ;; (or (and (eq ?\; (char-after)) + ;; (skip-chars-forward ";")) + ;; (skip-chars-backward " \t"))) + ;; travle backslashed lines + (while (and (eq (char-before (point)) ?\\ ) + (py-escaped)(setq last (point))) + (forward-line 1)(end-of-line)) + (and last (goto-char last) + (forward-line 1) + (back-to-indentation)) + (py-end-of-statement orig t repeat)) + ((py-current-line-backslashed-p) + (end-of-line) + (skip-chars-backward " \t\r\n\f" (line-beginning-position)) + (while (and (eq (char-before (point)) ?\\ ) + (py-escaped)) + (forward-line 1) + (end-of-line) + (skip-chars-backward " \t\r\n\f" (line-beginning-position))) + (unless (eobp) + (py-end-of-statement orig done repeat))) + ((eq (current-indentation) (current-column)) + (or (py--skip-to-comment-or-semicolon) + (forward-char 1)) + (setq pps (syntax-ppss)) + (unless done (py--end-of-statement-intern) + (py-end-of-statement orig done repeat))) + + ((eq orig (point)) + (skip-chars-forward " \t\r\n\f#'\"") + (py--skip-to-comment-or-semicolon) + (py--end-of-statement-intern) + (py-end-of-statement orig done repeat))) + (unless + (or + (eq (point) orig) + (member (char-before) (list 10 32 9))) + (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)))) + +;; 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 (and (bolp)(eolp)))(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))) + +(defun py--base (form &optional py-mark-decorators) + "Returns boundaries of FORM, a cons. " + (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))) + (and py-mark-decorators + (and (setq erg (py-beginning-of-decorator)) + (setq beg erg))) + (setq end (funcall endform)) + (unless end (when (< beg (point)) + (setq end (point)))) + (when (interactive-p) (message "%s %s" beg end)) + (cons beg end))) + +;;; Forms +(defun py-statement () + "Statement at point. + +Return code of `py-statement' at point, a string. " + (interactive) + (let ((erg (py--base "statement"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-top-level () + "Top-Level at point. + +Return code of `py-top-level' at point, a string. " + (interactive) + (let ((erg (py--base "top-level"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-block () + "Block at point. + +Return code of `py-block' at point, a string. " + (interactive) + (let ((erg (py--base "block"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-clause () + "Clause at point. + +Return code of `py-clause' at point, a string. " + (interactive) + (let ((erg (py--base "clause"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-block-or-clause () + "Block-Or-Clause at point. + +Return code of `py-block-or-clause' at point, a string. " + (interactive) + (let ((erg (py--base "block-or-clause"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-def () + "Def at point. + +Return code of `py-def' at point, a string. " + (interactive) + (let ((erg (py--base "def"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-class () + "Class at point. + +Return code of `py-class' at point, a string. " + (interactive) + (let ((erg (py--base "class"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-def-or-class () + "Def-Or-Class at point. + +Return code of `py-def-or-class' at point, a string. " + (interactive) + (let ((erg (py--base "def-or-class"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-expression () + "Expression at point. + +Return code of `py-expression' at point, a string. " + (interactive) + (let ((erg (py--base "expression"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-partial-expression () + "Partial-Expression at point. + +Return code of `py-partial-expression' at point, a string. " + (interactive) + (let ((erg (py--base "partial-expression"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +(defun py-minor-block () + "Minor-Block at point. + +Return code of `py-minor-block' at point, a string. " + (interactive) + (let ((erg (py--base "minor-block"))) + (buffer-substring-no-properties (car erg) (cdr erg)))) + +;;; Mark +(defun py-mark-base (form &optional py-mark-decorators) + "Calls py--base, returns bounds of form, a cons. " + (let* ((bounds (py--base form py-mark-decorators)) + (beg (car bounds))) + (push-mark beg t t) + bounds)) + +(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-minor-block () + "Mark minor-block at point. + +Returns beginning and end positions of marked area, a cons. " + (interactive) + (let (erg) + (setq erg (py-mark-base "minor-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-top-level () + "Mark top-level form at point. + +Returns beginning and end positions of marked area, a cons. " + (interactive) + (let (erg) + (setq erg (py-mark-base "top-level")) + (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)) + +;;; Copy + +(defun py-copy-statement () + "Copy statement at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "statement"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-top-level () + "Copy top-level at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "top-level"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-block () + "Copy block at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "block"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-clause () + "Copy clause at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "clause"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-block-or-clause () + "Copy block-or-clause at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "block-or-clause"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-def () + "Copy def at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "def"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-class () + "Copy class at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "class"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-def-or-class () + "Copy def-or-class at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "def-or-class"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-expression () + "Copy expression at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "expression"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-partial-expression () + "Copy partial-expression at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "partial-expression"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-copy-minor-block () + "Copy minor-block at point. + +Store data in kill ring, so it might yanked back. " + (interactive "*") + (let ((erg (py-mark-base "minor-block"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +;;; Delete +(defun py-delete-statement () + "Delete STATEMENT at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "statement"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-top-level () + "Delete TOP-LEVEL at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "top-level"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-block () + "Delete BLOCK at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "block"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-block-or-clause () + "Delete BLOCK-OR-CLAUSE at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "block-or-clause"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-def () + "Delete DEF at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "def"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-class () + "Delete CLASS at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "class"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-def-or-class () + "Delete DEF-OR-CLASS at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "def-or-class"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-expression () + "Delete EXPRESSION at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "expression"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-partial-expression () + "Delete PARTIAL-EXPRESSION at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base "partial-expression"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-delete-minor-block () + "Delete MINOR-BLOCK at point. + +Don't store data in kill ring. +A minor block is started by a `for', `if', `try' or `with'." + (interactive "*") + (let ((erg (py-mark-base "minor-block"))) + (delete-region (car erg) (cdr erg)))) + +;;; Kill +(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)))) + +(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)))) + +(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-top-level () + "Delete top-level form at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base "top-level"))) + (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-minor-block () + "Delete minor-block at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base "minor-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)))) + +(defalias 'py-kill-minor-expression 'py-kill-partial-expression) +;;; Beginning of line forms +(defun py-mark-base-bol (form &optional py-mark-decorators) + (let* ((begform (intern-soft (concat "py-beginning-of-" form "-bol"))) + (endform (intern-soft (concat "py-end-of-" form "-bol"))) + (begcheckform (intern-soft (concat "py-beginning-of-" form "-bol-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-bol)) + (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-beginning-of-block-bol-p () + "Returns position, if cursor is at the beginning of block, at beginning of line, nil otherwise. " + (interactive) + (let ((orig (point)) + (indent (current-indentation)) + erg) + (save-excursion + (py-end-of-block-bol) + (py-beginning-of-block-bol indent) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defalias 'py-down-block-lc 'py-end-of-block-bol) +(defun py-end-of-block-bol () + "Goto beginning of line following end of block. + Returns position reached, if successful, nil otherwise. + +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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-mark-block-bol () + "Mark block, take beginning of line positions. + +Returns beginning and end positions of region, a cons. " + (interactive) + (let (erg) + (setq erg (py-mark-base-bol "block")) + (exchange-point-and-mark) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-copy-block-bol () + "Delete block bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-kill-block-bol () + "Delete block bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (kill-region (car erg) (cdr erg)))) + +(defun py-delete-block-bol () + "Delete block bol at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-beginning-of-clause-bol-p () + "Returns position, if cursor is at the beginning of clause, at beginning of line, nil otherwise. " + (interactive) + (let ((orig (point)) + (indent (current-indentation)) + erg) + (save-excursion + (py-end-of-clause-bol) + (py-beginning-of-clause-bol indent) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defalias 'py-down-clause-lc 'py-end-of-clause-bol) +(defun py-end-of-clause-bol () + "Goto beginning of line following end of clause. + Returns position reached, if successful, nil otherwise. + +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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-mark-clause-bol () + "Mark clause, take beginning of line positions. + +Returns beginning and end positions of region, a cons. " + (interactive) + (let (erg) + (setq erg (py-mark-base-bol "clause")) + (exchange-point-and-mark) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-copy-clause-bol () + "Delete clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "clause"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-kill-clause-bol () + "Delete clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (kill-region (car erg) (cdr erg)))) + +(defun py-delete-clause-bol () + "Delete clause bol at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-beginning-of-block-or-clause-bol-p () + "Returns position, if cursor is at the beginning of block-or-clause, at beginning of line, nil otherwise. " + (interactive) + (let ((orig (point)) + (indent (current-indentation)) + erg) + (save-excursion + (py-end-of-block-or-clause-bol) + (py-beginning-of-block-or-clause-bol indent) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defalias 'py-down-block-or-clause-lc 'py-end-of-block-or-clause-bol) +(defun py-end-of-block-or-clause-bol () + "Goto beginning of line following end of block-or-clause. + Returns position reached, if successful, nil otherwise. + +See also `py-down-block-or-clause': down from current definition to next beginning of block-or-clause below. " + (interactive) + (let ((erg (py-end-of-block-or-clause))) + (when erg + (unless (eobp) + (forward-line 1) + (beginning-of-line) + (setq erg (point)))) + (when (interactive-p) (message "%s" erg)) + erg)) + +(defun py-mark-block-or-clause-bol () + "Mark block-or-clause, take beginning of line positions. + +Returns beginning and end positions of region, a cons. " + (interactive) + (let (erg) + (setq erg (py-mark-base-bol "block-or-clause")) + (exchange-point-and-mark) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-copy-block-or-clause-bol () + "Delete block-or-clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block-or-clause"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-kill-block-or-clause-bol () + "Delete block-or-clause bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (kill-region (car erg) (cdr erg)))) + +(defun py-delete-block-or-clause-bol () + "Delete block-or-clause bol at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-beginning-of-def-bol-p () + "Returns position, if cursor is at the beginning of def, at beginning of line, nil otherwise. " + (interactive) + (let ((orig (point)) + (indent (current-indentation)) + erg) + (save-excursion + (py-end-of-def-bol) + (py-beginning-of-def-bol indent) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defalias 'py-down-def-lc 'py-end-of-def-bol) +(defun py-end-of-def-bol () + "Goto beginning of line following end of def. + Returns position reached, if successful, nil otherwise. + +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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-mark-def-bol (&optional arg) + "Mark def, take beginning of line positions. + +With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. " + (interactive "P") + (let ((py-mark-decorators (or arg py-mark-decorators)) + erg) + (py-mark-base-bol "def" py-mark-decorators) + (exchange-point-and-mark) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-copy-def-bol () + "Delete def bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "def"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-kill-def-bol () + "Delete def bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (kill-region (car erg) (cdr erg)))) + +(defun py-delete-def-bol () + "Delete def bol at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-beginning-of-class-bol-p () + "Returns position, if cursor is at the beginning of class, at beginning of line, nil otherwise. " + (interactive) + (let ((orig (point)) + (indent (current-indentation)) + erg) + (save-excursion + (py-end-of-class-bol) + (py-beginning-of-class-bol indent) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defalias 'py-down-class-lc 'py-end-of-class-bol) +(defun py-end-of-class-bol () + "Goto beginning of line following end of class. + Returns position reached, if successful, nil otherwise. + +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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-mark-class-bol (&optional arg) + "Mark class, take beginning of line positions. + +With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. " + (interactive "P") + (let ((py-mark-decorators (or arg py-mark-decorators)) + erg) + (py-mark-base-bol "class" py-mark-decorators) + (exchange-point-and-mark) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-copy-class-bol () + "Delete class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "class"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-kill-class-bol () + "Delete class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (kill-region (car erg) (cdr erg)))) + +(defun py-delete-class-bol () + "Delete class bol at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-beginning-of-def-or-class-bol-p () + "Returns position, if cursor is at the beginning of def-or-class, at beginning of line, nil otherwise. " + (interactive) + (let ((orig (point)) + (indent (current-indentation)) + erg) + (save-excursion + (py-end-of-def-or-class-bol) + (py-beginning-of-def-or-class-bol indent) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defalias 'py-down-def-or-class-lc 'py-end-of-def-or-class-bol) +(defun py-end-of-def-or-class-bol () + "Goto beginning of line following end of def-or-class. + Returns position reached, if successful, nil otherwise. + +See also `py-down-def-or-class': down from current definition to next beginning of def-or-class below. " + (interactive) + (let ((erg (py-end-of-def-or-class))) + (when erg + (unless (eobp) + (forward-line 1) + (beginning-of-line) + (setq erg (point)))) + (when (interactive-p) (message "%s" erg)) + erg)) + +(defun py-mark-def-or-class-bol (&optional arg) + "Mark def-or-class, take beginning of line positions. + +With \\[universal argument] or `py-mark-decorators' set to `t', decorators are marked too. +Returns beginning and end positions of region, a cons. " + (interactive "P") + (let ((py-mark-decorators (or arg py-mark-decorators)) + erg) + (py-mark-base-bol "def-or-class" py-mark-decorators) + (exchange-point-and-mark) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-copy-def-or-class-bol () + "Delete def-or-class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "def-or-class"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-kill-def-or-class-bol () + "Delete def-or-class bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (kill-region (car erg) (cdr erg)))) + +(defun py-delete-def-or-class-bol () + "Delete def-or-class bol at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (delete-region (car erg) (cdr erg)))) + +(defun py-beginning-of-statement-bol-p () + "Returns position, if cursor is at the beginning of statement, at beginning of line, nil otherwise. " + (interactive) + (let ((orig (point)) + (indent (current-indentation)) + erg) + (save-excursion + (py-end-of-statement-bol) + (py-beginning-of-statement-bol indent) + (when (eq orig (point)) + (setq erg orig)) + erg))) + +(defalias 'py-beginning-of-statement-lc 'py-beginning-of-statement-bol) +(defun py-beginning-of-statement-bol (&optional indent) + "Goto beginning of line where statement starts. + Returns position reached, if successful, nil otherwise. + +See also `py-up-statement': up from current definition to next beginning of statement above. " + (interactive) + (let* ((indent (or indent (when (eq 'py-end-of-statement-bol (car py-bol-forms-last-indent))(cdr py-bol-forms-last-indent)))) + erg) + (if indent + (while (and (setq erg (py-beginning-of-statement)) (< indent (current-indentation))(not (bobp)))) + (setq erg (py-beginning-of-statement))) + ;; reset + (setq py-bol-forms-last-indent nil) + (when erg + (unless (eobp) + (beginning-of-line) + (setq erg (point)))) + (when (interactive-p) (message "%s" erg)) + erg)) + +(defalias 'py-down-statement-lc 'py-end-of-statement-bol) +(defun py-end-of-statement-bol () + "Goto beginning of line following end of statement. + Returns position reached, if successful, nil otherwise. + +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 (interactive-p) (message "%s" erg)) + erg)) + +(defun py-mark-statement-bol () + "Mark statement, take beginning of line positions. + +Returns beginning and end positions of region, a cons. " + (interactive) + (let (erg) + (setq erg (py-mark-base-bol "statement")) + (exchange-point-and-mark) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-copy-statement-bol () + "Delete statement bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "statement"))) + (copy-region-as-kill (car erg) (cdr erg)))) + +(defun py-kill-statement-bol () + "Delete statement bol at point. + +Stores data in kill ring. Might be yanked back using `C-y'. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (kill-region (car erg) (cdr erg)))) + +(defun py-delete-statement-bol () + "Delete statement bol at point. + +Don't store data in kill ring. " + (interactive "*") + (let ((erg (py-mark-base-bol "block"))) + (delete-region (car erg) (cdr erg)))) + +;;; Up/Down +(defun py-up-statement () + "Go to the beginning of next statement upwards in buffer. + +Return position if statement found, nil otherwise. " + (interactive) + (let ((orig (point)) + erg) + (if (py-beginning-of-statement-p) + (setq erg (py-beginning-of-statement)) + (setq erg (and (py-beginning-of-statement) (py-beginning-of-statement)))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-down-statement () + "Go to the beginning of next statement downwards in buffer. + +Return position if statement found, nil otherwise. " + (interactive) + (let* ((orig (point)) + (erg + (cond ((py-end-of-statement-p) + (and (py-end-of-statement) (py-beginning-of-statement))) + ((ignore-errors (< orig (progn (py-end-of-statement) (py-beginning-of-statement)))) + (point)) + (t (goto-char orig) (and (py-end-of-statement) (py-end-of-statement)(py-beginning-of-statement)))))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-up-base (regexp) + "Go to the beginning of next form upwards in buffer. + +Return position if form found, nil otherwise. " + (let* ((orig (point)) + erg) + (if (bobp) + (setq erg nil) + (while (and (re-search-backward regexp nil t 1) + (nth 8 (syntax-ppss)))) + (back-to-indentation) + (when (looking-at regexp) (setq erg (point))) + (when py-verbose-p (message "%s" erg)) + erg))) + +(defun py-down-base (regexp) + "Go to the beginning of next form below in buffer. + +Return position if form found, nil otherwise. " + (unless (eobp) + (forward-line 1) + (beginning-of-line) + (let* ((orig (point)) + erg) + (if (eobp) + (setq erg nil) + (while (and (re-search-forward regexp nil 'move 1) + (nth 8 (syntax-ppss)))) + (back-to-indentation) + (when (looking-at regexp) (setq erg (point))) + (when py-verbose-p (message "%s" erg)) + erg)))) + +(defun py-up-base-bol (regexp) + "Go to the beginning of next form upwards in buffer. + +Return position if form found, nil otherwise. " + (let* ((orig (point)) + erg) + (if (bobp) + (setq erg nil) + (while (and (re-search-backward regexp nil t 1) + (nth 8 (syntax-ppss)))) + (beginning-of-line) + (when (looking-at regexp) (setq erg (point))) + (when py-verbose-p (message "%s" erg)) + erg))) + +(defun py-down-base-bol (regexp) + "Go to the beginning of next form below in buffer. + +Return position if form found, nil otherwise. " + (unless (eobp) + (forward-line 1) + (beginning-of-line) + (let* ((orig (point)) + erg) + (if (eobp) + (setq erg nil) + (while (and (re-search-forward regexp nil t 1) + (nth 8 (syntax-ppss)))) + (beginning-of-line) + (when (looking-at regexp) (setq erg (point))) + (when py-verbose-p (message "%s" erg)) + erg)))) + +(defun py-up-block () + "Go to the beginning of next block upwards in buffer. + +Return position if block found, nil otherwise. " + (interactive) + (py-up-base py-block-re)) + +(defun py-up-minor-block () + "Go to the beginning of next minor-block upwards in buffer. + +Return position if minor-block found, nil otherwise. " + (interactive) + (py-up-base py-minor-block-re)) + +(defun py-up-clause () + "Go to the beginning of next clause upwards in buffer. + +Return position if clause found, nil otherwise. " + (interactive) + (py-up-base py-clause-re)) + +(defun py-up-block-or-clause () + "Go to the beginning of next block-or-clause upwards in buffer. + +Return position if block-or-clause found, nil otherwise. " + (interactive) + (py-up-base py-block-or-clause-re)) + +(defun py-up-def () + "Go to the beginning of next def upwards in buffer. + +Return position if def found, nil otherwise. " + (interactive) + (py-up-base py-def-re)) + +(defun py-up-class () + "Go to the beginning of next class upwards in buffer. + +Return position if class found, nil otherwise. " + (interactive) + (py-up-base py-class-re)) + +(defun py-up-def-or-class () + "Go to the beginning of next def-or-class upwards in buffer. + +Return position if def-or-class found, nil otherwise. " + (interactive) + (py-up-base py-def-or-class-re)) + +(defun py-down-block () + "Go to the beginning of next block below in buffer. + +Return position if block found, nil otherwise. " + (interactive) + (py-down-base py-block-re)) + +(defun py-down-minor-block () + "Go to the beginning of next minor-block below in buffer. + +Return position if minor-block found, nil otherwise. " + (interactive) + (py-down-base py-minor-block-re)) + +(defun py-down-clause () + "Go to the beginning of next clause below in buffer. + +Return position if clause found, nil otherwise. " + (interactive) + (py-down-base py-clause-re)) + +(defun py-down-block-or-clause () + "Go to the beginning of next block-or-clause below in buffer. + +Return position if block-or-clause found, nil otherwise. " + (interactive) + (py-down-base py-block-or-clause-re)) + +(defun py-down-def () + "Go to the beginning of next def below in buffer. + +Return position if def found, nil otherwise. " + (interactive) + (py-down-base py-def-re)) + +(defun py-down-class () + "Go to the beginning of next class below in buffer. + +Return position if class found, nil otherwise. " + (interactive) + (py-down-base py-class-re)) + +(defun py-down-def-or-class () + "Go to the beginning of next def-or-class below in buffer. + +Return position if def-or-class found, nil otherwise. " + (interactive) + (py-down-base py-def-or-class-re)) + +(defun py-up-block-bol () + "Go to the beginning of next block upwards in buffer. + +Go to beginning of line. +Return position if block found, nil otherwise. " + (interactive) + (py-up-base-bol py-block-re)) + +(defun py-up-minor-block-bol () + "Go to the beginning of next minor-block upwards in buffer. + +Go to beginning of line. +Return position if minor-block found, nil otherwise. " + (interactive) + (py-up-base-bol py-minor-block-re)) + +(defun py-up-clause-bol () + "Go to the beginning of next clause upwards in buffer. + +Go to beginning of line. +Return position if clause found, nil otherwise. " + (interactive) + (py-up-base-bol py-clause-re)) + +(defun py-up-block-or-clause-bol () + "Go to the beginning of next block-or-clause upwards in buffer. + +Go to beginning of line. +Return position if block-or-clause found, nil otherwise. " + (interactive) + (py-up-base-bol py-block-or-clause-re)) + +(defun py-up-def-bol () + "Go to the beginning of next def upwards in buffer. + +Go to beginning of line. +Return position if def found, nil otherwise. " + (interactive) + (py-up-base-bol py-def-re)) + +(defun py-up-class-bol () + "Go to the beginning of next class upwards in buffer. + +Go to beginning of line. +Return position if class found, nil otherwise. " + (interactive) + (py-up-base-bol py-class-re)) + +(defun py-up-def-or-class-bol () + "Go to the beginning of next def-or-class upwards in buffer. + +Go to beginning of line. +Return position if def-or-class found, nil otherwise. " + (interactive) + (py-up-base-bol py-def-or-class-re)) + +(defun py-down-block-bol () + "Go to the beginning of next block below in buffer. + +Go to beginning of line +Return position if block found, nil otherwise " + (interactive) + (py-down-base-bol py-block-re)) + +(defun py-down-minor-block-bol () + "Go to the beginning of next minor-block below in buffer. + +Go to beginning of line +Return position if minor-block found, nil otherwise " + (interactive) + (py-down-base-bol py-minor-block-re)) + +(defun py-down-clause-bol () + "Go to the beginning of next clause below in buffer. + +Go to beginning of line +Return position if clause found, nil otherwise " + (interactive) + (py-down-base-bol py-clause-re)) + +(defun py-down-block-or-clause-bol () + "Go to the beginning of next block-or-clause below in buffer. + +Go to beginning of line +Return position if block-or-clause found, nil otherwise " + (interactive) + (py-down-base-bol py-block-or-clause-re)) + +(defun py-down-def-bol () + "Go to the beginning of next def below in buffer. + +Go to beginning of line +Return position if def found, nil otherwise " + (interactive) + (py-down-base-bol py-def-re)) + +(defun py-down-class-bol () + "Go to the beginning of next class below in buffer. + +Go to beginning of line +Return position if class found, nil otherwise " + (interactive) + (py-down-base-bol py-class-re)) + +(defun py-down-def-or-class-bol () + "Go to the beginning of next def-or-class below in buffer. + +Go to beginning of line +Return position if def-or-class found, nil otherwise " + (interactive) + (py-down-base-bol py-def-or-class-re)) + +;; 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-verbose-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)) + +(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-beginning-of-block-current-column () + "Reach next beginning of block upwards which starts at current column. + +Return position" + (interactive) + (let* ((orig (point)) + (cuco (current-column)) + (str (make-string cuco ?\s)) + pps erg) + (while (and (not (bobp))(re-search-backward (concat "^" str py-block-keywords) nil t)(or (nth 8 (setq pps (syntax-ppss))) (nth 1 pps)))) + (back-to-indentation) + (and (< (point) orig)(setq erg (point))) + (when (and py-verbose-p (interactive-p)) (message "%s" erg)) + erg)) + +(defun py-travel-current-indent (indent &optional orig) + "Moves down until clause is closed, i.e. current indentation is reached. + +Takes a list, INDENT and START position. " + (unless (eobp) + (let ((orig (or orig (point))) + last) + (while (and (setq last (point))(not (eobp))(py-end-of-statement) + (save-excursion (or (<= indent (progn (py-beginning-of-statement)(current-indentation)))(eq last (line-beginning-position)))) + (py-end-of-statement-p))) + (goto-char last) + (when (< orig last) + last)))) + +(defalias 'iyp 'ipython) +(defalias 'ipy 'ipython) +;;; Python named shells +(defun python (&optional argprompt) + "Start an Python interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Python interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "python")) + +(defun ipython (&optional argprompt) + "Start an IPython interpreter. + +Optional \\[universal-argument] prompts for options to pass to the IPython interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "ipython")) + +(defun python3 (&optional argprompt) + "Start an Python3 interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Python3 interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "python3")) + +(defun python2 (&optional argprompt) + "Start an Python2 interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Python2 interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "python2")) + +(defun python2.7 (&optional argprompt) + "Start an Python2.7 interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Python2.7 interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "python2.7")) + +(defun jython (&optional argprompt) + "Start an Jython interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Jython interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "jython")) + +(defun python3.2 (&optional argprompt) + "Start an Python3.2 interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Python3.2 interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "python3.2")) + +(defun python3.3 (&optional argprompt) + "Start an Python3.3 interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "python3.3")) + +(defun python3.4 (&optional argprompt) + "Start an Python3.3 interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "python3.4")) + +(defun bpython (&optional argprompt) + "Start an Bpython interpreter. + +Optional \\[universal-argument] prompts for options to pass to the Bpython interpreter. See `py-python-command-args'. " + (interactive "P") + (py-shell argprompt nil "bpython")) + +;; 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") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "python"))) + +(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") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "ipython"))) + +(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") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "python3"))) + +(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") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "python2"))) + +(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") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "python2.7"))) + +(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") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "jython"))) + +(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") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "python3.2"))) + +(defun python3.3-dedicated (&optional argprompt switch) + "Start an unique Python3.3 interpreter in another window. + +Optional \\[universal-argument] prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'." + (interactive "P") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "python3.3"))) + +(defun bpython-dedicated (&optional argprompt switch) + "Start an unique Bpython interpreter in another window. + +Optional \\[universal-argument] prompts for options to pass to the Bpython interpreter. See `py-python-command-args'." + (interactive "P") + (let ((py-dedicated-process-p t)) + (py-shell argprompt t "bpython"))) + +;; switch +(defun python-switch (&optional argprompt) + "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") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "python"))) + +(defun ipython-switch (&optional argprompt) + "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") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "ipython"))) + +(defun python3-switch (&optional argprompt) + "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") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "python3"))) + +(defun python2-switch (&optional argprompt) + "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") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "python2"))) + +(defun python2.7-switch (&optional argprompt) + "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") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "python2.7"))) + +(defun jython-switch (&optional argprompt) + "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") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "jython"))) + +(defun python3.2-switch (&optional argprompt) + "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") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "python3.2"))) + +(defun python3.3-switch (&optional argprompt) + "Switch to Python3.3 interpreter in another window. + +Optional \\[universal-argument] prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'." + (interactive "P") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "python3.3"))) + +(defun bpython-switch (&optional argprompt) + "Switch to Bpython interpreter in another window. + +Optional \\[universal-argument] prompts for options to pass to the Bpython interpreter. See `py-python-command-args'." + (interactive "P") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell argprompt nil "bpython"))) + +;; no-switch +(defun python-no-switch (&optional argprompt) + "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") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "python"))) + +(defun ipython-no-switch (&optional argprompt) + "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") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "ipython"))) + +(defun python3-no-switch (&optional argprompt) + "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") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "python3"))) + +(defun python2-no-switch (&optional argprompt) + "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") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "python2"))) + +(defun python2.7-no-switch (&optional argprompt) + "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") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "python2.7"))) + +(defun jython-no-switch (&optional argprompt) + "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") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "jython"))) + +(defun python3.2-no-switch (&optional argprompt) + "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") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "python3.2"))) + +(defun python3.3-no-switch (&optional argprompt) + "Open an Python3.3 interpreter in another window, but do not switch to it. + +Optional \\[universal-argument] prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'." + (interactive "P") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "python3.3"))) + +(defun bpython-no-switch (&optional argprompt) + "Open an Bpython interpreter in another window, but do not switch to it. + +Optional \\[universal-argument] prompts for options to pass to the Bpython interpreter. See `py-python-command-args'." + (interactive "P") + (let (py-switch-buffers-on-execute-p) + (py-shell argprompt nil "bpython"))) + +;; dedicated switch +(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") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "python"))) + +(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") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "ipython"))) + +(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") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "python3"))) + +(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") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "python2"))) + +(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") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "python2.7"))) + +(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") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "jython"))) + +(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") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "python3.2"))) + +(defalias 'python3.3-dedicated-switch 'python3.3-switch-dedicated) +(defun python3.3-switch-dedicated (&optional argprompt) + "Switch to an unique Python3.3 interpreter in another window. + +Optional \\[universal-argument] prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'." + (interactive "P") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "python3.3"))) + +(defalias 'bpython-dedicated-switch 'bpython-switch-dedicated) +(defun bpython-switch-dedicated (&optional argprompt) + "Switch to an unique Bpython interpreter in another window. + +Optional \\[universal-argument] prompts for options to pass to the Bpython interpreter. See `py-python-command-args'." + (interactive "P") + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell argprompt t "bpython"))) + + +;;; +(defalias 'Python 'python) +(defalias 'Python2 'python2) +(defalias 'Python3 'python3) +(defalias 'IPython 'ipython) +(defalias 'Ipython 'ipython) +;;; Code execution +(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 (interactive-p) (message "%s" (prin1-to-string cmd))) + cmd)) + +(defun py-execute-region-no-switch (start end) + "Send the region to a Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p', buffer with region stays current. + " + (interactive "r") + (let (py-switch-buffers-on-execute-p) + (py-execute-base start end))) + +(defun py-execute-region-switch (start end) + "Send the region to a Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p', output-buffer will being switched to. +" + (interactive "r") + (let ((py-switch-buffers-on-execute-p t)) + (py-execute-base start end))) + +(defun py-execute-region (start end &optional shell dedicated) + "Send the region to a Python interpreter. + +When called with \\[universal-argument], execution through `default-value' of `py-shell-name' is forced. +When called with \\[universal-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 DEDICATED (boolean) +" + (interactive "r\nP") + (save-excursion + (let ((py-shell-name (cond ((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-dedicated-process-p (or dedicated py-dedicated-process-p))) + (py-execute-base start end)))) + +(defun py-execute-region-default (start end) + "Send the region to the systems default Python interpreter. " + (interactive "r") + (let ((py-dedicated-process-p (default-value 'py-dedicated-process-p)) + (py-shell-name (default-value 'py-shell-name))) + (py-execute-base start end))) + +(defun py-execute-region-dedicated (start end &optional shell) + "Get the region processed by an unique Python interpreter. + +When called with \\[universal-argument], execution through `default-value' of `py-shell-name' is forced. +When called with \\[universal-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 ((py-shell-name (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-dedicated-process-p t)) + (py-execute-base start end))) + +(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") + (let ((py-dedicated-process-p t)) + (py-execute-base start end (default-value 'py-shell-name)))) + +(defun py-delete-temporary (&optional file localname filebuf) + (when (file-readable-p file) + (delete-file file)) + (when (buffer-live-p filebuf) + (set-buffer filebuf) + (set-buffer-modified-p 'nil) + (kill-buffer filebuf)) + (when (buffer-live-p localname) + (kill-buffer localname))) + +(defun py-execute-buffer-finally (start end execute-directory wholebuf) + (let* ((strg (buffer-substring-no-properties start end)) + (temp (make-temp-name + (concat (replace-regexp-in-string py-separator-char "-" (replace-regexp-in-string (concat "^" py-separator-char) "" (replace-regexp-in-string ":" "-" py-shell-name))) "-"))) + (tempfile (concat (expand-file-name py-temp-directory) py-separator-char (replace-regexp-in-string py-separator-char "-" temp) ".py")) + (tempbuf (get-buffer-create temp)) + (wholebuf (when (boundp 'wholebuf) wholebuf)) + erg err-p lineadd output-buffer) + ;; (message "%s" strg) + (set-buffer tempbuf) + (erase-buffer) + (unless py-if-name-main-permission-p + (setq strg (replace-regexp-in-string + "if[( ]*__name__[) ]*==[( ]*['\"]\\{1,3\\}__main__['\"]\\{1,3\\}[) ]*:" + ;; space after __main__, i.e. will not be executed + "if __name__ == '__main__ ':" strg))) + (insert strg) + (py-fix-start (point-min)(point-max)) + (set-buffer tempbuf) + (write-region (point-min) (point-max) tempfile nil t nil 'ask) + (set-buffer-modified-p 'nil) + (unwind-protect + (setq erg (py-execute-file-base proc tempfile nil py-buffer-name py-orig-buffer-or-file execute-directory)) + (sit-for 0.1) + (and (or py-debug-p py-cleanup-temporary) + (py-delete-temporary tempfile tempbuf))) + (and erg (or py-debug-p py-store-result-p) (unless (string= (car kill-ring) erg) (kill-new erg))) + erg)) + +(defun py-execute-python-mode-v5 (start end) + (interactive "r") + (let ((py-exception-buffer (current-buffer)) + (pcmd (concat py-shell-name (if (string-equal py-which-bufname + "Jython") + " -" + ;; " -c " + "")))) + (save-excursion + (shell-command-on-region start end + pcmd py-output-buffer)) + (if (not (get-buffer py-output-buffer)) + (message "No output.") + + (let* ((err-p (py-postprocess-output-buffer py-output-buffer)) + (line (cadr err-p))) + (if err-p + (when (and py-jump-on-exception line) + (pop-to-buffer py-exception-buffer)) + (pop-to-buffer py-output-buffer) + (goto-char (point-max)) + (copy-marker (point))))))) + +(defun py-execute-ge24.3 (start end file execute-directory &optional py-exception-buffer proc) + "An alternative way to do it. + +May we get rid of the temporary file? " + (and (buffer-file-name) buffer-offer-save (buffer-modified-p) (y-or-n-p "Save buffer before executing? ") + (write-file (buffer-file-name))) + (let* ((start (copy-marker start)) + (end (copy-marker end)) + (py-exception-buffer (or py-exception-buffer (current-buffer))) + (line (count-lines (point-min) (if (eq start (line-beginning-position)) (1+ start) start))) + (strg (buffer-substring-no-properties start end)) + (tempfile (or (buffer-file-name) (concat (expand-file-name py-temp-directory) py-separator-char (replace-regexp-in-string py-separator-char "-" "temp") ".py"))) + + (proc (or proc (if py-dedicated-process-p + (get-buffer-process (py-shell nil py-dedicated-process-p py-shell-name py-buffer-name t)) + (or (get-buffer-process py-buffer-name) + (get-buffer-process (py-shell nil py-dedicated-process-p py-shell-name py-buffer-name t)))))) + (procbuf (process-buffer proc)) + (file (or file (with-current-buffer py-buffer-name + (concat (file-remote-p default-directory) tempfile)))) + (filebuf (get-buffer-create file)) + err-p) + (set-buffer filebuf) + (erase-buffer) + (newline line) + (save-excursion + (insert strg)) + (py-fix-start (point) (point-max)) + (unless (string-match "[jJ]ython" py-shell-name) + (when (and execute-directory py-use-current-dir-when-execute-p + (not (string= execute-directory default-directory))) + (message "Warning: options `execute-directory' and `py-use-current-dir-when-execute-p' may conflict")) + (and execute-directory + (process-send-string proc (concat "import os; os.chdir(\"" execute-directory "\")\n")) + ;; (py-send-string-no-output (concat "import os; os.chdir(\"" execute-directory "\")\n") proc) + )) + (set-buffer filebuf) + (process-send-string proc + (buffer-substring-no-properties + (point-min) (point-max))) + (sit-for 0.1) + (if (and (setq err-p (save-excursion (py-postprocess-output-buffer procbuf))) + (car err-p) + (not (markerp err-p))) + (py-jump-to-exception err-p) + (py-shell-manage-windows procbuf py-buffer-name) + (unless (string= (buffer-name (current-buffer)) (buffer-name procbuf)) + (when py-verbose-p (message "Output buffer: %s" procbuf)))))) + +(defun py-execute-base (&optional start end shell filename proc file wholebuf) + "Select the handler. + +When optional FILE is `t', no temporary file is needed. " + (let* ((start (or start (and (use-region-p) (region-beginning)) (point-min))) + (end (or end (and (use-region-p) (region-end)) (point-max))) + (wholebuf (unless file (or wholebuf (and (eq (buffer-size) (- end start)))))) + (windows-config (window-configuration-to-register 313465889)) + (origline + (save-restriction + (widen) + (count-lines + (point-min) + ;; count-lines doesn't honor current line when at BOL + end))) + (py-shell-name (or shell (py-choose-shell))) + (py-exception-buffer (current-buffer)) + (execute-directory + (cond ((ignore-errors (file-name-directory (file-remote-p (buffer-file-name) 'localname)))) + ((and py-use-current-dir-when-execute-p (buffer-file-name)) + (file-name-directory (buffer-file-name))) + ((and py-use-current-dir-when-execute-p + py-fileless-buffer-use-default-directory-p) + (expand-file-name default-directory)) + ((stringp py-execute-directory) + py-execute-directory) + ((getenv "VIRTUAL_ENV")) + (t (getenv "HOME")))) + (py-buffer-name (or py-buffer-name (py-buffer-name-prepare))) + (filename (or (and filename (expand-file-name filename)) (and (not (buffer-modified-p)) (buffer-file-name)))) + (py-orig-buffer-or-file (or filename (current-buffer))) + (proc (or proc (if py-dedicated-process-p + (get-buffer-process (py-shell nil py-dedicated-process-p py-shell-name py-buffer-name t)) + (or (and (boundp 'py-buffer-name) (get-buffer-process py-buffer-name)) + (get-buffer-process (py-shell nil py-dedicated-process-p py-shell-name (and (boundp 'py-buffer-name) py-buffer-name) t)))))) + err-p) + (set-buffer py-exception-buffer) + (py-update-execute-directory proc py-buffer-name execute-directory) + (cond (;; enforce proceeding as python-mode.el v5 + python-mode-v5-behavior-p + (py-execute-python-mode-v5 start end)) + (py-execute-no-temp-p + (py-execute-ge24.3 start end filename execute-directory py-exception-buffer proc)) + ;; No need for a temporary filename than + ((and filename wholebuf) + (py-execute-file-base proc filename nil py-buffer-name filename execute-directory)) + (t + ;; (message "%s" (current-buffer)) + (py-execute-buffer-finally start end execute-directory wholebuf))))) + +(defun py-execute-string (&optional string shell) + "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)))) + +(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))) + (py-dedicated-process-p t)) + (with-temp-buffer + (insert string) + (py-execute-region (point-min) (point-max) shell)))) + +(defun py-if-needed-insert-shell () + (let ((erg (or (py-choose-shell-by-shebang) + (py-choose-shell-by-import) + py-shell-name))) + (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 (and (bolp)(eolp)) (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) + (when (looking-at "[^/\n\r]+") + (replace-match "#! "))) + (if (string-match py-separator-char erg) + (insert (concat "#! " erg "\n")) + (insert (concat py-shebang-startstring " " erg "\n"))))))) + +(defun py-insert-execute-directory (directory &optional orig done) + (let ((orig (or orig (point))) + (done done)) + (if done (goto-char done) (goto-char (point-min))) + (cond ((re-search-forward "^from __future__ import " nil t 1) + (py-end-of-statement) + (setq done (point)) + (py-insert-execute-directory directory orig done)) + ((re-search-forward py-encoding-string-re nil t 1) + (setq done (point)) + (py-insert-execute-directory directory orig done)) + ((re-search-forward py-shebang-regexp nil t 1) + (setq done (point)) + (py-insert-execute-directory directory orig done)) + (t (forward-line 1) + (unless (and (bolp)(eolp)) (newline)) + (insert (concat "import os; os.chdir(\"" directory "\")\n")))))) + +(defun py-insert-coding () + (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. " + (python-mode) + (goto-char start) + (while (and (bolp)(eolp)) + (delete-region (line-beginning-position) (1+ (line-end-position)))) + (back-to-indentation) + (unless (py-beginning-of-statement-p) + (py-down-statement)) + (while (not (eq (current-indentation) 0)) + (py-shift-left py-indent-offset start end)) + (goto-char (point-max)) + (unless (and (bolp)(eolp)) + (newline))) + +(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) + "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 + (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))) + (let ((py-shell-name (or shell (py-choose-shell argprompt shell))) + (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 py-dedicated-process-p shell (or shell (default-value 'py-shell-name)) t))))) + ;; 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)))) + +(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 () + "Send the contents of the buffer to a unique Python interpreter. " + (interactive) + (let ((py-dedicated-process-p t)) + (py-execute-buffer-base))) + +(defun py-execute-buffer-switch () + "Send the contents of the buffer to a Python interpreter and switches to output. " + (interactive) + (let ((py-switch-buffers-on-execute-p t)) + (py-execute-buffer-base))) + +(defalias 'py-execute-buffer-switch-dedicated 'py-execute-buffer-dedicated-switch) +(defun py-execute-buffer-dedicated-switch () + "Send the contents of the buffer to an unique Python interpreter. + +Ignores setting of `py-switch-buffers-on-execute-p'. " + (interactive) + (let ((py-dedicated-process-p t) + (py-switch-buffers-on-execute-p t)) + (py-execute-buffer-base))) + +(defun py-execute-buffer () + "Send the contents of the buffer to a Python interpreter. " + (interactive) + (let ((origline 1)) + (and py-prompt-on-changed-p (buffer-file-name) (interactive-p) (buffer-modified-p) + (y-or-n-p "Buffer changed, save first? ") + (write-file (buffer-file-name))) + (py-execute-region (point-min) (point-max)))) + +(defun py-execute-buffer-base () + "Honor `py-master-file'. " + (let* ((py-master-file (or py-master-file (py-fetch-py-master-file))) + (file + (if py-master-file + (expand-file-name py-master-file) + (buffer-file-name)))) + (py-execute-file file))) + +(defun py-execute-buffer-no-switch () + "Send the contents of the buffer to a Python interpreter but don't switch to output. " + (interactive) + (let (py-switch-buffers-on-execute-p) + (py-execute-buffer-base))) + +;; 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"))) + (pcmd (py-choose-shell))) + (unless (buffer-live-p output-buffer) + (set-buffer (get-buffer-create output-buffer))) + (shell-command (concat pcmd " " filename) output-buffer error-buffer) + (when (interactive-p) (switch-to-buffer output-buffer)))) + +;;; +(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-output-filter (string) + "Clear output buffer from py-shell-input prompt etc. " + (interactive "*") + (replace-regexp-in-string + (concat "\\(\n\\|" py-shell-input-prompt-1-regexp "\\|" py-shell-input-prompt-2-regexp "\\|" "^In \\[[0-9]+\\]: *" "\\)") "" string)) + +(defun py-execute-file (filename) + "When called interactively, user is prompted for filename. " + (interactive "fFilename: ") + (let (;; py-postprocess-output-buffer might want origline + (origline 1) + (windows-config (window-configuration-to-register 313465889)) + (py-exception-buffer filename) + erg) + (if (file-readable-p filename) + (if py-store-result-p + (setq erg (py-execute-file-base nil (expand-file-name filename))) + (py-execute-file-base nil (expand-file-name filename))) + (message "%s not readable. %s" filename "Do you have write permissions?")) + erg)) + +(defun py-update-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)) + (replace-regexp-in-string "\n" "" + (shell-command-to-string (concat py-shell-name " -c \"import os; print(os.sep)\""))))))) + (if (and erg (string-match "^$" erg)) + (setq erg (substring erg (string-match "^$" erg))) + (setq erg (replace-regexp-in-string "\n" "" (shell-command-to-string (concat py-shell-name " -W ignore" " -c \"import os; print(os.sep)\""))))) + erg)) + +(defun py-current-working-directory (&optional shell) + "Return the directory of current `py-shell'." + (replace-regexp-in-string "\n" "" (shell-command-to-string (concat (or shell py-shell-name) " -c \"import os; print(os.getcwd())\"")))) + +(defun py-update-execute-directory-intern (dir proc) + (comint-send-string proc (concat "import os;os.chdir(\"" dir "\")\n"))) + +(defun py-update-execute-directory (proc procbuf execute-directory) + (let ((oldbuf (current-buffer)) + orig cwd) + (set-buffer procbuf) + (setq cwd (py-current-working-directory)) + (setq orig (point)) + (unless (string= execute-directory (concat cwd "/")) + (py-update-execute-directory-intern (or py-execute-directory execute-directory) proc) + (delete-region orig (point-max))) + (set-buffer oldbuf))) + +(defun py-execute-file-base (&optional proc filename cmd procbuf origfile execute-directory) + "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* ((cmd (or cmd (format "exec(compile(open('%s').read(), '%s', 'exec')) # PYTHON-MODE\n" filename filename))) + (msg (and py-verbose-p (format "## executing %s...\n" (or origfile filename)))) + (procbuf (or procbuf (py-shell nil nil nil procbuf t))) + (proc (or proc (get-buffer-process procbuf))) + erg orig err-p) + (set-buffer procbuf) + (goto-char (point-max)) + ;; (switch-to-buffer (current-buffer)) + (setq orig (point)) + (comint-send-string proc cmd) + (if + (setq err-p (save-excursion (py-postprocess-output-buffer procbuf))) + (py-shell-manage-windows py-buffer-name nil windows-config) + (and py-store-result-p + (sit-for 0.1) + (setq erg + (py-output-filter + (buffer-substring-no-properties orig (point-max)))) + (unless (string= (car kill-ring) erg) (kill-new erg))) + (py-shell-manage-windows (current-buffer) nil windows-config) + erg))) + +;;; Pdb +;; Autoloaded. +(declare-function compilation-shell-minor-mode "compile" (&optional arg)) + +(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 + (cond ((not arg) + (setq py-pdbtrack-do-tracking-p (not py-pdbtrack-do-tracking-p))) + ((zerop (prefix-numeric-value arg)) + (setq py-pdbtrack-do-tracking-p nil)) + ((> (prefix-numeric-value arg) 0) + (setq py-pdbtrack-do-tracking-p t))) + (if py-pdbtrack-do-tracking-p + (progn + (add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file t) + (remove-hook 'comint-output-filter-functions 'python-pdbtrack-track-stack-file t)) + (remove-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file t) + (remove-hook 'comint-output-filter-functions 'python-pdbtrack-track-stack-file t)) + (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)) + +;;; Documentation +(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 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. + +Returns 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) + (unless (py-end-of-statement-p) + (py-end-of-statement)) + (setq imports + (concat + imports + (replace-regexp-in-string + "[\\]\r?\n?\s*" "" + (buffer-substring-no-properties (match-beginning 0) (point))) ";")))) + ;; (and imports + ;; (setq imports (replace-regexp-in-string ";$" "" imports))) + (when (and py-verbose-p (interactive-p)) (message "%s" imports)) + imports)) + +(defalias 'py-describe-symbol 'py-help-at-point) +(defalias 'py-eldoc-function 'py-help-at-point) +(defun py-help-at-point (&optional debug) + "Print help on symbol at point. + +If symbol is defined in current buffer, jump to it's definition +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)) + ;; if symbol is defined in current buffer, go to + (erg (progn (goto-char (point-min)) + (when + (re-search-forward (concat "^[ \t]*def " sym "(") nil t 1) + (forward-char -2) + (point))))) + (if erg + (progn (push-mark orig)(push-mark (point)) + (when (and (interactive-p) py-verbose-p) (message "Jump to previous position with %s" "C-u C- C-u C-"))) + (goto-char orig) + (when cmd + (setq cmd (mapconcat + (lambda (arg) (concat "try: " arg "\nexcept: pass\n")) + (split-string cmd ";" t) + ""))) + (setq cmd (concat "import pydoc\n" + cmd)) + (when (not py-remove-cwd-from-path) + (setq cmd (concat cmd "import sys\n" + "sys.path.insert(0, '" + (file-name-directory origfile) "')\n"))) + (setq cmd (concat cmd "pydoc.help('" sym "')\n")) + (with-temp-buffer + (insert cmd) + (write-file file)) + (setq erg (py-process-file file "*Python-Help*")) + (if py-max-help-buffer-p + (progn + (set-buffer "*Python-Help*") + (switch-to-buffer (current-buffer)) + ;; (sit-for 0.1) + (help-mode) + (delete-other-windows)) + (message "%s" erg)) + + (when (file-readable-p file) + (unless (eq 4 (prefix-numeric-value debug)) (delete-file file)))))) + + +(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")))) + +(declare-function info-lookup-maybe-add-help "info-look" (&rest arg)) + +(defun py-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" '(py-after-info-look)) + +;;; +(defun py-send-receive (string) + "Send STRING to inferior Python (if any) and return result. + +This is a no-op if `py-check-comint-prompt' returns nil." + (or (py-send-string-no-output string) + (let ((proc (py-proc))) + (with-current-buffer (process-buffer proc) + (when (py-check-comint-prompt proc) + (set (make-local-variable 'py-preoutput-result) nil) + (accept-process-output proc 5) + (prog1 py-preoutput-result + (kill-local-variable 'py-preoutput-result))))))) + +(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 "f") + (py-execute-file-base (get-buffer-process (get-buffer (py-shell))) file-name)) + +(defalias 'py-find-function 'py-find-definition) +(defun py-find-definition (&optional symbol) + "Find source of definition of SYMBOL. + +Interactively, prompt for SYMBOL." + (interactive) + (set-register 98888888 (list (current-window-configuration) (point-marker))) + (let* ((oldbuf (current-buffer)) + (imports (py-find-imports)) + (symbol (or symbol (with-syntax-table py-dotted-expression-syntax-table + (current-word)))) + (enable-recursive-minibuffers t) + (symbol + (if (interactive-p) + (read-string (if symbol + (format "Find location of (default %s): " symbol) + "Find location of: ") + nil nil symbol) + symbol)) + (orig (point)) + (local (or + (py-until-found (concat "class " symbol) imenu--index-alist) + (py-until-found symbol imenu--index-alist))) + source sourcefile path) + ;; ismethod(), isclass(), isfunction() or isbuiltin() + ;; ismethod isclass isfunction isbuiltin) + (if local + (if (numberp local) + (progn + (goto-char local) + (search-forward symbol (line-end-position) nil 1) + (push-mark) + (goto-char (match-beginning 0)) + (exchange-point-and-mark)) + (error "%s" "local not a number")) + (setq source (py-send-string-return-output (concat imports "import inspect;inspect.getmodule(" symbol ")"))) + (cond ((string-match "SyntaxError" source) + (setq source (substring-no-properties source (match-beginning 0))) + (jump-to-register 98888888) + (message "Can't get source: %s" source)) + ((and source (string-match "builtin" source)) + (progn (jump-to-register 98888888) + (message "%s" source))) + ((and source (setq path (replace-regexp-in-string "'" "" (py-send-string-return-output "import os;os.getcwd()"))) + (setq sourcefile (replace-regexp-in-string "'" "" (py-send-string-return-output (concat "inspect.getsourcefile(" symbol ")")))) + (interactive-p) (message "sourcefile: %s" sourcefile) + (find-file (concat path py-separator-char sourcefile)) + (goto-char (point-min)) + (re-search-forward (concat py-def-or-class-re symbol) nil nil 1)) + (push-mark) + (goto-char (match-beginning 0)) + (exchange-point-and-mark) + (display-buffer oldbuf))) + sourcefile))) + +;;; Miscellanus +(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)) + +(defun py-beginning-of-commented-section (&optional last) + "Leave upwards comments and/or empty lines. " + (interactive) + (let ((pps (syntax-ppss)) + (last (or last (point)))) + (if (and (or (and (nth 4 pps)(goto-char (nth 8 pps)))(looking-at comment-start)) + (looking-back "^[ \t]*")(not (bobp))) + (progn + (skip-chars-backward " \t\r\n\f") + (py-beginning-of-commented-section last)) + (goto-char last)))) + +(defun py-empty-arglist-indent (nesting py-indent-offset indent-offset) + "Internally used by `py-compute-indentation'" + (if + (and (eq 1 nesting) + (save-excursion + (back-to-indentation) + (looking-at py-extended-block-or-clause-re))) + (progn + (back-to-indentation) + (+ (current-column) (* 2 (or indent-offset py-indent-offset)))) + (+ (current-indentation) py-indent-offset))) + +(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)) + +(defun py-after-empty-line () + "Return `t' if line before contains only whitespace characters. " + (save-excursion + (beginning-of-line) + (forward-line -1) + (beginning-of-line) + (looking-at "\\s-*$"))) + +(defalias 'py-count-indentation 'py-compute-indentation) +(defun py-compute-indentation (&optional orig origline closing line nesting repeat indent-offset liep) + "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. + +Optional arguments are flags resp. values set and used by `py-compute-indentation' internally +" + (interactive) + (save-excursion + (save-restriction + (widen) + ;; in shell, narrow from previous prompt + ;; needed by closing + (unless orig (back-to-indentation)) + (let* ((orig (or orig (point))) + (origline (or origline (py-count-lines))) + ;; closing indicates: when started, looked + ;; at a single closing parenthesis + ;; line: moved already a line backward + (liep (or liep (line-end-position))) + (line line) + (pps (syntax-ppss)) + (closing + (or closing + (and (nth 1 pps) + (looking-at ".*\\(\\s)\\)")(nth 0 pps) + ;; char doesn't matter for now, maybe drop + (string-to-char (match-string-no-properties 1))))) + ;; in a recursive call already + (repeat repeat) + ;; nesting: started nesting a list + (nesting nesting) + (indent-offset (or indent-offset py-indent-offset)) + (name (current-buffer)) + erg indent this-line) + (if (and (not repeat) + (and (comint-check-proc (current-buffer)) + (re-search-backward (concat py-shell-prompt-regexp "\\|" ipython-de-output-prompt-regexp "\\|" ipython-de-input-prompt-regexp) nil t 1))) + ;; common recursion not suitable because of prompt + (with-temp-buffer + (insert-buffer-substring name (match-end 0) orig) + (goto-char orig) + (setq indent (py-compute-indentation))) + (unless repeat (setq nesting (nth 0 pps)) + (setq repeat t)) + (setq indent + (cond + ((and (bobp) (eq liep (line-end-position))) + (current-indentation)) + ((and (bobp)(py-statement-opens-block-p py-extended-block-or-clause-re)) + (+ (if py-smart-indentation (py-guess-indent-offset) indent-offset) (current-indentation))) + ((and (bobp)(not (py-statement-opens-block-p py-extended-block-or-clause-re))) + (current-indentation)) + ;; in string + ((and (nth 3 pps)(nth 8 pps)) + (if + ;; still at original line + (eq liep (line-end-position)) + (progn + (forward-line -1) + (end-of-line) + (skip-chars-backward " \t\r\n\f") + (if (ignore-errors (< (nth 8 (syntax-ppss)) (line-beginning-position))) + (current-indentation) + (ignore-errors (goto-char (nth 8 pps))) + (py-line-backward-maybe) + (back-to-indentation) + (py-compute-indentation orig origline closing line nesting t indent-offset liep))) + (goto-char (nth 8 pps)) + (current-indentation))) + ((and (looking-at "\"\"\"\\|'''")(not (bobp))) + (py-beginning-of-statement) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + ;; comments + ((nth 8 pps) + (if (eq liep (line-end-position)) + (progn + (goto-char (nth 8 pps)) + (py-line-backward-maybe) + (skip-chars-backward " \t") + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + (goto-char (nth 8 pps)) + (if + line + (if py-indent-honors-inline-comment + (current-column) + (if py-indent-comments + (progn + (py-beginning-of-commented-section) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + 0)) + (forward-char -1) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)))) + ((and (looking-at "[ \t]*#") (looking-back "^[ \t]*")(not line) + (eq liep (line-end-position))) + (if py-indent-comments + (progn + (setq line t) + (skip-chars-backward " \t\r\n\f") + ;; as previous comment-line might + ;; be wrongly unindented, travel + ;; whole commented section + (py-beginning-of-commented-section) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + 0)) + ((and (looking-at "[ \t]*#") (looking-back "^[ \t]*")(not + (eq liep (line-end-position)))) + (current-indentation)) + ((and (eq ?\# (char-after)) line py-indent-honors-inline-comment) + (current-column)) + ;; lists + ((nth 1 pps) + (cond + ((and nesting (not line)) + ;; still at original line + (save-excursion + (goto-char (nth 1 pps)) + (setq this-line (py-count-lines)) + (cond + ((< 0 (- origline this-line)) + (if (< 1 (- origline this-line)) + (cond + (closing + (cond + (py-closing-list-dedents-bos + (goto-char (nth 1 pps)) + (current-indentation)) + ((looking-back "^[ \t]*") + (current-column)) + ((and (looking-at "\\s([ \t]*$") py-closing-list-keeps-space) + (+ (current-column) py-closing-list-space)) + ((looking-at "\\s([ \t]*$") + (py-empty-arglist-indent nesting py-indent-offset indent-offset)) + (t (py-fetch-previous-indent orig)))) + ;; already behind a dedented element in list + ((<= 2 (- origline this-line)) + (py-fetch-previous-indent orig)) + ((< (current-indentation) (current-column)) + (+ (current-indentation) py-indent-offset)) + (t (py-fetch-previous-indent orig))) + (cond ((looking-at "\\s([ \t]*$") + (py-empty-arglist-indent nesting py-indent-offset indent-offset)) + ((looking-at "\\s([ \t]*\\([^ \t]+.*\\)$") + (goto-char (match-beginning 1)) + (if py-indent-paren-spanned-multilines-p + (+ (current-column) py-indent-offset) + (current-column))) + (t (+ (current-column) (* (nth 0 pps))))))) + ((nth 1 (syntax-ppss)) + (goto-char (nth 1 (syntax-ppss))) + (setq line + ;; should be faster + (< (line-end-position) liep) + ;; (< (py-count-lines) origline) + ) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + ((not (py-beginning-of-statement-p)) + (py-beginning-of-statement) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + (t (1+ (current-column)))))) + ((and (not nesting) line) + (py-beginning-of-statement) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + ((not nesting) + (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 nesting t indent-offset liep)))) + ((and (eq (char-after) (or ?\( ?\{ ?\[)) line) + (1+ (current-column))) + ((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") + py-backslashed-lines-indent-offset + (+ (current-indentation) py-continuation-offset))))) + ((and (looking-at py-block-closing-keywords-re) + (eq liep (line-end-position))) + (skip-chars-backward "[ \t\r\n\f]") + (py-beginning-of-statement) + (cond ((looking-at py-extended-block-or-clause-re) + (+ + (if py-smart-indentation (py-guess-indent-offset) indent-offset) + (current-indentation))) + ((looking-at py-block-closing-keywords-re) + (- (current-indentation) py-indent-offset)) + (t (current-column)))) + ((looking-at py-block-closing-keywords-re) + (if (< (line-end-position) orig) + (- (current-indentation) py-indent-offset) + (py-beginning-of-block-or-clause (current-indentation)) + (current-indentation))) + ((looking-at py-no-outdent-re) + (if + (eq liep (line-end-position)) + (progn + (back-to-indentation) + (py-line-backward-maybe) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + (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)(not line) + (eq liep (line-end-position))) + (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 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-extended-block-or-clause-re) + (cond ((and (not line) + (eq liep (line-end-position))) + (py-line-backward-maybe) + (setq line t) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + (t (+ + (cond (indent-offset) + (py-smart-indentation + (py-guess-indent-offset)) + (t py-indent-offset)) + (current-indentation))))) + ((and + (< (line-end-position) liep) + (eq (current-column) (current-indentation))) + (and + (looking-at py-assignment-re) + (goto-char (match-end 0))) + ;; multiline-assignment + (if (and nesting (looking-at " *[[{(]")(not (looking-at ".+[]})][ \t]*$"))) + (+ (current-indentation) py-indent-offset) + (current-indentation))) + ((looking-at py-assignment-re) + (py-beginning-of-statement) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + ((and (< (current-indentation) (current-column))(not line)) + (back-to-indentation) + (unless line + (setq nesting (nth 0 (syntax-ppss)))) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + ((and (not (py-beginning-of-statement-p)) (not (and line (eq ?\# (char-after))))) + (if (bobp) + (current-column) + (if (eq (point) orig) + (progn + (py-line-backward-maybe) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + (py-beginning-of-statement) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)))) + ((or (py-statement-opens-block-p py-extended-block-or-clause-re)(looking-at "@")) + (if (< (py-count-lines) origline) + (+ (if py-smart-indentation (py-guess-indent-offset) indent-offset) (current-indentation)) + (skip-chars-backward " \t\r\n\f") + (setq line t) + (back-to-indentation) + (py-compute-indentation orig origline closing line nesting t indent-offset liep))) + ((and py-empty-line-closes-p (py-after-empty-line)) + (progn (py-beginning-of-statement) + (- (current-indentation) py-indent-offset))) + ;; still at orignial line + ((and (eq liep (line-end-position)) + (save-excursion + (and (setq erg (py-go-to-keyword py-extended-block-or-clause-re)) + (if py-smart-indentation (setq indent-offset (py-guess-indent-offset)) t) + (ignore-errors (< orig (or (py-end-of-block-or-clause)(point))))))) + (+ (car erg) (if py-smart-indentation + (or indent (py-guess-indent-offset)) + indent-offset))) + ((and (not line) + (eq liep (line-end-position)) + (py-beginning-of-statement-p)) + (py-beginning-of-statement) + (py-compute-indentation orig origline closing line nesting t indent-offset liep)) + (t (current-indentation)))) + (when (and py-verbose-p (interactive-p)) (message "%s" indent)) + indent))))) + +(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)) + +;; (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'." +;; ;;remove ansi terminal escape sequences from string +;; (setq string (ansi-color-filter-apply string)) +;; (when (and (string-match py-shell-input-prompt-1-regexp string) +;; py-file-queue) +;; (if py-switch-buffers-on-execute-p +;; (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-base pyproc (car py-file-queue)))))) + +(defun py-guess-default-python () + "Defaults to \"python\", if guessing didn't succeed. " + (interactive) + (let* ((ptn (or py-shell-name (py-choose-shell) "python")) + (erg (if py-edit-only-p ptn (executable-find ptn)))) + (when (interactive-p) + (if erg + (message "%s" ptn) + (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)) + (replace-regexp-in-string "\n" "" + (shell-command-to-string (concat py-shell-name " -c \"import os; print(os.sep)\""))))))) + (if (and erg (string-match "^$" erg)) + (setq erg (substring erg (string-match "^$" erg))) + (setq erg (replace-regexp-in-string "\n" "" (shell-command-to-string (concat py-shell-name " -W ignore" " -c \"import os; print(os.sep)\""))))) + erg)) + +(unless py-separator-char (setq py-separator-char (py-separator-char))) + +(defun py-process-name (&optional name) + "Return the name of the running Python process, `get-process' willsee it. " + (let* ((thisname (if name + (if (string-match py-separator-char name) + (substring name (progn (string-match (concat "\\(.+\\)"py-separator-char "\\(.+\\)$") name) (match-beginning 2))) + + name) + (substring py-shell-name (or (string-match (concat py-separator-char ".+$") py-shell-name) 0)))) + (nname (cond (py-dedicated-process-p + (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 (string-match "^\*" erg)(setq erg (concat "*" erg "*"))) + erg)) + +;; (make-variable-buffer-local 'ipython-completion-command-string) + +;; (setq ipython0.10-completion-command-string "print(';'.join(__IP.Completer.all_completions('%s'))) #PYTHON-MODE SILENT\n") + +;; 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 () + "Set and return `ipython-completion-command-string'. " + (interactive) + (let* ((ipython-version (shell-command-to-string (concat py-shell-name " -V")))) + (if (string-match "[0-9]" ipython-version) + (setq ipython-completion-command-string + (cond ((string-match "^1.1.*" ipython-version) + ipython0.11-completion-command-string) + ((string-match "^0.1[1-3]" ipython-version) + ipython0.11-completion-command-string) + ((string= "^0.10" ipython-version) + ipython0.10-completion-command-string))) + (error ipython-version)))) + +(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 () + "Return an appropriate name to display in modeline. +SEPCHAR is the file-path separator of your system. " + (let ((name (capitalize py-shell-name)) + prefix erg suffix liste) + (when (string-match py-separator-char 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 py-separator-char))) + (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 py-separator-char "[^" py-separator-char "]+$") 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 py-dedicated-process-p + (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 (output-buffer &optional windows-displayed windows-config) + "Adapt or restore window configuration. Return nil " + (cond ((eq py-keep-windows-configuration 'force) + (py-restore-window-configuration)) + ((and (boundp 'err-p) err-p) + (py-restore-window-configuration) + (py-jump-to-exception err-p py-exception-buffer) + ;; (goto-char (point-max)) + (and (window-full-height-p) + (funcall py-split-windows-on-execute-function)) + (display-buffer output-buffer t)) + (py-keep-windows-configuration + (py-restore-window-configuration)) + ;; split and switch + ((and py-split-windows-on-execute-p + py-switch-buffers-on-execute-p) + (when (< (count-windows) py-max-split-windows) + (funcall py-split-windows-on-execute-function)) + (set-buffer output-buffer) + (goto-char (point-max)) + (switch-to-buffer (current-buffer)) + (display-buffer py-exception-buffer)) + ;; split, not switch + ((and + py-split-windows-on-execute-p + (not py-switch-buffers-on-execute-p)) + (delete-other-windows) + (if (< (count-windows) py-max-split-windows) + (progn + (funcall py-split-windows-on-execute-function) + (set-buffer output-buffer) + (goto-char (point-max)) + (and (bufferp py-exception-buffer)(set-buffer py-exception-buffer) + (switch-to-buffer (current-buffer)) + (display-buffer output-buffer 'display-buffer-reuse-window)) + (display-buffer output-buffer 'display-buffer-reuse-window)))) + ;; no split, switch + ((and + py-switch-buffers-on-execute-p + (not py-split-windows-on-execute-p)) + (let (pop-up-windows) + (set-buffer output-buffer) + (goto-char (point-max)) + (switch-to-buffer (current-buffer)))) + ;; no split, no switch + ((not py-switch-buffers-on-execute-p) + ;; (if (equal (window-list-1) windows-displayed) + ;; (jump-to-register 313465889) + (let (pop-up-windows) + (py-restore-window-configuration)))) + nil) + +(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 +`py-setup-codes' list." + (accept-process-output process 1) + (dolist (code py-setup-codes) + (py-send-string-no-output + (symbol-value code) process) + (sit-for 0.1))) + +(defun py--shell-make-comint () + (set-buffer (apply 'make-comint-in-buffer executable py-buffer-name executable nil args)) + (unless (interactive-p) (sit-for 0.1)) + (set (make-local-variable 'comint-prompt-regexp) + (cond ((string-match "[iI][pP]ython[[:alnum:]*-]*$" py-buffer-name) + (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)) + "\\|") + "\\)")) + (t (concat "\\(" + (mapconcat 'identity + (delq nil (list py-shell-input-prompt-1-regexp py-shell-input-prompt-2-regexp py-pdbtrack-input-prompt py-pydbtrack-input-prompt)) + "\\|") + "\\)"))))) + +(defun py--shell-setup () + (set (make-local-variable 'comint-input-filter) 'py-history-input-filter) + (set (make-local-variable 'comint-prompt-read-only) py-shell-prompt-read-only) + (set (make-local-variable 'comint-use-prompt-regexp) nil) + (set (make-local-variable 'compilation-error-regexp-alist) + python-compilation-regexp-alist) + ;; (setq completion-at-point-functions nil) + (and py-fontify-shell-buffer-p + (set (make-local-variable 'font-lock-defaults) + '(py-font-lock-keywords nil nil nil nil + (font-lock-syntactic-keywords + . py-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) + (set (make-local-variable 'inhibit-point-motion-hooks) t) + (setq proc (get-buffer-process (current-buffer))) + (py-shell-send-setup-code proc) + (and py-set-pager-cat-p (comint-simple-send proc "import os;os.environ['PAGER'] = 'cat'")) + (compilation-shell-minor-mode 1) + (setq comint-input-sender 'py-shell-simple-send) + ;; (sit-for 0.1) + (setq comint-input-ring-file-name + (cond ((string-match "[iI][pP]ython[[:alnum:]*-]*$" py-buffer-name) + (if py-honor-IPYTHONDIR-p + (if (getenv "IPYTHONDIR") + (concat (getenv "IPYTHONDIR") "/history") + py-ipython-history) + py-ipython-history)) + (t + (if py-honor-PYTHONHISTORY-p + (if (getenv "PYTHONHISTORY") + (concat (getenv "PYTHONHISTORY") "/" (py-report-executable py-buffer-name) "_history") + py-ipython-history) + py-ipython-history)))) + (comint-read-input-ring t) + (set-process-sentinel (get-buffer-process py-buffer-name) + #'shell-write-history-on-exit) + (add-hook 'comint-output-filter-functions + 'ansi-color-process-output) + (add-hook 'after-change-functions 'py-after-change-function nil t) + + (remove-hook 'comint-output-filter-functions + 'font-lock-extend-jit-lock-region-after-change) + (use-local-map py-shell-map) + (cond + (py-complete-function + (add-hook 'completion-at-point-functions + py-complete-function nil 'local)) + (py-load-pymacs-p + (add-hook 'completion-at-point-functions + 'py-complete-completion-at-point nil 'local)) + (t + (add-hook 'completion-at-point-functions + 'py-shell-complete nil 'local))) + ;; pdbtrack + (and py-pdbtrack-do-tracking-p + (add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file t) + (remove-hook 'comint-output-filter-functions 'python-pdbtrack-track-stack-file t)) + (set-syntax-table python-mode-syntax-table)) + +(defun py-shell (&optional argprompt dedicated shell buffer-name no-window-managment) + "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'. +BUFFER allows specifying a name, the Python process is connected to +When DONE is `t', `py-shell-manage-windows' is omitted +" + (interactive "P") + (let* ((dedicated (or dedicated py-dedicated-process-p)) + (py-exception-buffer (or py-exception-buffer (current-buffer))) + (coding-system-for-read 'utf-8) + (coding-system-for-write 'utf-8) + (args py-python-command-args) + (path (getenv "PYTHONPATH")) + (py-shell-name (or shell py-shell-name (py-choose-shell))) + + ;; reset later on + (py-buffer-name + (cond (buffer-name) + (t (and (not dedicated) argprompt + (cond + ((eq 4 (prefix-numeric-value argprompt)) + (prog1 + (read-buffer "Py-Shell buffer: " + (generate-new-buffer-name (py-buffer-name-prepare))) + (when (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))) + (setq py-separator-char (py-separator-char))))) + ((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 " ") " ")))))))))) + ;; 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 (or py-buffer-name (py-buffer-name-prepare))) + (executable (cond (py-shell-name) + (py-buffer-name + (py-report-executable py-buffer-name)))) + proc py-smart-indentation) + ;; lp:1169687, if called from within an existing py-shell, open a new one + (and (bufferp py-exception-buffer)(string= py-buffer-name (buffer-name py-exception-buffer)) + (setq py-buffer-name (generate-new-buffer-name py-buffer-name))) + + (unless (comint-check-proc py-buffer-name) + (py--shell-make-comint) + (py--shell-setup) + ;; (add-hook 'py-shell-hook 'py-dirstack-hook) + (and py-fontify-shell-buffer-p (font-lock-fontify-buffer)) + (unless no-window-managment (py-shell-manage-windows py-buffer-name)) + (when py-shell-hook (run-hooks 'py-shell-hook)) + py-buffer-name))) + +(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 (and (bolp)(eolp)) (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 (symbol-value regexp)))))) + (py-end-base regexp (point)) + (forward-line 1) + (if py-close-provides-newline + (unless (and (bolp)(eolp)) (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 (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))))) + +;;; + +(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)))) + ;; guess if doublequotes or parentheses are needed + (numbered (and (string-match "^[0-9]" name) (string-match "^[ \t]*[0-9]" name)(string-match "[0-9][ \t]*$" name))) + (form (cond ((or (eq major-mode 'python-mode)(eq major-mode 'inferior-python-mode)) + (if numbered + (concat "print(\"" name ": %s \" % (" name "))") + (concat "print(\"" name ": %s \" % \"" name "\")")))))) + (insert form))) + +(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 (and (bolp)(eolp)) + (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)) + +;;; Imenu + +;; 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. + +;; These next two variables are used when searching for the Python +;; class/definitions. Just saving some time in accessing the +;; generic-python-expression, really. + +(defun py-switch-imenu-index-function () + "Switch between series 5. index machine `py-imenu-create-index' and `py-imenu-create-index-new', which also lists modules variables " + (interactive) + (if (eq major-mode 'python-mode) + (progn + (if (eq py-imenu-create-index-function 'py-imenu-create-index-new) + ;; (setq py-imenu-create-index-function 'py-imenu-create-index) + (set (make-local-variable 'py-imenu-create-index-function) 'py-imenu-create-index) + ;; (setq py-imenu-create-index-function 'py-imenu-create-index-new) + (set (make-local-variable 'py-imenu-create-index-function) 'py-imenu-create-index-new)) + (when py-menu + (easy-menu-add py-menu)) + (when py-verbose-p (message "imenu-create-index-function: %s" (prin1-to-string py-imenu-create-index-function))) + (funcall imenu-create-index-function)) + (error "%s" "Only available in buffers set to python-mode"))) + +(defalias 'py-imenu-create-index-function 'py-imenu-create-index) +(defun py-imenu-create-index () + "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))) + +(defun py-imenu-create-index-new-intern (&optional thisend end) + (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) end)) + (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 pos name) + (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)) end) + (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)) + +;;; py-shell +(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) + (define-key map (kbd "TAB") 'py-indent-line) + ;; (define-key map [tab] 'tab-to-tab-stop) + ;; (define-key map "\t" 'py-shell-complete) + (define-key map [(meta tab)] 'py-shell-complete) + (define-key map [(control c)(!)] 'py-shell) + map)) + +(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) + +(defun py-choose-shell-by-path (&optional py-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)) + (py-separator-char (or py-separator-char py-separator-char)) + erg) + (when (and path py-separator-char + (string-match (concat py-separator-char "[iI]?[pP]ython[0-9.]+" py-separator-char) path)) + (setq erg (substring path + (1+ (string-match (concat py-separator-char "[iI]?[pP]ython[0-9.]+" py-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* (treffer (cmd (py-choose-shell)) + version erg) + (setq treffer (string-match "\\([23]*\\.?[0-9\\.]*\\)$" cmd)) + (if treffer + ;; if a number if part of python name, assume it's the version + (setq version (substring-no-properties cmd treffer)) + (setq 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" + + (setq 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 version + (when py-verbose-p (message "%s" version)) + (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)) + +;; backward compatibility +(defalias 'py-switch-shells 'py-switch-shell) +(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 msg) + (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) + msg "CPython" + mode-name (py-buffer-name-prepare))) + ((string-match "jython" name) + (setq py-shell-name name + py-which-bufname (py-buffer-name-prepare) + msg "Jython" + mode-name (py-buffer-name-prepare))) + ((string-match "python" name) + (setq py-shell-name name + py-which-bufname (py-buffer-name-prepare) + 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-toggle-shells 'py-choose-shell) +(defalias 'py-which-shell 'py-choose-shell) +(defun py-choose-shell (&optional arg pyshell dedicated py-edit-only-p) + "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'"))) + ((and (comint-check-proc (current-buffer)) + (string-match "ython" (process-name (get-buffer-process (current-buffer))))) + (process-name (get-buffer-process (current-buffer)))) + ((py-choose-shell-by-shebang)) + ((py-choose-shell-by-import)) + ((py-choose-shell-by-path)) + (t (or + (default-value 'py-shell-name) + "python")))) + (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))) + +;;; + +(defun py-normalize-directory (directory) + "Make sure DIRECTORY ends with a file-path separator char. + +Returns DIRECTORY" + (let ((erg (cond ((string-match (concat py-separator-char "$") directory) + directory) + ((not (string= "" directory)) + (concat directory py-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. + +Used only, if `py-install-directory' is empty. " + (interactive) + (let ((erg (cond ((locate-library "python-mode") + (file-name-directory (locate-library "python-mode"))) + ((and (buffer-file-name)(string-match "python-mode" (buffer-file-name))) + (file-name-directory (buffer-file-name))) + ((string-match "python-mode" (buffer-name)) + default-directory)))) + (if erg + (setq py-install-directory erg) + (setq py-install-directory (expand-file-name "~/"))) + (when (and py-verbose-p (interactive-p)) (message "Setting py-install-directory to: %s" py-install-directory)) + 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))) + (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) "extensions")) + (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")) + (add-to-list 'load-path (concat (expand-file-name py-install-directory) "autopair"))) + ((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))))) + +;;; +(defun py--init-easy-menu () + (and (ignore-errors (require 'easymenu) t) + ;; (easy-menu-define py-menu map "Python Tools" + ;; `("PyTools" + (easy-menu-define + py-menu map "Python Mode menu" + `("Python" + ("Interpreter" + ["Default interpreter..." py-shell + :help " `py-shell' + +Start an interactive Python interpreter. + +Interactively, C-u 4 prompts for a buffer. +C-u 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. + +. "] + ("Other" + :help "Alternative Python Shells" + + ["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.3" python3.3 + :help "`python3.3' +Start an Python3.3 interpreter. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'."] + + ["python3.4" python3.4 + :help "`python3.3' +Start an Python3.4 interpreter. + +Optional C-u prompts for options to pass to the Python3.4 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'."] + + "-" + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-on-execute-p'" + + ["Execute file python switch" py-execute-file-python-switch + :help " `py-execute-file-python-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python no-switch" py-execute-file-python-no-switch + :help " `py-execute-file-python-no-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python dedicated" py-execute-file-python-dedicated + :help " `py-execute-file-python-dedicated' +Send file to a Python interpreter. + +Uses a dedicated shell. "] + + ["Execute file python dedicated switch" py-execute-file-python-dedicated-switch + :help " `py-execute-file-python-dedicated-switch' +Send file to a Python interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython switch" py-execute-file-ipython-switch + :help " `py-execute-file-ipython-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython no-switch" py-execute-file-ipython-no-switch + :help " `py-execute-file-ipython-no-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file ipython dedicated" py-execute-file-ipython-dedicated + :help " `py-execute-file-ipython-dedicated' +Send file to a Ipython interpreter. + +Uses a dedicated shell. "] + + ["Execute file ipython dedicated switch" py-execute-file-ipython-dedicated-switch + :help " `py-execute-file-ipython-dedicated-switch' +Send file to a Ipython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 switch" py-execute-file-python3-switch + :help " `py-execute-file-python3-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 no-switch" py-execute-file-python3-no-switch + :help " `py-execute-file-python3-no-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3 dedicated" py-execute-file-python3-dedicated + :help " `py-execute-file-python3-dedicated' +Send file to a Python3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3 dedicated switch" py-execute-file-python3-dedicated-switch + :help " `py-execute-file-python3-dedicated-switch' +Send file to a Python3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 switch" py-execute-file-python2-switch + :help " `py-execute-file-python2-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 no-switch" py-execute-file-python2-no-switch + :help " `py-execute-file-python2-no-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2 dedicated" py-execute-file-python2-dedicated + :help " `py-execute-file-python2-dedicated' +Send file to a Python2 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2 dedicated switch" py-execute-file-python2-dedicated-switch + :help " `py-execute-file-python2-dedicated-switch' +Send file to a Python2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 switch" py-execute-file-python2.7-switch + :help " `py-execute-file-python2.7-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 no-switch" py-execute-file-python2.7-no-switch + :help " `py-execute-file-python2.7-no-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2.7 dedicated" py-execute-file-python2.7-dedicated + :help " `py-execute-file-python2.7-dedicated' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2.7 dedicated switch" py-execute-file-python2.7-dedicated-switch + :help " `py-execute-file-python2.7-dedicated-switch' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython switch" py-execute-file-jython-switch + :help " `py-execute-file-jython-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython no-switch" py-execute-file-jython-no-switch + :help " `py-execute-file-jython-no-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file jython dedicated" py-execute-file-jython-dedicated + :help " `py-execute-file-jython-dedicated' +Send file to a Jython interpreter. + +Uses a dedicated shell. "] + + ["Execute file jython dedicated switch" py-execute-file-jython-dedicated-switch + :help " `py-execute-file-jython-dedicated-switch' +Send file to a Jython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 switch" py-execute-file-python3.3-switch + :help " `py-execute-file-python3.3-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 no-switch" py-execute-file-python3.3-no-switch + :help " `py-execute-file-python3.3-no-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3.3 dedicated" py-execute-file-python3.3-dedicated + :help " `py-execute-file-python3.3-dedicated' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3.3 dedicated switch" py-execute-file-python3.3-dedicated-switch + :help " `py-execute-file-python3.3-dedicated-switch' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython switch" py-execute-file-bpython-switch + :help " `py-execute-file-bpython-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython no-switch" py-execute-file-bpython-no-switch + :help " `py-execute-file-bpython-no-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file bpython dedicated" py-execute-file-bpython-dedicated + :help " `py-execute-file-bpython-dedicated' +Send file to a Bpython interpreter. + +Uses a dedicated shell. "] + + ["Execute file bpython dedicated switch" py-execute-file-bpython-dedicated-switch + :help " `py-execute-file-bpython-dedicated-switch' +Send file to a Bpython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + ) + + ) + ) + + "-" + ("Mark" + + ["Mark block" py-mark-block + :help " `py-mark-block' + +Mark block at point. + +Returns beginning and end positions of marked area, a cons. "] + + ["Mark minor block" py-mark-minor-block + :help " `py-mark-minor-block' + +Mark minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. +Returns beginning and end positions of marked area, a cons. "] + + ["Mark def or class" py-mark-def-or-class + :help " `py-mark-def-or-class' + +Mark def-or-class at point. + +Returns beginning and end positions of marked area, a cons. "] + + ["Mark statement" py-mark-statement + :help "`py-mark-statement' +Mark statement at point"] + + ["Mark top level" py-mark-top-level + :help " `py-mark-top-level' + +Mark top-level form at point. + +Returns beginning and end positions of marked area, a cons. "] + + ["Mark clause" py-mark-clause + :help "`py-mark-clause' +Mark innermost compound statement at point"] + + ["Mark def" py-mark-def + :help "`py-mark-def' +Mark innermost definition at point"] + + ["Mark expression" py-mark-expression + :help "`py-mark-expression' +Mark expression at point"] + + ["Mark partial expression" py-mark-partial-expression + :help "`py-mark-partial-expression' +\".\" operators delimit a partial-expression expression on it's level"] + + ["Mark class" py-mark-class + :help "`py-mark-class' +Mark innermost definition at point"] + + ["Mark comment" py-mark-comment + :help "`py-mark-comment' +Mark commented section at point"] + + "-" + + ["Mark block bol" py-mark-block-bol + :help "`py-mark-block-bol' +Mark block at point reaching beginning-of-line. "] + + ["Mark clause bol" py-mark-clause-bol + :help "`py-mark-clause-bol' +Mark clause at point reaching beginning-of-line. "] + + ["Mark block-or-clause bol" py-mark-block-or-clause-bol + :help "`py-mark-block-or-clause-bol' +Mark block-or-clause at point reaching beginning-of-line. "] + + ["Mark def bol" py-mark-def-bol + :help "`py-mark-def-bol' +Mark def at point reaching beginning-of-line. "] + + ["Mark class bol" py-mark-class-bol + :help "`py-mark-class-bol' +Mark class at point reaching beginning-of-line. "] + + ["Mark def-or-class bol" py-mark-def-or-class-bol + :help "`py-mark-def-or-class-bol' +Mark def-or-class at point reaching beginning-of-line. "] + + ["Mark if-block bol" py-mark-if-block-bol + :help "`py-mark-if-block-bol' +Mark if-block at point reaching beginning-of-line. "] + + ["Mark try-block bol" py-mark-try-block-bol + :help "`py-mark-try-block-bol' +Mark try-block at point reaching beginning-of-line. "] + + ["Mark minor-block bol" py-mark-minor-block-bol + :help "`py-mark-minor-block-bol' + +Mark minor-block at point reaching beginning-of-line. +A minor block is started by a `for', `if', `try' or `with'."] + + ) + + "-" + + ["Shift region left" py-shift-region-left + :help " `py-shift-region-left' + +Dedent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is dedented. +Returns indentation reached. "] + + ["Shift region right" py-shift-region-right + :help " `py-shift-region-right' + +Indent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is indented. +Returns indentation reached. "] + + "-" + + ("Comment" + ["Comment Region" py-comment-region (point) (mark) + :help "Like `comment-region' but uses double hash (`#') comment starter." ] + ["Uncomment" py-uncomment + :help " `py-uncomment' + +Uncomment commented lines at point. + +If region is active, restrict uncommenting at region . "] + + ["Uncomment Region" (py-comment-region (point) (mark) '(4)) + :help "(py-comment-region (point) (mark) '(4))" ] + "-" + ["Comment block" py-comment-block + :help " `py-comment-block' +Comments block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment minor-block" py-comment-minor-block + :help " `py-comment-minor-block' +Comments minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment top level" py-comment-top-level + :help " `py-comment-top-level' + +Comments top-level form at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment clause" py-comment-clause + :help " `py-comment-clause' +Comments clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment block or clause" py-comment-block-or-clause + :help " `py-comment-block-or-clause' +Comments block-or-clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment def" py-comment-def + :help " `py-comment-def' +Comments def at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment class" py-comment-class + :help " `py-comment-class' +Comments class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment def or class" py-comment-def-or-class + :help " `py-comment-def-or-class' +Comments def-or-class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment statement" py-comment-statement + :help " `py-comment-statement' +Comments statement at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + "-" + + ("Move" + + ["Beginning of block" py-beginning-of-block + :help " `py-beginning-of-block' + +Go to beginning block, skip whitespace at BOL. "] + + ["Go to end of block" py-end-of-block] + + "-" + + ["Beginning of def or class" py-beginning-of-def-or-class + :help " `py-beginning-of-def-or-class' + +Go to beginning def-or-class, skip whitespace at BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. "] + + ["End of def or class" py-end-of-def-or-class + :help " `py-end-of-def-or-class' + +Go to end of def-or-class. + +Returns end of def-or-class if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. "] + + "-" + + ["Beginning of statement" py-beginning-of-statement + :help " `py-beginning-of-statement' + +Go to the initial line of a simple statement. "] + + ["End of statement" py-end-of-statement + :help " `py-end-of-statement' + +Go to the last char of current statement. + +To go just beyond the final line of the current statement, use `py-down-statement-bol'. "] + + "-" + + ["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. "] + + "-" + + ("More" + + ["Up level" py-up + :help " `py-up' +Go to beginning one level above of compound statement or definition at point. "] + + ["Down level" py-down + :help " `py-down' +Go to beginning one level below of compound statement or definition at point. "] + + "-" + + ["Beginning of top level" py-beginning-of-top-level + :help " `py-beginning-of-top-level' + +Go to the very beginning of top-level form at point. "] + + ["End of top level" py-end-of-top-level + :help " `py-end-of-top-level' + +Go to end of top-level form at point. "] + + "-" + + ["Beginning of block current-column" py-beginning-of-block-current-column + :help " `py-beginning-of-block-current-column' + +Reach next beginning of block upwards which starts at current column. + +Return position. "] + + "-" + + ["Move to start of def" py-beginning-of-def t] + + ["Move to end of def" py-end-of-def t] + + "-" + + ["Beginning of clause" py-beginning-of-clause + :help " `py-beginning-of-clause' + +Go to beginning clause, skip whitespace at BOL. "] + + ["End of clause" py-end-of-clause + :help " `py-end-of-clause' + +Go to end of clause. "] + + "-" + + ["Beginning of comment" py-beginning-of-comment + :help " `py-beginning-of-comment' +Go to beginning of comment at point. "] + + ["End of comment" py-end-of-comment + :help " `py-end-of-comment' + +Go to end of comment at point. "] + + "-" + + ["Go to start of expression" (py-beginning-of-expression t) t] + ["Move to end of expression" (py-end-of-expression t) t] + + "-" + + ["Go to start of minor-expression" (py-beginning-of-minor-expression t) t] + + ["Move to end of minor-expression" (py-end-of-minor-expression t) t] + "-" + + ["Beginning of minor block" py-beginning-of-minor-block + :help " `py-beginning-of-minor-block' + +Go to beginning minor-block, skip whitespace at BOL. + +Returns beginning of minor-block if successful, nil otherwise + +A minor block is started by a `for', `if', `try' or `with'. + +"] + + ["End of minor block" py-end-of-minor-block + :help " `py-end-of-minor-block' + +Go to end of minor-block. + +Returns end of minor-block if successful, nil otherwise + +A minor block is started by a `for', `if', `try' or `with'. "] + + ) + + ) + + "-" + + ("Copy " + ["Copy statement" py-copy-statement + :help "`py-copy-statement' +Copy statement at point"] + + ["Copy top level" py-copy-top-level + :help " `py-copy-top-level' + +Copy top-level form at point. "] + + ["Copy clause" py-copy-clause + :help "`py-copy-clause' +Copy innermost clause at point"] + + ["Copy block" py-copy-block + :help "`py-copy-block' +Copy innermost block at point"] + + ["Copy minor block" py-copy-minor-block + :help " `py-copy-minor-block' + +Copy minor-block at point. + +Store data in kill ring, so it might yanked back. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Copy def" py-copy-def + :help "`py-copy-def' +Copy innermost definition 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"] + ["Copy class" py-copy-class + :help "`py-copy-class' +Copy innermost definition at point"] + + ["Copy Def-or-Class" py-copy-def-or-class + :help "`py-copy-def-or-class' +Copy innermost definition at point"] + + ) + + "-" + + ["Execute region" py-execute-region + :help " `py-execute-region' + +Send the region to a Python interpreter. + +When called with C-u 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. "] + + ["Execute buffer" py-execute-buffer + :help " `py-execute-buffer' + +Send the contents of the buffer to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +When called with C-u 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."] + + ["Execute def or class" py-execute-def-or-class + :help " `py-execute-def-or-class' + +Send def-or-class at point to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +See also `py-force-py-shell-name-p'. + +When called with C-u 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."] + + ["Execute statement" py-execute-statement + :help " `py-execute-statement' + +Send statement at point to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +See also `py-force-py-shell-name-p'. + +When called with C-u 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."] + + ["Execute string" py-execute-string + :help " `py-execute-string' + +Send the argument STRING to a Python interpreter. + +See also `py-execute-region'. "] + ("More... " + :help "Python-specific features" + + ["Execute top level" py-execute-top-level + :help " `py-execute-top-level' + +Send top-level form at point to a Python interpreter. "] + + ["Execute block" py-execute-block + :help "`py-execute-block' + Send block at point to Python interpreter. "] + + ["Execute minor block" py-execute-minor-block + :help " `py-execute-minor-block' + +Send minor-block at point to a Python interpreter. + +A minor block is started by a `for', `if', `try' or `with'. +. "] + + ["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 file" py-execute-file + :help "`py-execute-file' + Send file 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.3" py-execute-statement-python3.3 + :help "Execute statement through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-statement-bpython" py-execute-statement-bpython + :help "Execute statement through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-statement-python3.3-dedicated + :help "Execute statement through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-statement-bpython-dedicated" py-execute-statement-bpython-dedicated + :help "Execute statement through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-statement-python3.3-switch + :help "Execute statement through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-statement-bpython-switch" py-execute-statement-bpython-switch + :help "Execute statement through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-statement-python3.3-dedicated-switch + :help "Execute statement through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-statement-bpython-dedicated-switch" py-execute-statement-bpython-dedicated-switch + :help "Execute statement through a unique Bpython 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.3" py-execute-block-python3.3 + :help "Execute block through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-block-bpython" py-execute-block-bpython + :help "Execute block through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-block-python3.3-dedicated + :help "Execute block through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-block-bpython-dedicated" py-execute-block-bpython-dedicated + :help "Execute block through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-block-python3.3-switch + :help "Execute block through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-block-bpython-switch" py-execute-block-bpython-switch + :help "Execute block through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-block-python3.3-dedicated-switch + :help "Execute block through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-block-bpython-dedicated-switch" py-execute-block-bpython-dedicated-switch + :help "Execute block through a unique Bpython 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.3" py-execute-def-python3.3 + :help "Execute def through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-def-bpython" py-execute-def-bpython + :help "Execute def through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-def-python3.3-dedicated + :help "Execute def through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-def-bpython-dedicated" py-execute-def-bpython-dedicated + :help "Execute def through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-def-python3.3-switch + :help "Execute def through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-def-bpython-switch" py-execute-def-bpython-switch + :help "Execute def through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-def-python3.3-dedicated-switch + :help "Execute def through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-def-bpython-dedicated-switch" py-execute-def-bpython-dedicated-switch + :help "Execute def through a unique Bpython 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.3" py-execute-class-python3.3 + :help "Execute class through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-class-bpython" py-execute-class-bpython + :help "Execute class through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-class-python3.3-dedicated + :help "Execute class through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-class-bpython-dedicated" py-execute-class-bpython-dedicated + :help "Execute class through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-class-python3.3-switch + :help "Execute class through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-class-bpython-switch" py-execute-class-bpython-switch + :help "Execute class through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-class-python3.3-dedicated-switch + :help "Execute class through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-class-bpython-dedicated-switch" py-execute-class-bpython-dedicated-switch + :help "Execute class through a unique Bpython 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.3" py-execute-region-python3.3 + :help "Execute region through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-region-bpython" py-execute-region-bpython + :help "Execute region through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-region-python3.3-dedicated + :help "Execute region through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-region-bpython-dedicated" py-execute-region-bpython-dedicated + :help "Execute region through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-region-python3.3-switch + :help "Execute region through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-region-bpython-switch" py-execute-region-bpython-switch + :help "Execute region through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-region-python3.3-dedicated-switch + :help "Execute region through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-region-bpython-dedicated-switch" py-execute-region-bpython-dedicated-switch + :help "Execute region through a unique Bpython interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + )) + + ;; file + ("Execute file " + :help "Execute file functions" + + ["Execute file python" py-execute-file-python + :help " `py-execute-file-python' +Send file to a Python interpreter. "] + + ["Execute file ipython" py-execute-file-ipython + :help " `py-execute-file-ipython' +Send file to a Ipython interpreter. "] + + ["Execute file python3" py-execute-file-python3 + :help " `py-execute-file-python3' +Send file to a Python3 interpreter. "] + + ["Execute file python2" py-execute-file-python2 + :help " `py-execute-file-python2' +Send file to a Python2 interpreter. "] + + ["Execute file python2.7" py-execute-file-python2.7 + :help " `py-execute-file-python2.7' +Send file to a Python2.7 interpreter. "] + + ["Execute file jython" py-execute-file-jython + :help " `py-execute-file-jython' +Send file to a Jython interpreter. "] + + ["Execute file python3.3" py-execute-file-python3.3 + :help " `py-execute-file-python3.3' +Send file to a Python3.3 interpreter. "] + + ["Execute file bpython" py-execute-file-bpython + :help " `py-execute-file-bpython' +Send file to a Bpython interpreter. "] + + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-on-execute-p'" + + ["Execute file python switch" py-execute-file-python-switch + :help " `py-execute-file-python-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python no-switch" py-execute-file-python-no-switch + :help " `py-execute-file-python-no-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python dedicated" py-execute-file-python-dedicated + :help " `py-execute-file-python-dedicated' +Send file to a Python interpreter. + +Uses a dedicated shell. "] + + ["Execute file python dedicated switch" py-execute-file-python-dedicated-switch + :help " `py-execute-file-python-dedicated-switch' +Send file to a Python interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython switch" py-execute-file-ipython-switch + :help " `py-execute-file-ipython-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython no-switch" py-execute-file-ipython-no-switch + :help " `py-execute-file-ipython-no-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file ipython dedicated" py-execute-file-ipython-dedicated + :help " `py-execute-file-ipython-dedicated' +Send file to a Ipython interpreter. + +Uses a dedicated shell. "] + + ["Execute file ipython dedicated switch" py-execute-file-ipython-dedicated-switch + :help " `py-execute-file-ipython-dedicated-switch' +Send file to a Ipython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 switch" py-execute-file-python3-switch + :help " `py-execute-file-python3-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 no-switch" py-execute-file-python3-no-switch + :help " `py-execute-file-python3-no-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3 dedicated" py-execute-file-python3-dedicated + :help " `py-execute-file-python3-dedicated' +Send file to a Python3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3 dedicated switch" py-execute-file-python3-dedicated-switch + :help " `py-execute-file-python3-dedicated-switch' +Send file to a Python3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 switch" py-execute-file-python2-switch + :help " `py-execute-file-python2-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 no-switch" py-execute-file-python2-no-switch + :help " `py-execute-file-python2-no-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2 dedicated" py-execute-file-python2-dedicated + :help " `py-execute-file-python2-dedicated' +Send file to a Python2 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2 dedicated switch" py-execute-file-python2-dedicated-switch + :help " `py-execute-file-python2-dedicated-switch' +Send file to a Python2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 switch" py-execute-file-python2.7-switch + :help " `py-execute-file-python2.7-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 no-switch" py-execute-file-python2.7-no-switch + :help " `py-execute-file-python2.7-no-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2.7 dedicated" py-execute-file-python2.7-dedicated + :help " `py-execute-file-python2.7-dedicated' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2.7 dedicated switch" py-execute-file-python2.7-dedicated-switch + :help " `py-execute-file-python2.7-dedicated-switch' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython switch" py-execute-file-jython-switch + :help " `py-execute-file-jython-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython no-switch" py-execute-file-jython-no-switch + :help " `py-execute-file-jython-no-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file jython dedicated" py-execute-file-jython-dedicated + :help " `py-execute-file-jython-dedicated' +Send file to a Jython interpreter. + +Uses a dedicated shell. "] + + ["Execute file jython dedicated switch" py-execute-file-jython-dedicated-switch + :help " `py-execute-file-jython-dedicated-switch' +Send file to a Jython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 switch" py-execute-file-python3.3-switch + :help " `py-execute-file-python3.3-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 no-switch" py-execute-file-python3.3-no-switch + :help " `py-execute-file-python3.3-no-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3.3 dedicated" py-execute-file-python3.3-dedicated + :help " `py-execute-file-python3.3-dedicated' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3.3 dedicated switch" py-execute-file-python3.3-dedicated-switch + :help " `py-execute-file-python3.3-dedicated-switch' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython switch" py-execute-file-bpython-switch + :help " `py-execute-file-bpython-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython no-switch" py-execute-file-bpython-no-switch + :help " `py-execute-file-bpython-no-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file bpython dedicated" py-execute-file-bpython-dedicated + :help " `py-execute-file-bpython-dedicated' +Send file to a Bpython interpreter. + +Uses a dedicated shell. "] + + ["Execute file bpython dedicated switch" py-execute-file-bpython-dedicated-switch + :help " `py-execute-file-bpython-dedicated-switch' +Send file to a Bpython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + ) + ) + ) + + "-" + + ("Virtualenv" + + ["Virtualenv workon" virtualenv-workon + :help " runs `virtualenv-workon' + +Make sure virtualenv is provided + +"] + + ["Virtualenv activate" virtualenv-activate + :help " `virtualenv-activate' + +Activate the virtualenv located in DIR. "] + + ["Virtualenv deactivate" virtualenv-deactivate + :help " `virtualenv-deactivate' + +Deactivate the current virtual enviroment. "] + + ["Virtualenv p" virtualenv-p + :help " `virtualenv-p' + +Check if a directory is a virtualenv. "] + + ) + + ["Execute import or reload" py-execute-import-or-reload + :help " `py-execute-import-or-reload' + +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 `M-x py-execute-region'. + +This may be preferable to `M-x 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. "] + + ("Help" + + ["Describe mode" py-describe-mode t] + + ["Help on symbol" py-describe-symbol + :help "`py-describe-symbol'\n +Use pydoc on symbol at point"] + + ;; ["py-complete-help" py-complete-help + ;; :help " `py-complete-help' + ;; Get help on a Python expression.\n + ;; Needs Pymacs "] + ;; + ;; ["Help thing at point" py-complete-help-thing-at-point + ;; :help " `py-complete-help-thing-at-point'\n + ;; Needs Pymacs "] + + ;; ["Signature" py-complete-signature-expr + ;; :help " Print object's signature\n + ;; Needs Pymacs"] + + ) + + ["Debugger" pdb :help "`pdb' Run pdb under GUD"] + + ("Checks" + + ["pychecker-run" py-pychecker-run + :help "`py-pychecker-run' +Run pychecker + +Call `easy_install pyflakes' resp. `pip... 'if not available"] + + ("Pylint " + :help "Extendet report options + +Call `easy_install pylint' resp. `pip...' if not available" + + ["py-pylint-run" py-pylint-run + :help "`py-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' resp. `pip...' if not available +"] + + ["py-pylint-help" py-pylint-help + :help "`py-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' resp. `pip...' if not available" + + ["pep8-run" py-pep8-run + :help "`py-pep8-run' +Check formatting (default on the file currently visited) + +Call `easy_install pep8' resp. `pip...' 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' resp. `pip...' if not available" + + ["pyflakes-run" py-pyflakes-run :help + "`py-pyflakes-run' Run pyflakes + +Call `easy_install pyflakes' resp. `pip...' 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' "] + + ) + + ("Flake8 " :help + "code checker running " + + ["Flake8 run" py-flake8-run + :help " `py-flake8-run' + + Flake8 is a wrapper around these tools: + - PyFlakes + - pep8 + - Ned Batchelder's McCabe script + + It also adds features: + - files that contain this line are skipped:: + # flake8: noqa + - lines that contain a ``# noqa`` comment at the end will not issue warnings. + - a Git and a Mercurial hook. + - a McCabe complexity checker. + - extendable through ``flake8.extension`` entry points. + +. "] + + ["Flake8 help" py-flake8-help + :help " `py-flake8-help' + +Display flake8 command line help messages. "] + + ) + + ("Pyflakes-pep8 " :help + "Non intrusive code checker running `pyflakes' and `pep8' +call `easy_install pyflakes' resp. `pip...' and `easy_install pep8' if basics not available" + + ["pyflakespep8-run" py-pyflakespep8-run :help + "`py-pyflakespep8-run' Run `pyflakespep8' + +Call `easy_install pyflakes' resp. `pip...' 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' "]) + + ) + + ("Customize" + + ["Python-mode customize group" (customize-group 'python-mode) + :help "Open the customization buffer for Python mode"] + ("Switches" + :help "Toggle useful modes like `highlight-indentation'" + + ("Interpreter" + + ["Execute without temporary file" + (setq py-execute-no-temp-p + (not py-execute-no-temp-p)) + :help " `py-execute-no-temp-p' +Seems Emacs-24.3 provided a way executing stuff without temporary files. +In experimental state yet " + :style toggle :selected py-execute-no-temp-p] + + ["Warn tmp files left " + (setq py-warn-tmp-files-left-p + (not py-warn-tmp-files-left-p)) + :help "Messages a warning, when `py-temp-directory' contains files susceptible being left by previous Python-mode sessions. See also lp:987534 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-warn-tmp-files-left-p] + + ["Shell prompt read only" + (setq py-shell-prompt-read-only + (not py-shell-prompt-read-only)) + :help "If non-nil, the python prompt is read only. Setting this +variable will only effect new shells.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-shell-prompt-read-only] + + ["Remove cwd from path" + (setq py-remove-cwd-from-path + (not py-remove-cwd-from-path)) + :help "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).Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-remove-cwd-from-path] + + ["Honor IPYTHONDIR " + (setq py-honor-IPYTHONDIR-p + (not py-honor-IPYTHONDIR-p)) + :help "When non-nil ipython-history file is constructed by \$IPYTHONDIR +followed by "/history". Default is nil. + +Otherwise value of py-ipython-history is used. Use `M-x customize-variable' to set it permanently" +:style toggle :selected py-honor-IPYTHONDIR-p] + + ["Honor PYTHONHISTORY " + (setq py-honor-PYTHONHISTORY-p + (not py-honor-PYTHONHISTORY-p)) + :help "When non-nil python-history file is set by \$PYTHONHISTORY +Default is nil. + +Otherwise value of py-python-history is used. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-honor-PYTHONHISTORY-p] + + ["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 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'. "] + + ["Run `py-shell' at start" + (setq py-start-run-py-shell + (not py-start-run-py-shell)) + :help "If `python-mode' should start a python-shell, `py-shell'. + +Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-start-run-py-shell] + + ["Start run ipython shell" + (setq py-start-run-ipython-shell + (not py-start-run-ipython-shell)) + :help "If `python-mode' should start an ipython-shell. + +Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-start-run-ipython-shell] + + ) + + ("Execute" + + ["Force shell name " + (setq py-force-py-shell-name-p + (not py-force-py-shell-name-p)) + :help "When `t', execution with kind of Python specified in `py-shell-name' is enforced, possibly shebang doesn't take precedence. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-force-py-shell-name-p] + + ["Enforce py-output-buffer" + (setq py-enforce-output-buffer-p + (not py-enforce-output-buffer-p)) + :help " `py-enforce-output-buffer-p' + +When non-nil, value of `py-output-buffer' is used for output, +regardless of environment. Default is nil." + :style toggle :selected py-enforce-output-buffer-p] + + ["Cleanup temporary" + (setq py-cleanup-temporary + (not py-cleanup-temporary)) + :help "If temporary buffers and files used by functions executing region should be deleted afterwards. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-cleanup-temporary] + + ["Execute no temp " + (setq py-execute-no-temp-p + (not py-execute-no-temp-p)) + :help "Seems Emacs-24.3 provided a way executing stuff without temporary files. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-execute-no-temp-p] + + ["Execute \"if name == main\" blocks p" + (setq py-if-name-main-permission-p + (not py-if-name-main-permission-p)) + :help " `py-if-name-main-permission-p' + +Allow execution of code inside blocks delimited by +if __name__ == '__main__' + +Default is non-nil. " + :style toggle :selected py-if-name-main-permission-p] + + ["Ask about save" + (setq py-ask-about-save + (not py-ask-about-save)) + :help "If not nil, ask about which buffers to save before executing some code. +Otherwise, all modified buffers are saved without asking.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-ask-about-save] + + ["Store result" + (setq py-store-result-p + (not py-store-result-p)) + :help " `py-store-result-p' + +When non-nil, put resulting string of `py-execute-...' into kill-ring, so it might be yanked. " + :style toggle :selected py-store-result-p] + + ["Prompt on changed " + (setq py-prompt-on-changed-p + (not py-prompt-on-changed-p)) + :help "When called interactively, ask for save before a changed buffer is sent to interpreter. + +Default is `t'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-prompt-on-changed-p] + + ["Dedicated process " + (setq py-dedicated-process-p + (not py-dedicated-process-p)) + :help "If commands executing code use a dedicated shell. + +Default is nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-dedicated-process-p] + + ) + + ("TAB related" + + ["indent-tabs-mode" + (setq indent-tabs-mode + (not indent-tabs-mode)) + :help "Indentation can insert tabs if this is non-nil. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected indent-tabs-mode] + + ["Tab indent" + (setq py-tab-indent + (not py-tab-indent)) + :help "Non-nil means TAB in Python mode calls `py-indent-line'.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-indent] + + ["Tab shifts region " + (setq py-tab-shifts-region-p + (not py-tab-shifts-region-p)) + :help "If `t', TAB will indent/cycle the region, not just the current line. + +Default is nil +See also `py-tab-indents-region-p' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-shifts-region-p] + + ["Tab indents region " + (setq py-tab-indents-region-p + (not py-tab-indents-region-p)) + :help "When `t' and first TAB doesn't shift, indent-region is called. + +Default is nil +See also `py-tab-shifts-region-p' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-indents-region-p] + + ) + + ("Filling" + + ("Docstring styles" + :help "Toggle values of `py-docstring-style' +In order to set permanently customize this variable" + + ("Nil" + :help "Toggle nil value of `py-docstring-style' +Use `M-x customize-variable' to set it permanently" + + ["Toggle nil docstring style" toggle-py-nil-docstring-style + :help "If nil docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Nil on" py-nil-docstring-style-on + :help "Make sure, nil docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Nil off" py-nil-docstring-style-off + :help "Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Onetwo" + :help "Toggle onetwo value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle onetwo docstring style" toggle-py-onetwo-docstring-style + :help "If onetwo docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Onetwo on" py-onetwo-docstring-style-on + :help "Make sure, onetwo docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Onetwo off" py-onetwo-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Pep 257" + :help "Toggle pep-257 value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle pep 257 docstring style" toggle-py-pep-257-docstring-style + :help "If pep-257 docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 on" py-pep-257-docstring-style-on + :help "Make sure, pep-257 docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 off" py-pep-257-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Pep 257 nn" + :help "Toggle pep-257-nn value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle pep 257 nn docstring style" toggle-py-pep-257-nn-docstring-style + :help "If pep-257-nn docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 nn on" py-pep-257-nn-docstring-style-on + :help "Make sure, pep-257-nn docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 nn off" py-pep-257-nn-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Symmetric" + :help "Toggle symmetric value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle symmetric docstring style" toggle-py-symmetric-docstring-style + :help "If symmetric docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Symmetric on" py-symmetric-docstring-style-on + :help "Make sure, symmetric docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Symmetric off" py-symmetric-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Django" + :help "Toggle django value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle django docstring style" toggle-py-django-docstring-style + :help "If django docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Django on" py-django-docstring-style-on + :help "Make sure, django docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Django off" py-django-docstring-style-off + :help "Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + ) + + ["Fill-paragraph fill docstring " + (setq py-paragraph-fill-docstring-p + (not py-paragraph-fill-docstring-p)) + :help "If `py-fill-paragraph', when inside a docstring, should fill the complete string. + +Default is nil. + +Convenient use of `M-q' inside docstrings +See also `py-docstring-style' +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-paragraph-fill-docstring-p] + + ["Auto-fill mode" + (setq py-set-fill-column-p + (not py-set-fill-column-p)) + :help "Set Python specific `fill-column' according to `py-docstring-fill-column' and `py-comment-fill-column' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-set-fill-column-p] + + ["Use current dir when execute" + (setq py-use-current-dir-when-execute-p + (not py-use-current-dir-when-execute-p)) + :help " `toggle-py-use-current-dir-when-execute-p' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-current-dir-when-execute-p] + + ) + + ("Indent" + + ["Close at start column" + (setq py-closing-list-dedents-bos + (not py-closing-list-dedents-bos)) + :help "When non-nil, indent list's closing delimiter like start-column. + +It will be lined up under the first character of + the line that starts the multi-line construct, as in: + +my_list = \[ + 1, 2, 3, + 4, 5, 6, +] + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-closing-list-dedents-bos] + + ["Closing list keeps space" + (setq py-closing-list-keeps-space + (not py-closing-list-keeps-space)) + :help "If non-nil, closing parenthesis dedents onto column of opening plus `py-closing-list-space', default is nil Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-closing-list-keeps-space] + + ["Closing list space" + (setq py-closing-list-space + (not py-closing-list-space)) + :help "Number of chars, closing parenthesis outdent from opening, default is 1 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-closing-list-space] + + ["Tab shifts region " + (setq py-tab-shifts-region-p + (not py-tab-shifts-region-p)) + :help "If `t', TAB will indent/cycle the region, not just the current line. + +Default is nil +See also `py-tab-indents-region-p'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-shifts-region-p] + + ["Lhs inbound indent" + (setq py-lhs-inbound-indent + (not py-lhs-inbound-indent)) + :help "When line starts a multiline-assignment: How many colums indent should be more than opening bracket, brace or parenthesis. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-lhs-inbound-indent] + + ["Continuation offset" + (setq py-continuation-offset + (not py-continuation-offset)) + :help "With numeric ARG different from 1 py-continuation-offset is set to that value; returns py-continuation-offset. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-continuation-offset] + + ["Electric colon" + (setq py-electric-colon-active-p + (not py-electric-colon-active-p)) + :help " `py-electric-colon-active-p' + +`py-electric-colon' feature. Default is `nil'. See lp:837065 for discussions. " + :style toggle :selected py-electric-colon-active-p] + + ["Electric colon at beginning of block only" + (setq py-electric-colon-bobl-only + (not py-electric-colon-bobl-only)) + :help "When inserting a colon, do not indent lines unless at beginning of block. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-colon-bobl-only] + + ["Electric yank active " + (setq py-electric-yank-active-p + (not py-electric-yank-active-p)) + :help " When non-nil, `yank' will be followed by an `indent-according-to-mode'. + +Default is nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-yank-active-p] + + ["Electric kill backward " + (setq py-electric-kill-backward-p + (not py-electric-kill-backward-p)) + :help "Affects `py-electric-backspace'. Default is nil. + +If behind a delimited form of braces, brackets or parentheses, +backspace will kill it's contents + +With when cursor after +my_string\[0:1] +--------------^ + +==> + +my_string\[] +----------^ + +In result cursor is insided emptied delimited form.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-kill-backward-p] + + ["Trailing whitespace smart delete " + (setq py-trailing-whitespace-smart-delete-p + (not py-trailing-whitespace-smart-delete-p)) + :help "Default is nil. When t, python-mode calls + (add-hook 'before-save-hook 'delete-trailing-whitespace nil 'local) + +Also commands may delete trailing whitespace by the way. +When editing other peoples code, this may produce a larger diff than expected Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-trailing-whitespace-smart-delete-p] + + ["Newline delete trailing whitespace " + (setq py-newline-delete-trailing-whitespace-p + (not py-newline-delete-trailing-whitespace-p)) + :help "Delete trailing whitespace maybe left by `py-newline-and-indent'. + +Default is `t'. See lp:1100892 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-newline-delete-trailing-whitespace-p] + + ["Dedent keep relative column" + (setq py-dedent-keep-relative-column + (not py-dedent-keep-relative-column)) + :help "If point should follow dedent or kind of electric move to end of line. Default is t - keep relative position. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-dedent-keep-relative-column] + + ["Indent paren spanned multilines " + (setq py-indent-paren-spanned-multilines-p + (not py-indent-paren-spanned-multilines-p)) + :help "If non-nil, indents elements of list a value of `py-indent-offset' to first element: + +def foo(): + if (foo && + baz): + bar() + +Default lines up with first element: + +def foo(): + if (foo && + baz): + bar() +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-paren-spanned-multilines-p] + + ["Indent honors multiline listing" + (setq py-indent-honors-multiline-listing + (not py-indent-honors-multiline-listing)) + :help "If `t', indents to 1\+ column of opening delimiter. If `nil', indent adds one level to the beginning of statement. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-honors-multiline-listing] + + ["Indent comment " + (setq py-indent-comments + (not py-indent-comments)) + :help "If comments should be indented like code. Default is `nil'. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-comments] + + ["Uncomment indents " + (setq py-uncomment-indents-p + (not py-uncomment-indents-p)) + :help "When non-nil, after uncomment indent lines. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-uncomment-indents-p] + + ["Indent honors inline comment" + (setq py-indent-honors-inline-comment + (not py-indent-honors-inline-comment)) + :help "If non-nil, indents to column of inlined comment start. +Default is nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-honors-inline-comment] + + ["Kill empty line" + (setq py-kill-empty-line + (not py-kill-empty-line)) + :help "If t, py-indent-forward-line kills empty lines. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-kill-empty-line] + + ("Smart indentation" + :help "Toggle py-smart-indentation' + +Use `M-x customize-variable' to set it permanently" + + ["Toggle py-smart-indentation" toggle-py-smart-indentation + :help "Toggles py-smart-indentation + +Use `M-x customize-variable' to set it permanently"] + + ["py-smart-indentation on" py-smart-indentation-on + :help "Switches py-smart-indentation on + +Use `M-x customize-variable' to set it permanently"] + + ["py-smart-indentation off" py-smart-indentation-off + :help "Switches py-smart-indentation off + +Use `M-x customize-variable' to set it permanently"] + + ) + + ["Beep if tab change" + (setq py-beep-if-tab-change + (not py-beep-if-tab-change)) + :help "Ring the bell if `tab-width' is changed. +If a comment of the form + + # vi:set tabsize=: + +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 , `tab-width' is set to , 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.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-beep-if-tab-change] + + ["Highlight indentation" highlight-indentation + :help "Toggle highlight indentation. + +Use `M-x customize-variable' to set it permanently + +Make sure `highlight-indentation' is installed" + + ] + + ["Electric comment " + (setq py-electric-comment-p + (not py-electric-comment-p)) + :help "If \"#\" should call `py-electric-comment'. Default is `nil'. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-comment-p] + + ["Electric comment add space " + (setq py-electric-comment-add-space-p + (not py-electric-comment-add-space-p)) + :help "If py-electric-comment should add a space. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-comment-add-space-p] + + ["Empty line closes " + (setq py-empty-line-closes-p + (not py-empty-line-closes-p)) + :help "When non-nil, dedent after empty line following block + +if True: + print(\"Part of the if-statement\") + +print(\"Not part of the if-statement\") + +Default is nil + +If non-nil, a C-j from empty line dedents. +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-empty-line-closes-p] + + ) + + ("Fontification" + + ["Mark decorators" + (setq py-mark-decorators + (not py-mark-decorators)) + :help "If py-mark-def-or-class functions should mark decorators too. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-mark-decorators] + + ["Fontify shell buffer " + (setq py-fontify-shell-buffer-p + (not py-fontify-shell-buffer-p)) + :help "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 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-fontify-shell-buffer-p] + + ["Use font lock doc face " + (setq py-use-font-lock-doc-face-p + (not py-use-font-lock-doc-face-p)) + :help "If documention string inside of def or class get `font-lock-doc-face'. + +`font-lock-doc-face' inherits `font-lock-string-face'. + +Call M-x `customize-face' in order to have a visible effect. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-font-lock-doc-face-p] + + ) + ("Directory" + + ["Guess install directory " + (setq py-guess-py-install-directory-p + (not py-guess-py-install-directory-p)) + :help "If in cases, `py-install-directory' isn't set, `py-set-load-path'should guess it from `buffer-file-name'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-guess-py-install-directory-p] + + ["Use local default" + (setq py-use-local-default + (not py-use-local-default)) + :help "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. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-local-default] + + ["Use current dir when execute " + (setq py-use-current-dir-when-execute-p + (not py-use-current-dir-when-execute-p)) + :help "When `t', current directory is used by Python-shell for output of `py-execute-buffer' and related commands. + +See also `py-execute-directory'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-current-dir-when-execute-p] + + ["Keep shell dir when execute " + (setq py-keep-shell-dir-when-execute-p + (not py-keep-shell-dir-when-execute-p)) + :help "Don't change Python shell's current working directory when sending code. + +See also `py-execute-directory'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-keep-shell-dir-when-execute-p] + + ["Fileless buffer use default directory " + (setq py-fileless-buffer-use-default-directory-p + (not py-fileless-buffer-use-default-directory-p)) + :help "When `py-use-current-dir-when-execute-p' is non-nil and no buffer-file exists, value of `default-directory' sets current working directory of Python output shellUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-fileless-buffer-use-default-directory-p] + ) + + ("Display" + + ["Modeline display full path " + (setq py-modeline-display-full-path-p + (not py-modeline-display-full-path-p)) + :help "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. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-modeline-display-full-path-p] + + ["Modeline acronym display home " + (setq py-modeline-acronym-display-home-p + (not py-modeline-acronym-display-home-p)) + :help "If the modeline acronym should contain chars indicating the home-directory. + +Default is nil Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-modeline-acronym-display-home-p] + + ["Hide show hide docstrings" + (setq py-hide-show-hide-docstrings + (not py-hide-show-hide-docstrings)) + :help "Controls if doc strings can be hidden by hide-showUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-hide-show-hide-docstrings] + + ["Hide comments when hiding all" + (setq py-hide-comments-when-hiding-all + (not py-hide-comments-when-hiding-all)) + :help "Hide the comments too when you do an `hs-hide-all'.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-hide-comments-when-hiding-all] + + ["Max help buffer " + (setq py-max-help-buffer-p + (not py-max-help-buffer-p)) + :help "If \"\*Python-Help\*\"-buffer should appear as the only visible. + +Default is nil. In help-buffer, \"q\" will close it. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-max-help-buffer-p] + + ) + + ("Completion" + + ["Ipython complete use separate shell " + (setq ipython-complete-use-separate-shell-p + (not ipython-complete-use-separate-shell-p)) + :help "If `ipython-complete' should use a separate shell. Thus prompt-counter is not incremented by completion. Use `M-x customize-variable' to set it permanently" + :style toggle :selected ipython-complete-use-separate-shell-p] + + ["Set complete keymap " + (setq py-set-complete-keymap-p + (not py-set-complete-keymap-p)) + :help "If `py-complete-initialize', which sets up enviroment for Pymacs based py-complete, should load it's keys into `python-mode-map' + +Default is nil. +See also resp. edit `py-complete-set-keymap' Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-set-complete-keymap-p] + + ["No completion calls dabbrev expand " + (setq py-no-completion-calls-dabbrev-expand-p + (not py-no-completion-calls-dabbrev-expand-p)) + :help "If completion function should call dabbrev-expand when no completion found. Default is `t' + +See also `py-indent-no-completion-p'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-no-completion-calls-dabbrev-expand-p] + + ["Indent no completion " + (setq py-indent-no-completion-p + (not py-indent-no-completion-p)) + :help "If completion function should indent when no completion found. Default is `t' + +See also `py-no-completion-calls-dabbrev-expand-p'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-no-completion-p] + + ["Company pycomplete " + (setq py-company-pycomplete-p + (not py-company-pycomplete-p)) + :help "Load company-pycomplete stuff. Default is nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-company-pycomplete-p] + + ) + + ("Debug" + + ["Pdbtrack do tracking " + (setq py-pdbtrack-do-tracking-p + (not py-pdbtrack-do-tracking-p)) + :help "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.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-pdbtrack-do-tracking-p] + + ["Jump on exception" + (setq py-jump-on-exception + (not py-jump-on-exception)) + :help "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. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-jump-on-exception] + + ["Highlight error in source " + (setq py-highlight-error-source-p + (not py-highlight-error-source-p )) + :help "Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-highlight-error-source-p] + + ["Pylint offer current " + (setq py-pylint-offer-current-p + (not py-pylint-offer-current-p)) + :help "If current buffers file should be offered for check. + +Default is non-nil. If nil, `py-pylint-run' offers filename from history Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-pylint-offer-current-p] + + ) + + ["Switch buffers on execute" + (setq py-switch-buffers-on-execute-p + (not py-switch-buffers-on-execute-p)) + :help "When non-nil switch to the Python output buffer. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-switch-buffers-on-execute-p] + + ["Split windows on execute" + (setq py-split-windows-on-execute-p + (not py-split-windows-on-execute-p)) + :help "When non-nil split windows. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-split-windows-on-execute-p] + + ("Other" + + ["Defun use top level " + (setq py-defun-use-top-level-p + (not py-defun-use-top-level-p)) + :help "When non-nil, keys C-M-a, C-M-e address top-level form. + +Beginning- end-of-defun forms use +commands `py-beginning-of-top-level', `py-end-of-top-level' + +mark-defun marks top-level form at point etc. " + :style toggle :selected py-defun-use-top-level-p] + + ["Python mode v5 behavior" + (setq python-mode-v5-behavior-p + (not python-mode-v5-behavior-p)) + :help "Execute region through `shell-command-on-region' as +v5 did it - lp:990079. This might fail with certain chars - see UnicodeEncodeError lp:550661 + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected python-mode-v5-behavior-p] + + ["Load pymacs " + (setq py-load-pymacs-p + (not py-load-pymacs-p)) + :help "If Pymacs related stuff should be loaded. + +Default is nil. + +Pymacs has been written by François Pinard and many others. +See original source: http://pymacs.progiciels-bpi.caUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-load-pymacs-p] + + ["Verbose " + (setq py-verbose-p + (not py-verbose-p)) + :help "If functions should report results. + +Default is nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-verbose-p] + + ["Edit only " + (setq py-edit-only-p + (not py-edit-only-p)) + :help "When `t' `python-mode' will not take resort nor check for installed Python executables. Default is nil. + +See bug report at launchpad, lp:944093. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-edit-only-p] + + ["Imenu create index " + (setq py-imenu-create-index-p + (not py-imenu-create-index-p)) + :help "Non-nil means Python mode creates and displays an index menu of functions and global variables. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-imenu-create-index-p] + + ["Imenu show method args " + (setq py-imenu-show-method-args-p + (not py-imenu-show-method-args-p)) + :help "Controls echoing of arguments of functions & methods in the Imenu buffer. +When non-nil, arguments are printed.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-imenu-show-method-args-p] + + ["Match paren mode" + (setq py-match-paren-mode + (not py-match-paren-mode)) + :help "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. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-match-paren-mode] + + ["Close provides newline" + (setq py-close-provides-newline + (not py-close-provides-newline)) + :help "If a newline is inserted, when line after block isn't empty. Default is non-nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-close-provides-newline] + + ["Block comment prefix " + (setq py-block-comment-prefix-p + (not py-block-comment-prefix-p)) + :help "If py-comment inserts py-block-comment-prefix. + +Default is tUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-block-comment-prefix-p] + + ["Empty comment line separates paragraph " + (setq empty-comment-line-separates-paragraph-p + (not empty-comment-line-separates-paragraph-p)) + :help "Consider paragraph start/end lines with nothing inside but comment sign. + +Default is non-nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected empty-comment-line-separates-paragraph-p] + + ["Org cycle " + (setq py-org-cycle-p + (not py-org-cycle-p)) + :help "When non-nil, command `org-cycle' is available at shift-TAB, + +Default is nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-org-cycle-p] + + ("Underscore word syntax" + :help "Toggle `py-underscore-word-syntax-p'" + + ["Toggle underscore word syntax" toggle-py-underscore-word-syntax-p + :help " `toggle-py-underscore-word-syntax-p' + +If `py-underscore-word-syntax-p' should be on or off. + + Returns value of `py-underscore-word-syntax-p' switched to. . + +Use `M-x customize-variable' to set it permanently"] + + ["Underscore word syntax on" py-underscore-word-syntax-p-on + :help " `py-underscore-word-syntax-p-on' + +Make sure, py-underscore-word-syntax-p' is on. + +Returns value of `py-underscore-word-syntax-p'. . + +Use `M-x customize-variable' to set it permanently"] + + ["Underscore word syntax off" py-underscore-word-syntax-p-off + :help " `py-underscore-word-syntax-p-off' + +Make sure, `py-underscore-word-syntax-p' is off. + +Returns value of `py-underscore-word-syntax-p'. . + +Use `M-x customize-variable' to set it permanently"] + + ) + + ["Set pager cat" + (setq py-set-pager-cat-p + (not py-set-pager-cat-p)) + :help "If the shell environment variable \$PAGER should set to `cat'. + +If `t', use `C-c C-r' to jump to beginning of output. Then scroll normally. + +Avoids lp:783828, \"Terminal not fully functional\", for help('COMMAND') in python-shell + +When non-nil, imports module `os' Use `M-x customize-variable' to +set it permanently" + :style toggle :selected py-set-pager-cat-p] + + ["Current defun show" + (setq py-current-defun-show + (not py-current-defun-show)) + :help "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'.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-current-defun-show] + + ("Autopair mode" + :help "Toggle `autopair-mode'" + + ["Toggle autopair mode" toggle-py-autopair-mode + :help " `toggle-autopair-mode' + +If `autopair-mode' should be on or off. + + Returns value of `autopair-mode ' switched to. "] + + ["Autopair mode on" py-autopair-mode-on + :help " `autopair-mode on' + +Make sure, `autopair-mode' is on. + +Returns value of `autopair-mode'. "] + + ["Autopair mode off" py-autopair-mode-off + :help " `autopair-mode' off + +Make sure, `autopair-mode' is off. + +Returns value of `autopair-mode'. "] + + ) + + ["Switch index-function" py-switch-imenu-index-function + :help "`py-switch-imenu-index-function' +Switch between `py-imenu-create-index' from 5.1 series and `py-imenu-create-index-new'."] + + ;; py-smart-operator-mode-p forms + ("Smart operator mode" + :help "Toggle `smart-operator-mode'" + + ["Toggle smart operator mode" toggle-py-smart-operator-mode-p + :help " `toggle-smart-operator-mode' + +If `smart-operator-mode' should be on or off. + + Returns value of `smart-operator-mode ' switched to. "] + + ["Smart operator mode on" py-smart-operator-mode-p-on + :help " `smart-operator-mode -on' + +Make sure, `smart-operator-mode' is on. + +Returns value of `smart-operator-mode'. "] + + ["Smart operator mode off" py-smart-operator-mode-p-off + :help " `smart-operator-mode' off + +Make sure, `smart-operator-mode' is off. + +Returns value of `smart-operator-mode'. "] + + ) + ) + ) + ) + + ("More... " + ("Edit commands " + + ("Kill " + + ["Kill statement" py-kill-statement + :help "`py-kill-statement' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill top level" py-kill-top-level + :help " `py-kill-top-level' + +Delete top-level form at point. + +Stores data in kill ring. Might be yanked back using `C-y'. "] + + ["Kill clause" py-kill-clause + :help "`py-kill-clause' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill block" py-kill-block + :help "`py-kill-block' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill minor block" py-kill-minor-block + :help " `py-kill-minor-block' + +Delete minor-block at point. + +Stores data in kill ring. Might be yanked back using `C-y'. "] + + ["Kill def-or-class" py-kill-def-or-class + :help "`py-kill-def-or-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill expression" py-kill-expression + :help "`py-kill-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill partial-expression" py-kill-partial-expression + :help "`py-kill-partial-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill class" py-kill-class + :help "`py-kill-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill def" py-kill-def + :help "`py-kill-def' +Delete innermost compound statement at point, store deleted string in kill-ring"]) + + ("Delete" + ["Delete statement " py-delete-statement + :help "`py-delete-statement' +Delete STATEMENT at point, don't store in kill-ring. "] + + ["Delete top-level " py-delete-top-level + :help "`py-delete-top-level' +Delete TOP-LEVEL at point, don't store in kill-ring. "] + + ["Delete block " py-delete-block + :help "`py-delete-block' +Delete BLOCK at point, don't store in kill-ring. "] + + ["Delete block-or-clause " py-delete-block-or-clause + :help "`py-delete-block-or-clause' +Delete BLOCK-OR-CLAUSE at point, don't store in kill-ring. "] + + ["Delete def " py-delete-def + :help "`py-delete-def' +Delete DEF at point, don't store in kill-ring. "] + + ["Delete class " py-delete-class + :help "`py-delete-class' +Delete CLASS at point, don't store in kill-ring. "] + + ["Delete def-or-class " py-delete-def-or-class + :help "`py-delete-def-or-class' +Delete DEF-OR-CLASS at point, don't store in kill-ring. "] + + ["Delete expression " py-delete-expression + :help "`py-delete-expression' +Delete EXPRESSION at point, don't store in kill-ring. "] + + ["Delete partial-expression " py-delete-partial-expression + :help "`py-delete-partial-expression' +Delete PARTIAL-EXPRESSION at point, don't store in kill-ring. "] + + ["Delete minor-block " py-delete-minor-block + :help "`py-delete-minor-block' +Delete MINOR-BLOCK at point, don't store in kill-ring. + +A minor block is started by a `for', `if', `try' or `with'. "] + ) + "-" + + ("Shift right " + ["Shift block right" py-shift-block-right + :help "`py-shift-block-right' +Shift block right. "] + + ["Shift clause right" py-shift-clause-right + :help "`py-shift-clause-right' +Shift clause right. "] + + ["Shift statement right" py-shift-statement-right + :help "`py-shift-statement-right' +Shift statement right. "] + + ["Shift minor block right" py-shift-minor-block-right + :help " `py-shift-minor-block-right' + +Indent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use \[universal-argument] to specify a different value. + +Returns outmost indentation reached. "] + + ["Shift def-or-class right" py-shift-def-or-class-right + :help "`py-shift-def-or-class-right' +Shift def-or-class right. "] + + ["Shift class right" py-shift-class-right + :help "`py-shift-class-right' +Shift class right. "] + + ["Shift def right" py-shift-def-right + :help "`py-shift-def-right' +Shift def right. "] + + ["Shift block-or-clause right" py-shift-block-or-clause-right + :help "`py-shift-block-or-clause-right' +Shift block-or-clause right. "] + + ["Shift region left" py-shift-region-left + :help " `py-shift-region-left' + +Dedent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is dedented. +Returns indentation reached. "] + + ["Shift region right" py-shift-region-right + :help " `py-shift-region-right' + +Indent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is indented. +Returns indentation reached. "] + + ) + + ("Shift left " + + ["Shift block left" py-shift-block-left + :help "`py-shift-block-left' +Shift block left. "] + + ["Shift clause left" py-shift-clause-left + :help "`py-shift-clause-left' +Shift clause left. "] + + ["Shift statement left" py-shift-statement-left + :help "`py-shift-statement-left' +Shift statement left. "] + + ["Shift minor block left" py-shift-minor-block-left + :help " `py-shift-minor-block-left' + +Dedent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use \[universal-argument] to specify a different value. + +Returns outmost indentation reached. "] + + ["Shift def-or-class left" py-shift-def-or-class-left + :help "`py-shift-def-or-class-left' +Shift def-or-class left. "] + + ["Shift class left" py-shift-class-left + :help "`py-shift-class-left' +Shift class left. "] + + ["Shift def left" py-shift-def-left + :help "`py-shift-def-left' +Shift def left. "] + + ["Shift block-or-clause left" py-shift-block-or-clause-left + :help "`py-shift-block-or-clause-left' +Shift block-or-clause left. "] + + ) + ("More" + :help "extended edit commands'" + + ["Empty out list backward" py-empty-out-list-backward + :help " `py-empty-out-list-backward' +Deletes all elements from list before point. "] + + ["Revert boolean assignent" py-boolswitch + :help " `py-boolswitch' +Edit the assigment of a boolean variable, rever them. + +I.e. switch it from \"True\" to \"False\" and vice versa "] + + ["Remove overlays at point" py-remove-overlays-at-point + :help " `py-remove-overlays-at-point' + +Remove overlays as set when `py-highlight-error-source-p' is non-nil. "] + + ) + + ) + + "-" + ("Forms " + ("Comment" + + ["Beginning of comment" py-beginning-of-comment + :help " `py-beginning-of-comment' +Go to beginning of comment at point. "] + + ["End of comment" py-end-of-comment + :help " `py-end-of-comment' + +Go to end of comment at point. "] + ) + ("Block" + ["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"] + + ["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. "] + + ["Up block" py-up-block + :help "`py-up-block' + +Go upwards to the beginning of next block below in buffer. + +Returns indentation if block found, nil otherwise. "] + + ["Copy block" py-copy-block + :help "`py-copy-block' +Copy innermost compound statement at point"] + + ["Kill block" py-kill-block + :help "`py-kill-block' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete block" py-delete-block + :help "`py-delete-block' +Delete innermost compound statement at point, don't store deleted string in kill-ring"] + + ["Shift block right" py-shift-block-right + :help "`py-shift-block-right' +Shift block right. "] + + ["Shift block left" py-shift-block-left + :help "`py-shift-block-left' +Shift block left. "] + + ["Comment block" py-comment-block + :help " `py-comment-block' + +Comments block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + ("Top-level form" + + ["Beginning of top-level form" py-beginning-of-top-level + :help "`py-beginning-of-top-level' +Go to start of top-level form form at point"] + + ["End of top-level form" py-end-of-top-level + :help "`py-end-of-top-level' +Go to end of top-level form at point"] + + ["Down top-level form" py-down-top-level + :help "`py-down-top-level' + +Go to the beginning of top-level form below in buffer. "] + + ["Up top-level form" py-up-top-level + :help "`py-up-top-level' + +Go upwards to the beginning of next top-level form in buffer. "] + + ["Copy top-level form" py-copy-top-level + :help "`py-copy-top-level' +Copy innermost top-level form at point"] + + ["Kill top-level form" py-kill-top-level + :help "`py-kill-top-level' +Delete top-level form at point, store deleted string in kill-ring"] + + ["Delete top-level form" py-delete-top-level + :help "`py-delete-top-level' +Delete top-level form at point, don't store deleted string in kill-ring"] + + ["Comment top-level form" py-comment-top-level + :help " `py-comment-top-level' + +Comments top-level form at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + ("Minor-block" + + ["Beginning of minor-block" py-beginning-of-minor-block + :help "`py-beginning-of-minor-block' +Go to start of innermost minor-block at point"] + ["End of minor-block" py-end-of-minor-block + :help "`py-end-of-minor-block' +Go to end of innermost minor-block at point"] + + ["Down minor-block" py-down-minor-block + :help "`py-down-minor-block' + +Go to the beginning of next minor-block below in buffer. + +Returns indentation if minor-block found, nil otherwise. "] + + ["Up minor-block" py-up-minor-block + :help "`py-up-minor-block' + +Go upwards to the beginning of next minor-block below in buffer. + +Returns indentation if minor-block found, nil otherwise. "] + + ["Copy minor-block" py-copy-minor-block + :help "`py-copy-minor-block' +Copy innermost minor-block at point"] + + ["Kill minor-block" py-kill-minor-block + :help "`py-kill-minor-block' +Delete innermost minor-block at point, store deleted string in kill-ring"] + + ["Delete minor-block" py-delete-minor-block + :help "`py-delete-minor-block' +Delete innermost minor-block at point, don't store deleted string in kill-ring"] + + ["Shift minor-block right" py-shift-minor-block-right + :help "`py-shift-minor-block-right' +Shift minor-block right. "] + + ["Shift minor-block left" py-shift-minor-block-left + :help "`py-shift-minor-block-left' +Shift minor-block left. "] + + ["Comment minor-block" py-comment-minor-block + :help " `py-comment-minor-block' + +Comments minor-block at point. + +Uses double hash (`#') comment starter when `py-minor-block-comment-prefix-p' is `t', +the default. "] + + ) + + ("Def-or-class " + + ["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"] + + ["Down def-or-class" py-down-def-or-class + :help "`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. "] + + ["Up def-or-class" py-up-def-or-class + :help "`py-up-def-or-class' + +Go upwards to the beginning of next def-or-class below in buffer. + +Returns indentation if def-or-class found, nil otherwise. "] + + ["Copy Def-or-Class" py-copy-def-or-class + :help "`py-copy-def-or-class' +Copy innermost definition at point"] + + ["Kill def-or-class" py-kill-def-or-class + :help "`py-kill-def-or-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete def-or-class" py-delete-def-or-class + :help "`py-delete-def-or-class' +Delete def-or-class at point, don't store deleted string in kill-ring"] + + ["Shift def-or-class right" py-shift-def-or-class-right + :help "`py-shift-def-or-class-right' +Shift def-or-class right. "] + + ["Shift def-or-class left" py-shift-def-or-class-left + :help "`py-shift-def-or-class-left' +Shift def-or-class left. "] + + ["Comment def or class" py-comment-def-or-class + :help " `py-comment-def-or-class' + +Comments def-or-class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Clause " + + ["Beginning of clause" py-beginning-of-clause + :help "`py-beginning-of-clause' +Go to start of innermost compound statement at point"] + ["End of clause" py-end-of-clause + :help "`py-end-of-clause' +Go to end of innermost compound statement at point"] + + ["Down clause" py-down-clause + :help "`py-down-clause' + +Go to the beginning of next clause below in buffer. + +Returns indentation if clause found, nil otherwise. "] + + ["Up clause" py-up-clause + :help "`py-up-clause' + +Go upwards to the beginning of next clause below in buffer. + +Returns indentation if clause found, nil otherwise. "] + + ["Copy clause" py-copy-clause + :help "`py-copy-clause' +Copy innermost compound statement at point"] + + ["Kill clause" py-kill-clause + :help "`py-kill-clause' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete clause" py-delete-clause + :help "`py-delete-clause' +Delete innermost compound statement at point, don't store deleted string in kill-ring"] + + ["Shift clause right" py-shift-clause-right + :help "`py-shift-clause-right' +Shift clause right. "] + + ["Shift clause left" py-shift-clause-left + :help "`py-shift-clause-left' +Shift clause left. "] + + ["Comment clause" py-comment-clause + :help " `py-comment-clause' + +Comments clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Statement " + + ["Beginning of Statement" py-beginning-of-statement + :help "`py-beginning-of-statement' +Go to start of innermost definition at point"] + + ["End of Statement" py-end-of-statement + :help "`py-end-of-statement' +Go to end of innermost function definition at point"] + + ["Copy statement" py-copy-statement + :help "`py-copy-statement' +Copy innermost definition at point"] + + ["Kill statement" py-kill-statement + :help "`py-kill-statement' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete statement" py-delete-statement + :help "`py-delete-statement' +Delete statement at point, don't store deleted string in kill-ring"] + + ["Shift statement right" py-shift-statement-right + :help "`py-shift-statement-right' +Shift statement right. "] + + ["Shift statement left" py-shift-statement-left + :help "`py-shift-statement-left' +Shift statement left. "] + + ["Comment statement" py-comment-statement + :help " `py-comment-statement' + +Comments statement at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Expression" + + ["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 expression" py-beginning-of-expression + :help "`py-beginning-of-expression' +Go to start of a Python expression"] + + ["End of expression" py-end-of-expression + :help "`py-end-of-expression' +Go to end of a Python expression"] + + ["Copy expression" py-copy-expression + :help "`py-copy-expression' +Copy expression at point"] + + ["Kill expression" py-kill-expression + :help "`py-kill-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete expression" py-delete-expression + :help "`py-delete-expression' +Delete expression at point, don't store deleted string in kill-ring"]) + + ("Partial expression" + + ["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."] + + ["Copy partial expression" py-copy-partial-expression + :help "`py-copy-partial-expression' +\".\" operators delimit a partial-expression expression on it's level"] + + ["Kill partial-expression" py-kill-partial-expression + :help "`py-kill-partial-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete partial-expression" py-delete-partial-expression + :help "`py-delete-partial-expression' +Delete partial-expression at point, don't store deleted string in kill-ring"]) + + ("Class " + + ["Beginning of Class" py-beginning-of-class + :help "`py-beginning-of-class' +Go to start of innermost definition at point"] + + ["End of Class" py-end-of-class + :help "`py-end-of-class' +Go to end of innermost function definition at point"] + + ["Down class" py-down-class + :help "`py-down-class' + +Go to the beginning of next class below in buffer. + +Returns indentation if class found, nil otherwise. "] + + ["Up class" py-up-class + :help "`py-up-class' + +Go upwards to the beginning of next class below in buffer. + +Returns indentation if class found, nil otherwise. "] + + ["Copy class" py-copy-class + :help "`py-copy-class' +Copy innermost definition at point"] + + ["Kill class" py-kill-class + :help "`py-kill-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete class" py-delete-class + :help "`py-delete-class' +Delete class at point, don't store deleted string in kill-ring"] + + ["Shift class right" py-shift-class-right + :help "`py-shift-class-right' +Shift class right. "] + + ["Shift class left" py-shift-class-left + :help "`py-shift-class-left' +Shift class left. "] + + ["Comment class" py-comment-class + :help " `py-comment-class' + +Comments class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Def " + + ["Beginning of Def" py-beginning-of-def + :help "`py-beginning-of-def' +Go to start of innermost definition at point"] + + ["End of Def" py-end-of-def + :help "`py-end-of-def' +Go to end of innermost function definition at point"] + + ["Down def" py-down-def + :help "`py-down-def' + +Go to the beginning of next def below in buffer. + +Returns indentation if def found, nil otherwise. "] + + ["Up def" py-up-def + :help "`py-up-def' + +Go upwards to the beginning of next def below in buffer. + +Returns indentation if def found, nil otherwise. "] + + ["Copy def" py-copy-def + :help "`py-copy-def' +Copy innermost definition at point"] + + ["Kill def" py-kill-def + :help "`py-kill-def' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete def" py-delete-def + :help "`py-delete-def' +Delete def at point, don't store deleted string in kill-ring"] + + ["Shift def right" py-shift-def-right + :help "`py-shift-def-right' +Shift def right. "] + + ["Shift def left" py-shift-def-left + :help "`py-shift-def-left' +Shift def left. "] + + ["Comment def" py-comment-def + :help " `py-comment-def' + +Comments def at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + "-" + + ("Block bol " + + ["Beginning of block bol" py-beginning-of-block-bol + :help "`py-beginning-of-block-bol' +Go to beginning of line at beginning of block. + +Returns position reached, if successful, nil otherwise. "] + + ["End of block bol" py-end-of-block-bol + :help "`py-end-of-block-bol' +Go to beginning of line following end of block. + +Returns position reached, if successful, nil otherwise. "] + + ["Up block bol" py-up-block-bol + :help "`py-up-block-bol' +Go to next block upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down block bol" py-down-block-bol + :help "`py-down-block-bol' +Go to next block downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark block bol" py-mark-block-bol + :help "`py-mark-block-bol' +Mark block at point. "] + + ["Copy block bol" py-copy-block-bol + :help "`py-copy-block-bol' +Copy block at point. "] + + ["Kill block bol" py-kill-block-bol + :help "`py-kill-block-bol' +Kill block at point. "] + + ["Delete block bol" py-delete-block-bol + :help "`py-delete-block-bol' +Delete block at point. "] + + ["Shift block right" py-shift-block-right + :help "`py-shift-block-right' +Shift block right. "] + + ["Shift block left" py-shift-block-left + :help "`py-shift-block-left' +Shift block left. "] + ) + + ("Minor-block bol " + + ["Beginning of minor-block bol" py-beginning-of-minor-block-bol + :help "`py-beginning-of-minor-block-bol' +Go to beginning of line at beginning of minor-block. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["End of minor-block bol" py-end-of-minor-block-bol + :help "`py-end-of-minor-block-bol' +Go to beginning of line following end of minor-block. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Up minor-block bol" py-up-minor-block-bol + :help "`py-up-minor-block-bol' +Go to next minor-block upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Down minor-block bol" py-down-minor-block-bol + :help "`py-down-minor-block-bol' +Go to next minor-block downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Mark minor-block bol" py-mark-minor-block-bol + :help "`py-mark-minor-block-bol' +Mark minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Copy minor-block bol" py-copy-minor-block-bol + :help "`py-copy-minor-block-bol' +Copy minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Kill minor-block bol" py-kill-minor-block-bol + :help "`py-kill-minor-block-bol' +Kill minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Delete minor-block bol" py-delete-minor-block-bol + :help "`py-delete-minor-block-bol' +Delete minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Shift minor-block right" py-shift-minor-block-right + :help "`py-shift-minor-block-right' +Shift minor-block right. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Shift minor-block left" py-shift-minor-block-left + :help "`py-shift-minor-block-left' +Shift minor-block left. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ) + + ("Clause bol " + + ["Beginning of clause bol" py-beginning-of-clause-bol + :help "`py-beginning-of-clause-bol' +Go to beginning of line at beginning of clause. + +Returns position reached, if successful, nil otherwise. "] + + ["End of clause bol" py-end-of-clause-bol + :help "`py-end-of-clause-bol' +Go to beginning of line following end of clause. + +Returns position reached, if successful, nil otherwise. "] + + ["Up clause bol" py-up-clause-bol + :help "`py-up-clause-bol' +Go to next clause upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down clause bol" py-down-clause-bol + :help "`py-down-clause-bol' +Go to next clause downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark clause bol" py-mark-clause-bol + :help "`py-mark-clause-bol' +Mark clause at point. "] + + ["Copy clause bol" py-copy-clause-bol + :help "`py-copy-clause-bol' +Copy clause at point. "] + + ["Kill clause bol" py-kill-clause-bol + :help "`py-kill-clause-bol' +Kill clause at point. "] + + ["Delete clause bol" py-delete-clause-bol + :help "`py-delete-clause-bol' +Delete clause at point. "] + + ["Shift clause right" py-shift-clause-right + :help "`py-shift-clause-right' +Shift clause right. "] + + ["Shift clause left" py-shift-clause-left + :help "`py-shift-clause-left' +Shift clause left. "]) + + ("Block-Or-Clause bol " + + ["Beginning of block-or-clause bol" py-beginning-of-block-or-clause-bol + :help "`py-beginning-of-block-or-clause-bol' +Go to beginning of line at beginning of block-or-clause. + +Returns position reached, if successful, nil otherwise. "] + + ["End of block-or-clause bol" py-end-of-block-or-clause-bol + :help "`py-end-of-block-or-clause-bol' +Go to beginning of line following end of block-or-clause. + +Returns position reached, if successful, nil otherwise. "] + + ["Up block-or-clause bol" py-up-block-or-clause-bol + :help "`py-up-block-or-clause-bol' +Go to next block-or-clause upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down block-or-clause bol" py-down-block-or-clause-bol + :help "`py-down-block-or-clause-bol' +Go to next block-or-clause downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark block-or-clause bol" py-mark-block-or-clause-bol + :help "`py-mark-block-or-clause-bol' +Mark block-or-clause at point. "] + + ["Copy block-or-clause bol" py-copy-block-or-clause-bol + :help "`py-copy-block-or-clause-bol' +Copy block-or-clause at point. "] + + ["Kill block-or-clause bol" py-kill-block-or-clause-bol + :help "`py-kill-block-or-clause-bol' +Kill block-or-clause at point. "] + + ["Delete block-or-clause bol" py-delete-block-or-clause-bol + :help "`py-delete-block-or-clause-bol' +Delete block-or-clause at point. "] + + ["Shift block-or-clause right" py-shift-block-or-clause-right + :help "`py-shift-block-or-clause-right' +Shift block-or-clause right. "] + + ["Shift block-or-clause left" py-shift-block-or-clause-left + :help "`py-shift-block-or-clause-left' +Shift block-or-clause left. "]) + + ("Def bol " + + ["Beginning of def bol" py-beginning-of-def-bol + :help "`py-beginning-of-def-bol' +Go to beginning of line at beginning of def. + +Returns position reached, if successful, nil otherwise. "] + + ["End of def bol" py-end-of-def-bol + :help "`py-end-of-def-bol' +Go to beginning of line following end of def. + +Returns position reached, if successful, nil otherwise. "] + + ["Up def bol" py-up-def-bol + :help "`py-up-def-bol' +Go to next def upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down def bol" py-down-def-bol + :help "`py-down-def-bol' +Go to next def downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark def bol" py-mark-def-bol + :help "`py-mark-def-bol' +Mark def at point. "] + + ["Copy def bol" py-copy-def-bol + :help "`py-copy-def-bol' +Copy def at point. "] + + ["Kill def bol" py-kill-def-bol + :help "`py-kill-def-bol' +Kill def at point. "] + + ["Delete def bol" py-delete-def-bol + :help "`py-delete-def-bol' +Delete def at point. "] + + ["Shift def right" py-shift-def-right + :help "`py-shift-def-right' +Shift def right. "] + + ["Shift def left" py-shift-def-left + :help "`py-shift-def-left' +Shift def left. "]) + + ("Class bol " + ["Beginning of class bol" py-beginning-of-class-bol + :help "`py-beginning-of-class-bol' +Go to beginning of line at beginning of class. + +Returns position reached, if successful, nil otherwise. "] + + ["End of class bol" py-end-of-class-bol + :help "`py-end-of-class-bol' +Go to beginning of line following end of class. + +Returns position reached, if successful, nil otherwise. "] + + ["Up class bol" py-up-class-bol + :help "`py-up-class-bol' +Go to next class upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down class bol" py-down-class-bol + :help "`py-down-class-bol' +Go to next class downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark class bol" py-mark-class-bol + :help "`py-mark-class-bol' +Mark class at point. "] + + ["Copy class bol" py-copy-class-bol + :help "`py-copy-class-bol' +Copy class at point. "] + + ["Kill class bol" py-kill-class-bol + :help "`py-kill-class-bol' +Kill class at point. "] + + ["Delete class bol" py-delete-class-bol + :help "`py-delete-class-bol' +Delete class at point. "] + + ["Shift class right" py-shift-class-right + :help "`py-shift-class-right' +Shift class right. "] + + ["Shift class left" py-shift-class-left + :help "`py-shift-class-left' +Shift class left. "]) + + ("Def-Or-Class bol " + ["Beginning of def-or-class bol" py-beginning-of-def-or-class-bol + :help "`py-beginning-of-def-or-class-bol' +Go to beginning of line at beginning of def-or-class. + +Returns position reached, if successful, nil otherwise. "] + + ["End of def-or-class bol" py-end-of-def-or-class-bol + :help "`py-end-of-def-or-class-bol' +Go to beginning of line following end of def-or-class. + +Returns position reached, if successful, nil otherwise. "] + + ["Up def-or-class bol" py-up-def-or-class-bol + :help "`py-up-def-or-class-bol' +Go to next def-or-class upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down def-or-class bol" py-down-def-or-class-bol + :help "`py-down-def-or-class-bol' +Go to next def-or-class downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark def-or-class bol" py-mark-def-or-class-bol + :help "`py-mark-def-or-class-bol' +Mark def-or-class at point. "] + + ["Copy def-or-class bol" py-copy-def-or-class-bol + :help "`py-copy-def-or-class-bol' +Copy def-or-class at point. "] + + ["Kill def-or-class bol" py-kill-def-or-class-bol + :help "`py-kill-def-or-class-bol' +Kill def-or-class at point. "] + + ["Delete def-or-class bol" py-delete-def-or-class-bol + :help "`py-delete-def-or-class-bol' +Delete def-or-class at point. "] + + ["Shift def-or-class right" py-shift-def-or-class-right + :help "`py-shift-def-or-class-right' +Shift def-or-class right. "] + + ["Shift def-or-class left" py-shift-def-or-class-left + :help "`py-shift-def-or-class-left' +Shift def-or-class left. "] + + ) + + ("Statement bol " + ["Beginning of statement bol" py-beginning-of-statement-bol + :help "`py-beginning-of-statement-bol' +Go to beginning of line at beginning of statement. + +Returns position reached, if successful, nil otherwise. "] + + ["End of statement bol" py-end-of-statement-bol + :help "`py-end-of-statement-bol' +Go to beginning of line following end of statement. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark statement bol" py-mark-statement-bol + :help "`py-mark-statement-bol' +Mark statement at point. "] + + ["Copy statement bol" py-copy-statement-bol + :help "`py-copy-statement-bol' +Copy statement at point. "] + + ["Kill statement bol" py-kill-statement-bol + :help "`py-kill-statement-bol' +Kill statement at point. "] + + ["Delete statement bol" py-delete-statement-bol + :help "`py-delete-statement-bol' +Delete statement at point. "] + + ["Shift statement right" py-shift-statement-right + :help "`py-shift-statement-right' +Shift statement right. "] + + ["Shift statement left" py-shift-statement-left + :help "`py-shift-statement-left' +Shift statement left. "]) + ) + "-" + ("Filling" + :help "see also customizable `py-docstring-style'" + + ["Fill string" py-fill-string + :help " `py-fill-string' + +Uses value of `py-docstring-style', if set. "] + + ["Fill paragraph" py-fill-paragraph + :help " `py-fill-paragraph' + +Uses value of `py-docstring-style', if set. "] + + ["Fill comment" py-fill-comment + :help " `py-fill-comment' + +Fill comment at point. "] + + ["Fill string django-style " py-fill-string-django + :help " `py-fill-string-django' + + \"\"\" + Process foo, return bar. + \"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + "] + + ["py fill string onetwo" py-fill-string-onetwo + :help " `py-fill-string-onetwo' +One newline and start and Two at end style. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"] + + ["py fill string pep 257" py-fill-string-pep-257 + :help " `py-fill-string-pep-257' + +PEP-257 with 2 newlines at end of string. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"] + + ["py fill string pep 257 nn" py-fill-string-pep-257-nn + :help " `py-fill-string-pep-257-nn' + +PEP-257 with 1 newline at end of string. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"] + + ["py fill string symmetric" py-fill-string-symmetric + :help " `py-fill-string-symmetric' + +Symmetric style. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"]) + + ("Electric " + :help "electric commands'" + + ["Hungry delete backwards" py-hungry-delete-backwards + :help " `py-hungry-delete-backwards' + +Delete the preceding character or all preceding whitespace +back to the previous non-whitespace character. +See also C-c . "] + + ["Hungry delete forward" py-hungry-delete-forward + :help " `py-hungry-delete-forward' + +Delete the following character or all following whitespace +up to the next non-whitespace character. +See also C-c . "] + + ["Electric colon" py-electric-colon + :help " `py-electric-colon' +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. + +Switched by `py-electric-colon-active-p', default is nil +See also `py-electric-colon-greedy-p' "] + + ["Electric colon greedy " + (setq py-electric-colon-greedy-p + (not py-electric-colon-greedy-p)) + :help "If py-electric-colon should indent to the outmost reasonable level. + +If nil, default, it will not move from at any reasonable level. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-colon-greedy-p] + + ["Electric colon newline and indent " + (setq py-electric-colon-newline-and-indent-p + (not py-electric-colon-newline-and-indent-p)) + :help "If non-nil, `py-electric-colon' will call `newline-and-indent'. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-colon-newline-and-indent-p] + + ["Electric delete" py-electric-delete + :help " `py-electric-delete' +Delete following character or levels of whitespace. + +With ARG do that ARG times. "] + + ["Electric backspace" py-electric-backspace + :help " `py-electric-backspace' +Delete preceding character or level of indentation. + +With ARG do that ARG times. +Returns column reached. "] + + ["Electric comment" py-electric-comment + :help " `py-electric-comment' +Insert a comment. If starting a comment, indent accordingly. + +If a numeric argument ARG is provided, that many \"#\" are inserted +non-electrically. +With C-u \"#\" electric behavior is inhibited inside a string or comment. "] + + ["Electric left paren" py-complete-electric-lparen + :help " `py-complete-electric-lparen' +electricly insert '(', and try to get a signature for the stuff to the left.\n +Needs Pymacs"] + + ["Complete electric comma" py-complete-electric-comma + :help " `py-complete-electric-comma' +electricly insert ',', and redisplay latest signature.\n +Needs Pymacs"] + + ["Electric yank" py-electric-yank + :help " `py-electric-yank' +Perform command `yank' followed by an `indent-according-to-mode' . "]) + + ("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"] + + ) + + ("Completion" + :help "Completion options" + + ["Complete symbol" py-shell-complete + :help "`py-shell-complete' +Complete (qualified) symbol before point"] + + ["Complete" py-complete + :help " `py-complete' +Complete symbol before point using Pymacs . "]) + + ["Find function" py-find-function + :help "`py-find-function' +Try to find source definition of function at point"] + + ))))) + +(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 y)] 'py-electric-yank) + ;; 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-return-key) + ;; (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 [(super q)] 'py-copy-statement) + (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-help-at-point) + (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 + ;; (progn + ;; (define-key map [(meta tab)] py-complete-function) + ;; (define-key map [(esc) (tab)] py-complete-function)) + ;; (define-key map [(meta tab)] 'py-shell-complete) + ;; (define-key map [(esc) (tab)] 'py-shell-complete)) + (substitute-key-definition 'complete-symbol 'completion-at-point + map global-map) + (substitute-key-definition 'backward-up-list 'py-up + map global-map) + (substitute-key-definition 'down-list 'py-down + map global-map) + + (and (ignore-errors (require 'easymenu) t) + ;; (easy-menu-define py-menu map "Python Tools" + ;; `("PyTools" + (easy-menu-define + py-menu map "Python Mode menu" + `("Python" + ("Interpreter" + ["Default interpreter..." py-shell + :help " `py-shell' + +Start an interactive Python interpreter. + +Interactively, C-u 4 prompts for a buffer. +C-u 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. + +. "] + ("Other" + :help "Alternative Python Shells" + + ["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.3" python3.3 + :help "`python3.3' +Start an Python3.3 interpreter. + +Optional C-u prompts for options to pass to the Python3.3 interpreter. See `py-python-command-args'."] + + ["python3.4" python3.4 + :help "`python3.3' +Start an Python3.4 interpreter. + +Optional C-u prompts for options to pass to the Python3.4 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'."] + + "-" + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-on-execute-p'" + + ["Execute file python switch" py-execute-file-python-switch + :help " `py-execute-file-python-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python no-switch" py-execute-file-python-no-switch + :help " `py-execute-file-python-no-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python dedicated" py-execute-file-python-dedicated + :help " `py-execute-file-python-dedicated' +Send file to a Python interpreter. + +Uses a dedicated shell. "] + + ["Execute file python dedicated switch" py-execute-file-python-dedicated-switch + :help " `py-execute-file-python-dedicated-switch' +Send file to a Python interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython switch" py-execute-file-ipython-switch + :help " `py-execute-file-ipython-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython no-switch" py-execute-file-ipython-no-switch + :help " `py-execute-file-ipython-no-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file ipython dedicated" py-execute-file-ipython-dedicated + :help " `py-execute-file-ipython-dedicated' +Send file to a Ipython interpreter. + +Uses a dedicated shell. "] + + ["Execute file ipython dedicated switch" py-execute-file-ipython-dedicated-switch + :help " `py-execute-file-ipython-dedicated-switch' +Send file to a Ipython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 switch" py-execute-file-python3-switch + :help " `py-execute-file-python3-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 no-switch" py-execute-file-python3-no-switch + :help " `py-execute-file-python3-no-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3 dedicated" py-execute-file-python3-dedicated + :help " `py-execute-file-python3-dedicated' +Send file to a Python3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3 dedicated switch" py-execute-file-python3-dedicated-switch + :help " `py-execute-file-python3-dedicated-switch' +Send file to a Python3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 switch" py-execute-file-python2-switch + :help " `py-execute-file-python2-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 no-switch" py-execute-file-python2-no-switch + :help " `py-execute-file-python2-no-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2 dedicated" py-execute-file-python2-dedicated + :help " `py-execute-file-python2-dedicated' +Send file to a Python2 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2 dedicated switch" py-execute-file-python2-dedicated-switch + :help " `py-execute-file-python2-dedicated-switch' +Send file to a Python2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 switch" py-execute-file-python2.7-switch + :help " `py-execute-file-python2.7-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 no-switch" py-execute-file-python2.7-no-switch + :help " `py-execute-file-python2.7-no-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2.7 dedicated" py-execute-file-python2.7-dedicated + :help " `py-execute-file-python2.7-dedicated' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2.7 dedicated switch" py-execute-file-python2.7-dedicated-switch + :help " `py-execute-file-python2.7-dedicated-switch' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython switch" py-execute-file-jython-switch + :help " `py-execute-file-jython-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython no-switch" py-execute-file-jython-no-switch + :help " `py-execute-file-jython-no-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file jython dedicated" py-execute-file-jython-dedicated + :help " `py-execute-file-jython-dedicated' +Send file to a Jython interpreter. + +Uses a dedicated shell. "] + + ["Execute file jython dedicated switch" py-execute-file-jython-dedicated-switch + :help " `py-execute-file-jython-dedicated-switch' +Send file to a Jython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 switch" py-execute-file-python3.3-switch + :help " `py-execute-file-python3.3-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 no-switch" py-execute-file-python3.3-no-switch + :help " `py-execute-file-python3.3-no-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3.3 dedicated" py-execute-file-python3.3-dedicated + :help " `py-execute-file-python3.3-dedicated' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3.3 dedicated switch" py-execute-file-python3.3-dedicated-switch + :help " `py-execute-file-python3.3-dedicated-switch' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython switch" py-execute-file-bpython-switch + :help " `py-execute-file-bpython-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython no-switch" py-execute-file-bpython-no-switch + :help " `py-execute-file-bpython-no-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file bpython dedicated" py-execute-file-bpython-dedicated + :help " `py-execute-file-bpython-dedicated' +Send file to a Bpython interpreter. + +Uses a dedicated shell. "] + + ["Execute file bpython dedicated switch" py-execute-file-bpython-dedicated-switch + :help " `py-execute-file-bpython-dedicated-switch' +Send file to a Bpython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + ) + + ) + ) + + "-" + ("Mark" + + ["Mark block" py-mark-block + :help " `py-mark-block' + +Mark block at point. + +Returns beginning and end positions of marked area, a cons. "] + + ["Mark minor block" py-mark-minor-block + :help " `py-mark-minor-block' + +Mark minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. +Returns beginning and end positions of marked area, a cons. "] + + ["Mark def or class" py-mark-def-or-class + :help " `py-mark-def-or-class' + +Mark def-or-class at point. + +Returns beginning and end positions of marked area, a cons. "] + + ["Mark statement" py-mark-statement + :help "`py-mark-statement' +Mark statement at point"] + + ["Mark top level" py-mark-top-level + :help " `py-mark-top-level' + +Mark top-level form at point. + +Returns beginning and end positions of marked area, a cons. "] + + ["Mark clause" py-mark-clause + :help "`py-mark-clause' +Mark innermost compound statement at point"] + + ["Mark def" py-mark-def + :help "`py-mark-def' +Mark innermost definition at point"] + + ["Mark expression" py-mark-expression + :help "`py-mark-expression' +Mark expression at point"] + + ["Mark partial expression" py-mark-partial-expression + :help "`py-mark-partial-expression' +\".\" operators delimit a partial-expression expression on it's level"] + + ["Mark class" py-mark-class + :help "`py-mark-class' +Mark innermost definition at point"] + + ["Mark comment" py-mark-comment + :help "`py-mark-comment' +Mark commented section at point"] + + "-" + + ["Mark block bol" py-mark-block-bol + :help "`py-mark-block-bol' +Mark block at point reaching beginning-of-line. "] + + ["Mark clause bol" py-mark-clause-bol + :help "`py-mark-clause-bol' +Mark clause at point reaching beginning-of-line. "] + + ["Mark block-or-clause bol" py-mark-block-or-clause-bol + :help "`py-mark-block-or-clause-bol' +Mark block-or-clause at point reaching beginning-of-line. "] + + ["Mark def bol" py-mark-def-bol + :help "`py-mark-def-bol' +Mark def at point reaching beginning-of-line. "] + + ["Mark class bol" py-mark-class-bol + :help "`py-mark-class-bol' +Mark class at point reaching beginning-of-line. "] + + ["Mark def-or-class bol" py-mark-def-or-class-bol + :help "`py-mark-def-or-class-bol' +Mark def-or-class at point reaching beginning-of-line. "] + + ["Mark if-block bol" py-mark-if-block-bol + :help "`py-mark-if-block-bol' +Mark if-block at point reaching beginning-of-line. "] + + ["Mark try-block bol" py-mark-try-block-bol + :help "`py-mark-try-block-bol' +Mark try-block at point reaching beginning-of-line. "] + + ["Mark minor-block bol" py-mark-minor-block-bol + :help "`py-mark-minor-block-bol' + +Mark minor-block at point reaching beginning-of-line. +A minor block is started by a `for', `if', `try' or `with'."] + + ) + + "-" + + ["Shift region left" py-shift-region-left + :help " `py-shift-region-left' + +Dedent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is dedented. +Returns indentation reached. "] + + ["Shift region right" py-shift-region-right + :help " `py-shift-region-right' + +Indent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is indented. +Returns indentation reached. "] + + "-" + + ("Comment" + ["Comment Region" py-comment-region (point) (mark) + :help "Like `comment-region' but uses double hash (`#') comment starter." ] + ["Uncomment" py-uncomment + :help " `py-uncomment' + +Uncomment commented lines at point. + +If region is active, restrict uncommenting at region . "] + + ["Uncomment Region" (py-comment-region (point) (mark) '(4)) + :help "(py-comment-region (point) (mark) '(4))" ] + "-" + ["Comment block" py-comment-block + :help " `py-comment-block' +Comments block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment minor-block" py-comment-minor-block + :help " `py-comment-minor-block' +Comments minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment top level" py-comment-top-level + :help " `py-comment-top-level' + +Comments top-level form at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment clause" py-comment-clause + :help " `py-comment-clause' +Comments clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment block or clause" py-comment-block-or-clause + :help " `py-comment-block-or-clause' +Comments block-or-clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment def" py-comment-def + :help " `py-comment-def' +Comments def at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment class" py-comment-class + :help " `py-comment-class' +Comments class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment def or class" py-comment-def-or-class + :help " `py-comment-def-or-class' +Comments def-or-class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ["Comment statement" py-comment-statement + :help " `py-comment-statement' +Comments statement at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + "-" + + ("Move" + + ["Beginning of block" py-beginning-of-block + :help " `py-beginning-of-block' + +Go to beginning block, skip whitespace at BOL. "] + + ["Go to end of block" py-end-of-block] + + "-" + + ["Beginning of def or class" py-beginning-of-def-or-class + :help " `py-beginning-of-def-or-class' + +Go to beginning def-or-class, skip whitespace at BOL. + +Returns beginning of def-or-class if successful, nil otherwise + +When `py-mark-decorators' is non-nil, decorators are considered too. "] + + ["End of def or class" py-end-of-def-or-class + :help " `py-end-of-def-or-class' + +Go to end of def-or-class. + +Returns end of def-or-class if successful, nil otherwise + +With M-x universal argument or `py-mark-decorators' set to `t', decorators are marked too. "] + + "-" + + ["Beginning of statement" py-beginning-of-statement + :help " `py-beginning-of-statement' + +Go to the initial line of a simple statement. "] + + ["End of statement" py-end-of-statement + :help " `py-end-of-statement' + +Go to the last char of current statement. + +To go just beyond the final line of the current statement, use `py-down-statement-bol'. "] + + "-" + + ["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. "] + + "-" + + ("More" + + ["Up level" py-up + :help " `py-up' +Go to beginning one level above of compound statement or definition at point. "] + + ["Down level" py-down + :help " `py-down' +Go to beginning one level below of compound statement or definition at point. "] + + "-" + + ["Beginning of top level" py-beginning-of-top-level + :help " `py-beginning-of-top-level' + +Go to the very beginning of top-level form at point. "] + + ["End of top level" py-end-of-top-level + :help " `py-end-of-top-level' + +Go to end of top-level form at point. "] + + "-" + + ["Beginning of block current-column" py-beginning-of-block-current-column + :help " `py-beginning-of-block-current-column' + +Reach next beginning of block upwards which starts at current column. + +Return position. "] + + "-" + + ["Move to start of def" py-beginning-of-def t] + + ["Move to end of def" py-end-of-def t] + + "-" + + ["Beginning of clause" py-beginning-of-clause + :help " `py-beginning-of-clause' + +Go to beginning clause, skip whitespace at BOL. "] + + ["End of clause" py-end-of-clause + :help " `py-end-of-clause' + +Go to end of clause. "] + + "-" + + ["Beginning of comment" py-beginning-of-comment + :help " `py-beginning-of-comment' +Go to beginning of comment at point. "] + + ["End of comment" py-end-of-comment + :help " `py-end-of-comment' + +Go to end of comment at point. "] + + "-" + + ["Go to start of expression" (py-beginning-of-expression t) t] + ["Move to end of expression" (py-end-of-expression t) t] + + "-" + + ["Go to start of minor-expression" (py-beginning-of-minor-expression t) t] + + ["Move to end of minor-expression" (py-end-of-minor-expression t) t] + "-" + + ["Beginning of minor block" py-beginning-of-minor-block + :help " `py-beginning-of-minor-block' + +Go to beginning minor-block, skip whitespace at BOL. + +Returns beginning of minor-block if successful, nil otherwise + +A minor block is started by a `for', `if', `try' or `with'. + +"] + + ["End of minor block" py-end-of-minor-block + :help " `py-end-of-minor-block' + +Go to end of minor-block. + +Returns end of minor-block if successful, nil otherwise + +A minor block is started by a `for', `if', `try' or `with'. "] + + ) + + ) + + "-" + + ("Copy " + ["Copy statement" py-copy-statement + :help "`py-copy-statement' +Copy statement at point"] + + ["Copy top level" py-copy-top-level + :help " `py-copy-top-level' + +Copy top-level form at point. "] + + ["Copy clause" py-copy-clause + :help "`py-copy-clause' +Copy innermost clause at point"] + + ["Copy block" py-copy-block + :help "`py-copy-block' +Copy innermost block at point"] + + ["Copy minor block" py-copy-minor-block + :help " `py-copy-minor-block' + +Copy minor-block at point. + +Store data in kill ring, so it might yanked back. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Copy def" py-copy-def + :help "`py-copy-def' +Copy innermost definition 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"] + ["Copy class" py-copy-class + :help "`py-copy-class' +Copy innermost definition at point"] + + ["Copy Def-or-Class" py-copy-def-or-class + :help "`py-copy-def-or-class' +Copy innermost definition at point"] + + ) + + "-" + + ["Execute region" py-execute-region + :help " `py-execute-region' + +Send the region to a Python interpreter. + +When called with C-u 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. "] + + ["Execute buffer" py-execute-buffer + :help " `py-execute-buffer' + +Send the contents of the buffer to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +When called with C-u 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."] + + ["Execute def or class" py-execute-def-or-class + :help " `py-execute-def-or-class' + +Send def-or-class at point to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +See also `py-force-py-shell-name-p'. + +When called with C-u 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."] + + ["Execute statement" py-execute-statement + :help " `py-execute-statement' + +Send statement at point to a Python interpreter. + +When called with C-u, execution through `default-value' of `py-shell-name' is forced. +See also `py-force-py-shell-name-p'. + +When called with C-u 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."] + + ["Execute string" py-execute-string + :help " `py-execute-string' + +Send the argument STRING to a Python interpreter. + +See also `py-execute-region'. "] + ("More... " + :help "Python-specific features" + + ["Execute top level" py-execute-top-level + :help " `py-execute-top-level' + +Send top-level form at point to a Python interpreter. "] + + ["Execute block" py-execute-block + :help "`py-execute-block' + Send block at point to Python interpreter. "] + + ["Execute minor block" py-execute-minor-block + :help " `py-execute-minor-block' + +Send minor-block at point to a Python interpreter. + +A minor block is started by a `for', `if', `try' or `with'. +. "] + + ["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 file" py-execute-file + :help "`py-execute-file' + Send file 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.3" py-execute-statement-python3.3 + :help "Execute statement through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-statement-bpython" py-execute-statement-bpython + :help "Execute statement through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-statement-python3.3-dedicated + :help "Execute statement through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-statement-bpython-dedicated" py-execute-statement-bpython-dedicated + :help "Execute statement through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-statement-python3.3-switch + :help "Execute statement through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-statement-bpython-switch" py-execute-statement-bpython-switch + :help "Execute statement through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-statement-python3.3-dedicated-switch + :help "Execute statement through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-statement-bpython-dedicated-switch" py-execute-statement-bpython-dedicated-switch + :help "Execute statement through a unique Bpython 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.3" py-execute-block-python3.3 + :help "Execute block through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-block-bpython" py-execute-block-bpython + :help "Execute block through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-block-python3.3-dedicated + :help "Execute block through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-block-bpython-dedicated" py-execute-block-bpython-dedicated + :help "Execute block through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-block-python3.3-switch + :help "Execute block through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-block-bpython-switch" py-execute-block-bpython-switch + :help "Execute block through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-block-python3.3-dedicated-switch + :help "Execute block through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-block-bpython-dedicated-switch" py-execute-block-bpython-dedicated-switch + :help "Execute block through a unique Bpython 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.3" py-execute-def-python3.3 + :help "Execute def through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-def-bpython" py-execute-def-bpython + :help "Execute def through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-def-python3.3-dedicated + :help "Execute def through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-def-bpython-dedicated" py-execute-def-bpython-dedicated + :help "Execute def through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-def-python3.3-switch + :help "Execute def through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-def-bpython-switch" py-execute-def-bpython-switch + :help "Execute def through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-def-python3.3-dedicated-switch + :help "Execute def through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-def-bpython-dedicated-switch" py-execute-def-bpython-dedicated-switch + :help "Execute def through a unique Bpython 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.3" py-execute-class-python3.3 + :help "Execute class through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-class-bpython" py-execute-class-bpython + :help "Execute class through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-class-python3.3-dedicated + :help "Execute class through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-class-bpython-dedicated" py-execute-class-bpython-dedicated + :help "Execute class through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-class-python3.3-switch + :help "Execute class through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-class-bpython-switch" py-execute-class-bpython-switch + :help "Execute class through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-class-python3.3-dedicated-switch + :help "Execute class through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-class-bpython-dedicated-switch" py-execute-class-bpython-dedicated-switch + :help "Execute class through a unique Bpython 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.3" py-execute-region-python3.3 + :help "Execute region through a Python3.3 interpreter. + With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-region-bpython" py-execute-region-bpython + :help "Execute region through a Bpython interpreter. + With \\[universal-argument] use an unique Bpython 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.3-dedicated" py-execute-region-python3.3-dedicated + :help "Execute region through a unique Python3.3 interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + + ["py-execute-region-bpython-dedicated" py-execute-region-bpython-dedicated + :help "Execute region through a unique Bpython interpreter. +Optional \\[universal-argument] forces switch to output buffer, ignores `py-switch-buffers-on-execute-p'. "] + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-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.3-switch" py-execute-region-python3.3-switch + :help "Execute region through a Python3.3 interpreter. +With \\[universal-argument] use an unique Python3.3 interpreter. "] + + ["py-execute-region-bpython-switch" py-execute-region-bpython-switch + :help "Execute region through a Bpython interpreter. +With \\[universal-argument] use an unique Bpython 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.3-dedicated-switch" py-execute-region-python3.3-dedicated-switch + :help "Execute region through a unique Python3.3 interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + + ["py-execute-region-bpython-dedicated-switch" py-execute-region-bpython-dedicated-switch + :help "Execute region through a unique Bpython interpreter. +Switch to output buffer; ignores `py-switch-buffers-on-execute-p' "] + )) + + ;; file + ("Execute file " + :help "Execute file functions" + + ["Execute file python" py-execute-file-python + :help " `py-execute-file-python' +Send file to a Python interpreter. "] + + ["Execute file ipython" py-execute-file-ipython + :help " `py-execute-file-ipython' +Send file to a Ipython interpreter. "] + + ["Execute file python3" py-execute-file-python3 + :help " `py-execute-file-python3' +Send file to a Python3 interpreter. "] + + ["Execute file python2" py-execute-file-python2 + :help " `py-execute-file-python2' +Send file to a Python2 interpreter. "] + + ["Execute file python2.7" py-execute-file-python2.7 + :help " `py-execute-file-python2.7' +Send file to a Python2.7 interpreter. "] + + ["Execute file jython" py-execute-file-jython + :help " `py-execute-file-jython' +Send file to a Jython interpreter. "] + + ["Execute file python3.3" py-execute-file-python3.3 + :help " `py-execute-file-python3.3' +Send file to a Python3.3 interpreter. "] + + ["Execute file bpython" py-execute-file-bpython + :help " `py-execute-file-bpython' +Send file to a Bpython interpreter. "] + + ("Ignoring defaults " + :help "Commands will ignore default setting of +`py-switch-buffers-on-execute-p' and `py-split-windows-on-execute-p'" + + ["Execute file python switch" py-execute-file-python-switch + :help " `py-execute-file-python-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python no-switch" py-execute-file-python-no-switch + :help " `py-execute-file-python-no-switch' +Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python dedicated" py-execute-file-python-dedicated + :help " `py-execute-file-python-dedicated' +Send file to a Python interpreter. + +Uses a dedicated shell. "] + + ["Execute file python dedicated switch" py-execute-file-python-dedicated-switch + :help " `py-execute-file-python-dedicated-switch' +Send file to a Python interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython switch" py-execute-file-ipython-switch + :help " `py-execute-file-ipython-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file ipython no-switch" py-execute-file-ipython-no-switch + :help " `py-execute-file-ipython-no-switch' +Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file ipython dedicated" py-execute-file-ipython-dedicated + :help " `py-execute-file-ipython-dedicated' +Send file to a Ipython interpreter. + +Uses a dedicated shell. "] + + ["Execute file ipython dedicated switch" py-execute-file-ipython-dedicated-switch + :help " `py-execute-file-ipython-dedicated-switch' +Send file to a Ipython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 switch" py-execute-file-python3-switch + :help " `py-execute-file-python3-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3 no-switch" py-execute-file-python3-no-switch + :help " `py-execute-file-python3-no-switch' +Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3 dedicated" py-execute-file-python3-dedicated + :help " `py-execute-file-python3-dedicated' +Send file to a Python3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3 dedicated switch" py-execute-file-python3-dedicated-switch + :help " `py-execute-file-python3-dedicated-switch' +Send file to a Python3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 switch" py-execute-file-python2-switch + :help " `py-execute-file-python2-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2 no-switch" py-execute-file-python2-no-switch + :help " `py-execute-file-python2-no-switch' +Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2 dedicated" py-execute-file-python2-dedicated + :help " `py-execute-file-python2-dedicated' +Send file to a Python2 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2 dedicated switch" py-execute-file-python2-dedicated-switch + :help " `py-execute-file-python2-dedicated-switch' +Send file to a Python2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 switch" py-execute-file-python2.7-switch + :help " `py-execute-file-python2.7-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python2.7 no-switch" py-execute-file-python2.7-no-switch + :help " `py-execute-file-python2.7-no-switch' +Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python2.7 dedicated" py-execute-file-python2.7-dedicated + :help " `py-execute-file-python2.7-dedicated' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python2.7 dedicated switch" py-execute-file-python2.7-dedicated-switch + :help " `py-execute-file-python2.7-dedicated-switch' +Send file to a Python2.7 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython switch" py-execute-file-jython-switch + :help " `py-execute-file-jython-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file jython no-switch" py-execute-file-jython-no-switch + :help " `py-execute-file-jython-no-switch' +Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file jython dedicated" py-execute-file-jython-dedicated + :help " `py-execute-file-jython-dedicated' +Send file to a Jython interpreter. + +Uses a dedicated shell. "] + + ["Execute file jython dedicated switch" py-execute-file-jython-dedicated-switch + :help " `py-execute-file-jython-dedicated-switch' +Send file to a Jython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 switch" py-execute-file-python3.3-switch + :help " `py-execute-file-python3.3-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file python3.3 no-switch" py-execute-file-python3.3-no-switch + :help " `py-execute-file-python3.3-no-switch' +Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file python3.3 dedicated" py-execute-file-python3.3-dedicated + :help " `py-execute-file-python3.3-dedicated' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. "] + + ["Execute file python3.3 dedicated switch" py-execute-file-python3.3-dedicated-switch + :help " `py-execute-file-python3.3-dedicated-switch' +Send file to a Python3.3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython switch" py-execute-file-bpython-switch + :help " `py-execute-file-bpython-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + + ["Execute file bpython no-switch" py-execute-file-bpython-no-switch + :help " `py-execute-file-bpython-no-switch' +Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "nil". "] + + ["Execute file bpython dedicated" py-execute-file-bpython-dedicated + :help " `py-execute-file-bpython-dedicated' +Send file to a Bpython interpreter. + +Uses a dedicated shell. "] + + ["Execute file bpython dedicated switch" py-execute-file-bpython-dedicated-switch + :help " `py-execute-file-bpython-dedicated-switch' +Send file to a Bpython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value "non-nil". "] + ) + ) + ) + + "-" + + ("Virtualenv" + + ["Virtualenv workon" virtualenv-workon + :help " runs `virtualenv-workon' + +Make sure virtualenv is provided + +"] + + ["Virtualenv activate" virtualenv-activate + :help " `virtualenv-activate' + +Activate the virtualenv located in DIR. "] + + ["Virtualenv deactivate" virtualenv-deactivate + :help " `virtualenv-deactivate' + +Deactivate the current virtual enviroment. "] + + ["Virtualenv p" virtualenv-p + :help " `virtualenv-p' + +Check if a directory is a virtualenv. "] + + ) + + ["Execute import or reload" py-execute-import-or-reload + :help " `py-execute-import-or-reload' + +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 `M-x py-execute-region'. + +This may be preferable to `M-x 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. "] + + ("Help" + + ["Describe mode" py-describe-mode t] + + ["Help on symbol" py-help-at-point + :help "`py-help-at-point'\n +Use pydoc on symbol at point"] + + ;; ["py-complete-help" py-complete-help + ;; :help " `py-complete-help' + ;; Get help on a Python expression.\n + ;; Needs Pymacs "] + ;; + ;; ["Help thing at point" py-complete-help-thing-at-point + ;; :help " `py-complete-help-thing-at-point'\n + ;; Needs Pymacs "] + + ;; ["Signature" py-complete-signature-expr + ;; :help " Print object's signature\n + ;; Needs Pymacs"] + + ) + + ["Debugger" pdb :help "`pdb' Run pdb under GUD"] + + ("Checks" + + ["pychecker-run" py-pychecker-run + :help "`py-pychecker-run' +Run pychecker + +Call `easy_install pyflakes' resp. `pip... 'if not available"] + + ("Pylint " + :help "Extendet report options + +Call `easy_install pylint' resp. `pip...' if not available" + + ["py-pylint-run" py-pylint-run + :help "`py-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' resp. `pip...' if not available +"] + + ["py-pylint-help" py-pylint-help + :help "`py-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' resp. `pip...' if not available" + + ["pep8-run" py-pep8-run + :help "`py-pep8-run' +Check formatting (default on the file currently visited) + +Call `easy_install pep8' resp. `pip...' 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' resp. `pip...' if not available" + + ["pyflakes-run" py-pyflakes-run :help + "`py-pyflakes-run' Run pyflakes + +Call `easy_install pyflakes' resp. `pip...' 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' "] + + ) + + ("Flake8 " :help + "code checker running " + + ["Flake8 run" py-flake8-run + :help " `py-flake8-run' + + Flake8 is a wrapper around these tools: + - PyFlakes + - pep8 + - Ned Batchelder's McCabe script + + It also adds features: + - files that contain this line are skipped:: + # flake8: noqa + - lines that contain a ``# noqa`` comment at the end will not issue warnings. + - a Git and a Mercurial hook. + - a McCabe complexity checker. + - extendable through ``flake8.extension`` entry points. + +. "] + + ["Flake8 help" py-flake8-help + :help " `py-flake8-help' + +Display flake8 command line help messages. "] + + ) + + ("Pyflakes-pep8 " :help + "Non intrusive code checker running `pyflakes' and `pep8' +call `easy_install pyflakes' resp. `pip...' and `easy_install pep8' if basics not available" + + ["pyflakespep8-run" py-pyflakespep8-run :help + "`py-pyflakespep8-run' Run `pyflakespep8' + +Call `easy_install pyflakes' resp. `pip...' 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' "]) + + ) + + ("Customize" + + ["Python-mode customize group" (customize-group 'python-mode) + :help "Open the customization buffer for Python mode"] + ("Switches" + :help "Toggle useful modes like `highlight-indentation'" + + ("Interpreter" + + ["Execute without temporary file" + (setq py-execute-no-temp-p + (not py-execute-no-temp-p)) + :help " `py-execute-no-temp-p' +Seems Emacs-24.3 provided a way executing stuff without temporary files. +In experimental state yet " + :style toggle :selected py-execute-no-temp-p] + + ["Warn tmp files left " + (setq py-warn-tmp-files-left-p + (not py-warn-tmp-files-left-p)) + :help "Messages a warning, when `py-temp-directory' contains files susceptible being left by previous Python-mode sessions. See also lp:987534 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-warn-tmp-files-left-p] + + ["Shell prompt read only" + (setq py-shell-prompt-read-only + (not py-shell-prompt-read-only)) + :help "If non-nil, the python prompt is read only. Setting this +variable will only effect new shells.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-shell-prompt-read-only] + + ["Remove cwd from path" + (setq py-remove-cwd-from-path + (not py-remove-cwd-from-path)) + :help "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).Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-remove-cwd-from-path] + + ["Honor IPYTHONDIR " + (setq py-honor-IPYTHONDIR-p + (not py-honor-IPYTHONDIR-p)) + :help "When non-nil ipython-history file is constructed by \$IPYTHONDIR +followed by "/history". Default is nil. + +Otherwise value of py-ipython-history is used. Use `M-x customize-variable' to set it permanently" +:style toggle :selected py-honor-IPYTHONDIR-p] + + ["Honor PYTHONHISTORY " + (setq py-honor-PYTHONHISTORY-p + (not py-honor-PYTHONHISTORY-p)) + :help "When non-nil python-history file is set by \$PYTHONHISTORY +Default is nil. + +Otherwise value of py-python-history is used. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-honor-PYTHONHISTORY-p] + + ["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 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'. "] + + ["Run `py-shell' at start" + (setq py-start-run-py-shell + (not py-start-run-py-shell)) + :help "If `python-mode' should start a python-shell, `py-shell'. + +Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-start-run-py-shell] + + ["Start run ipython shell" + (setq py-start-run-ipython-shell + (not py-start-run-ipython-shell)) + :help "If `python-mode' should start an ipython-shell. + +Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-start-run-ipython-shell] + + ) + + ("Execute" + + ["Force shell name " + (setq py-force-py-shell-name-p + (not py-force-py-shell-name-p)) + :help "When `t', execution with kind of Python specified in `py-shell-name' is enforced, possibly shebang doesn't take precedence. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-force-py-shell-name-p] + + ["Enforce py-output-buffer" + (setq py-enforce-output-buffer-p + (not py-enforce-output-buffer-p)) + :help " `py-enforce-output-buffer-p' + +When non-nil, value of `py-output-buffer' is used for output, +regardless of environment. Default is nil." + :style toggle :selected py-enforce-output-buffer-p] + + ["Cleanup temporary" + (setq py-cleanup-temporary + (not py-cleanup-temporary)) + :help "If temporary buffers and files used by functions executing region should be deleted afterwards. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-cleanup-temporary] + + ["Execute no temp " + (setq py-execute-no-temp-p + (not py-execute-no-temp-p)) + :help "Seems Emacs-24.3 provided a way executing stuff without temporary files. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-execute-no-temp-p] + + ["Execute \"if name == main\" blocks p" + (setq py-if-name-main-permission-p + (not py-if-name-main-permission-p)) + :help " `py-if-name-main-permission-p' + +Allow execution of code inside blocks delimited by +if __name__ == '__main__' + +Default is non-nil. " + :style toggle :selected py-if-name-main-permission-p] + + ["Ask about save" + (setq py-ask-about-save + (not py-ask-about-save)) + :help "If not nil, ask about which buffers to save before executing some code. +Otherwise, all modified buffers are saved without asking.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-ask-about-save] + + ["Store result" + (setq py-store-result-p + (not py-store-result-p)) + :help " `py-store-result-p' + +When non-nil, put resulting string of `py-execute-...' into kill-ring, so it might be yanked. " + :style toggle :selected py-store-result-p] + + ["Prompt on changed " + (setq py-prompt-on-changed-p + (not py-prompt-on-changed-p)) + :help "When called interactively, ask for save before a changed buffer is sent to interpreter. + +Default is `t'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-prompt-on-changed-p] + + ["Dedicated process " + (setq py-dedicated-process-p + (not py-dedicated-process-p)) + :help "If commands executing code use a dedicated shell. + +Default is nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-dedicated-process-p] + + ) + + ("TAB related" + + ["indent-tabs-mode" + (setq indent-tabs-mode + (not indent-tabs-mode)) + :help "Indentation can insert tabs if this is non-nil. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected indent-tabs-mode] + + ["Tab indent" + (setq py-tab-indent + (not py-tab-indent)) + :help "Non-nil means TAB in Python mode calls `py-indent-line'.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-indent] + + ["Tab shifts region " + (setq py-tab-shifts-region-p + (not py-tab-shifts-region-p)) + :help "If `t', TAB will indent/cycle the region, not just the current line. + +Default is nil +See also `py-tab-indents-region-p' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-shifts-region-p] + + ["Tab indents region " + (setq py-tab-indents-region-p + (not py-tab-indents-region-p)) + :help "When `t' and first TAB doesn't shift, indent-region is called. + +Default is nil +See also `py-tab-shifts-region-p' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-indents-region-p] + + ) + + ("Filling" + + ("Docstring styles" + :help "Toggle values of `py-docstring-style' +In order to set permanently customize this variable" + + ("Nil" + :help "Toggle nil value of `py-docstring-style' +Use `M-x customize-variable' to set it permanently" + + ["Toggle nil docstring style" toggle-py-nil-docstring-style + :help "If nil docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Nil on" py-nil-docstring-style-on + :help "Make sure, nil docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Nil off" py-nil-docstring-style-off + :help "Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Onetwo" + :help "Toggle onetwo value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle onetwo docstring style" toggle-py-onetwo-docstring-style + :help "If onetwo docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Onetwo on" py-onetwo-docstring-style-on + :help "Make sure, onetwo docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Onetwo off" py-onetwo-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Pep 257" + :help "Toggle pep-257 value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle pep 257 docstring style" toggle-py-pep-257-docstring-style + :help "If pep-257 docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 on" py-pep-257-docstring-style-on + :help "Make sure, pep-257 docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 off" py-pep-257-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Pep 257 nn" + :help "Toggle pep-257-nn value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle pep 257 nn docstring style" toggle-py-pep-257-nn-docstring-style + :help "If pep-257-nn docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 nn on" py-pep-257-nn-docstring-style-on + :help "Make sure, pep-257-nn docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Pep 257 nn off" py-pep-257-nn-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Symmetric" + :help "Toggle symmetric value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle symmetric docstring style" toggle-py-symmetric-docstring-style + :help "If symmetric docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Symmetric on" py-symmetric-docstring-style-on + :help "Make sure, symmetric docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Symmetric off" py-symmetric-docstring-style-off + :help " Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + + ("Django" + :help "Toggle django value of `py-docstring-style' +In order to set permanently customize this variable" + + ["Toggle django docstring style" toggle-py-django-docstring-style + :help "If django docstring-style should be on or off + Returns value of `py-docstring-style' switched to + +Use `M-x customize-variable' to set it permanently"] + + ["Django on" py-django-docstring-style-on + :help "Make sure, django docstring-style is on + +Use `M-x customize-variable' to set it permanently"] + + ["Django off" py-django-docstring-style-off + :help "Restores default value of `py-docstring-style' + +Use `M-x customize-variable' to set it permanently"]) + ) + + ["Fill-paragraph fill docstring " + (setq py-paragraph-fill-docstring-p + (not py-paragraph-fill-docstring-p)) + :help "If `py-fill-paragraph', when inside a docstring, should fill the complete string. + +Default is nil. + +Convenient use of `M-q' inside docstrings +See also `py-docstring-style' +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-paragraph-fill-docstring-p] + + ["Auto-fill mode" + (setq py-set-fill-column-p + (not py-set-fill-column-p)) + :help "Set Python specific `fill-column' according to `py-docstring-fill-column' and `py-comment-fill-column' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-set-fill-column-p] + + ["Use current dir when execute" + (setq py-use-current-dir-when-execute-p + (not py-use-current-dir-when-execute-p)) + :help " `toggle-py-use-current-dir-when-execute-p' + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-current-dir-when-execute-p] + + ) + + ("Indent" + + ["Close at start column" + (setq py-closing-list-dedents-bos + (not py-closing-list-dedents-bos)) + :help "When non-nil, indent list's closing delimiter like start-column. + +It will be lined up under the first character of + the line that starts the multi-line construct, as in: + +my_list = \[ + 1, 2, 3, + 4, 5, 6, +] + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-closing-list-dedents-bos] + + ["Closing list keeps space" + (setq py-closing-list-keeps-space + (not py-closing-list-keeps-space)) + :help "If non-nil, closing parenthesis dedents onto column of opening plus `py-closing-list-space', default is nil Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-closing-list-keeps-space] + + ["Closing list space" + (setq py-closing-list-space + (not py-closing-list-space)) + :help "Number of chars, closing parenthesis outdent from opening, default is 1 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-closing-list-space] + + ["Tab shifts region " + (setq py-tab-shifts-region-p + (not py-tab-shifts-region-p)) + :help "If `t', TAB will indent/cycle the region, not just the current line. + +Default is nil +See also `py-tab-indents-region-p'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-tab-shifts-region-p] + + ["Lhs inbound indent" + (setq py-lhs-inbound-indent + (not py-lhs-inbound-indent)) + :help "When line starts a multiline-assignment: How many colums indent should be more than opening bracket, brace or parenthesis. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-lhs-inbound-indent] + + ["Continuation offset" + (setq py-continuation-offset + (not py-continuation-offset)) + :help "With numeric ARG different from 1 py-continuation-offset is set to that value; returns py-continuation-offset. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-continuation-offset] + + ["Electric colon" + (setq py-electric-colon-active-p + (not py-electric-colon-active-p)) + :help " `py-electric-colon-active-p' + +`py-electric-colon' feature. Default is `nil'. See lp:837065 for discussions. " + :style toggle :selected py-electric-colon-active-p] + + ["Electric colon at beginning of block only" + (setq py-electric-colon-bobl-only + (not py-electric-colon-bobl-only)) + :help "When inserting a colon, do not indent lines unless at beginning of block. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-colon-bobl-only] + + ["Electric yank active " + (setq py-electric-yank-active-p + (not py-electric-yank-active-p)) + :help " When non-nil, `yank' will be followed by an `indent-according-to-mode'. + +Default is nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-yank-active-p] + + ["Electric kill backward " + (setq py-electric-kill-backward-p + (not py-electric-kill-backward-p)) + :help "Affects `py-electric-backspace'. Default is nil. + +If behind a delimited form of braces, brackets or parentheses, +backspace will kill it's contents + +With when cursor after +my_string\[0:1] +--------------^ + +==> + +my_string\[] +----------^ + +In result cursor is insided emptied delimited form.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-kill-backward-p] + + ["Trailing whitespace smart delete " + (setq py-trailing-whitespace-smart-delete-p + (not py-trailing-whitespace-smart-delete-p)) + :help "Default is nil. When t, python-mode calls + (add-hook 'before-save-hook 'delete-trailing-whitespace nil 'local) + +Also commands may delete trailing whitespace by the way. +When editing other peoples code, this may produce a larger diff than expected Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-trailing-whitespace-smart-delete-p] + + ["Newline delete trailing whitespace " + (setq py-newline-delete-trailing-whitespace-p + (not py-newline-delete-trailing-whitespace-p)) + :help "Delete trailing whitespace maybe left by `py-newline-and-indent'. + +Default is `t'. See lp:1100892 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-newline-delete-trailing-whitespace-p] + + ["Dedent keep relative column" + (setq py-dedent-keep-relative-column + (not py-dedent-keep-relative-column)) + :help "If point should follow dedent or kind of electric move to end of line. Default is t - keep relative position. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-dedent-keep-relative-column] + + ["Indent paren spanned multilines " + (setq py-indent-paren-spanned-multilines-p + (not py-indent-paren-spanned-multilines-p)) + :help "If non-nil, indents elements of list a value of `py-indent-offset' to first element: + +def foo(): + if (foo && + baz): + bar() + +Default lines up with first element: + +def foo(): + if (foo && + baz): + bar() +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-paren-spanned-multilines-p] + + ["Indent honors multiline listing" + (setq py-indent-honors-multiline-listing + (not py-indent-honors-multiline-listing)) + :help "If `t', indents to 1\+ column of opening delimiter. If `nil', indent adds one level to the beginning of statement. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-honors-multiline-listing] + + ["Indent comment " + (setq py-indent-comments + (not py-indent-comments)) + :help "If comments should be indented like code. Default is `nil'. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-comments] + + ["Uncomment indents " + (setq py-uncomment-indents-p + (not py-uncomment-indents-p)) + :help "When non-nil, after uncomment indent lines. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-uncomment-indents-p] + + ["Indent honors inline comment" + (setq py-indent-honors-inline-comment + (not py-indent-honors-inline-comment)) + :help "If non-nil, indents to column of inlined comment start. +Default is nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-honors-inline-comment] + + ["Kill empty line" + (setq py-kill-empty-line + (not py-kill-empty-line)) + :help "If t, py-indent-forward-line kills empty lines. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-kill-empty-line] + + ("Smart indentation" + :help "Toggle py-smart-indentation' + +Use `M-x customize-variable' to set it permanently" + + ["Toggle py-smart-indentation" toggle-py-smart-indentation + :help "Toggles py-smart-indentation + +Use `M-x customize-variable' to set it permanently"] + + ["py-smart-indentation on" py-smart-indentation-on + :help "Switches py-smart-indentation on + +Use `M-x customize-variable' to set it permanently"] + + ["py-smart-indentation off" py-smart-indentation-off + :help "Switches py-smart-indentation off + +Use `M-x customize-variable' to set it permanently"] + + ) + + ["Beep if tab change" + (setq py-beep-if-tab-change + (not py-beep-if-tab-change)) + :help "Ring the bell if `tab-width' is changed. +If a comment of the form + + # vi:set tabsize=: + +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 , `tab-width' is set to , 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.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-beep-if-tab-change] + + ["Highlight indentation" highlight-indentation + :help "Toggle highlight indentation. + +Use `M-x customize-variable' to set it permanently + +Make sure `highlight-indentation' is installed" + + ] + + ["Electric comment " + (setq py-electric-comment-p + (not py-electric-comment-p)) + :help "If \"#\" should call `py-electric-comment'. Default is `nil'. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-comment-p] + + ["Electric comment add space " + (setq py-electric-comment-add-space-p + (not py-electric-comment-add-space-p)) + :help "If py-electric-comment should add a space. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-comment-add-space-p] + + ["Empty line closes " + (setq py-empty-line-closes-p + (not py-empty-line-closes-p)) + :help "When non-nil, dedent after empty line following block + +if True: + print(\"Part of the if-statement\") + +print(\"Not part of the if-statement\") + +Default is nil + +If non-nil, a C-j from empty line dedents. +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-empty-line-closes-p] + + ) + + ("Fontification" + + ["Mark decorators" + (setq py-mark-decorators + (not py-mark-decorators)) + :help "If py-mark-def-or-class functions should mark decorators too. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-mark-decorators] + + ["Fontify shell buffer " + (setq py-fontify-shell-buffer-p + (not py-fontify-shell-buffer-p)) + :help "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 Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-fontify-shell-buffer-p] + + ["Use font lock doc face " + (setq py-use-font-lock-doc-face-p + (not py-use-font-lock-doc-face-p)) + :help "If documention string inside of def or class get `font-lock-doc-face'. + +`font-lock-doc-face' inherits `font-lock-string-face'. + +Call M-x `customize-face' in order to have a visible effect. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-font-lock-doc-face-p] + + ) + ("Directory" + + ["Guess install directory " + (setq py-guess-py-install-directory-p + (not py-guess-py-install-directory-p)) + :help "If in cases, `py-install-directory' isn't set, `py-set-load-path'should guess it from `buffer-file-name'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-guess-py-install-directory-p] + + ["Use local default" + (setq py-use-local-default + (not py-use-local-default)) + :help "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. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-local-default] + + ["Use current dir when execute " + (setq py-use-current-dir-when-execute-p + (not py-use-current-dir-when-execute-p)) + :help "When `t', current directory is used by Python-shell for output of `py-execute-buffer' and related commands. + +See also `py-execute-directory'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-use-current-dir-when-execute-p] + + ["Keep shell dir when execute " + (setq py-keep-shell-dir-when-execute-p + (not py-keep-shell-dir-when-execute-p)) + :help "Don't change Python shell's current working directory when sending code. + +See also `py-execute-directory'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-keep-shell-dir-when-execute-p] + + ["Fileless buffer use default directory " + (setq py-fileless-buffer-use-default-directory-p + (not py-fileless-buffer-use-default-directory-p)) + :help "When `py-use-current-dir-when-execute-p' is non-nil and no buffer-file exists, value of `default-directory' sets current working directory of Python output shellUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-fileless-buffer-use-default-directory-p] + ) + + ("Display" + + ["Modeline display full path " + (setq py-modeline-display-full-path-p + (not py-modeline-display-full-path-p)) + :help "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. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-modeline-display-full-path-p] + + ["Modeline acronym display home " + (setq py-modeline-acronym-display-home-p + (not py-modeline-acronym-display-home-p)) + :help "If the modeline acronym should contain chars indicating the home-directory. + +Default is nil Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-modeline-acronym-display-home-p] + + ["Hide show hide docstrings" + (setq py-hide-show-hide-docstrings + (not py-hide-show-hide-docstrings)) + :help "Controls if doc strings can be hidden by hide-showUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-hide-show-hide-docstrings] + + ["Hide comments when hiding all" + (setq py-hide-comments-when-hiding-all + (not py-hide-comments-when-hiding-all)) + :help "Hide the comments too when you do an `hs-hide-all'.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-hide-comments-when-hiding-all] + + ["Max help buffer " + (setq py-max-help-buffer-p + (not py-max-help-buffer-p)) + :help "If \"\*Python-Help\*\"-buffer should appear as the only visible. + +Default is nil. In help-buffer, \"q\" will close it. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-max-help-buffer-p] + + ) + + ("Completion" + + ["Ipython complete use separate shell " + (setq ipython-complete-use-separate-shell-p + (not ipython-complete-use-separate-shell-p)) + :help "If `ipython-complete' should use a separate shell. Thus prompt-counter is not incremented by completion. Use `M-x customize-variable' to set it permanently" + :style toggle :selected ipython-complete-use-separate-shell-p] + + ["Set complete keymap " + (setq py-set-complete-keymap-p + (not py-set-complete-keymap-p)) + :help "If `py-complete-initialize', which sets up enviroment for Pymacs based py-complete, should load it's keys into `python-mode-map' + +Default is nil. +See also resp. edit `py-complete-set-keymap' Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-set-complete-keymap-p] + + ["No completion calls dabbrev expand " + (setq py-no-completion-calls-dabbrev-expand-p + (not py-no-completion-calls-dabbrev-expand-p)) + :help "If completion function should call dabbrev-expand when no completion found. Default is `t' + +See also `py-indent-no-completion-p'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-no-completion-calls-dabbrev-expand-p] + + ["Indent no completion " + (setq py-indent-no-completion-p + (not py-indent-no-completion-p)) + :help "If completion function should indent when no completion found. Default is `t' + +See also `py-no-completion-calls-dabbrev-expand-p'Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-indent-no-completion-p] + + ["Company pycomplete " + (setq py-company-pycomplete-p + (not py-company-pycomplete-p)) + :help "Load company-pycomplete stuff. Default is nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-company-pycomplete-p] + + ) + + ("Debug" + + ["Pdbtrack do tracking " + (setq py-pdbtrack-do-tracking-p + (not py-pdbtrack-do-tracking-p)) + :help "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.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-pdbtrack-do-tracking-p] + + ["Jump on exception" + (setq py-jump-on-exception + (not py-jump-on-exception)) + :help "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. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-jump-on-exception] + + ["Highlight error in source " + (setq py-highlight-error-source-p + (not py-highlight-error-source-p )) + :help "Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-highlight-error-source-p] + + ["Pylint offer current " + (setq py-pylint-offer-current-p + (not py-pylint-offer-current-p)) + :help "If current buffers file should be offered for check. + +Default is non-nil. If nil, `py-pylint-run' offers filename from history Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-pylint-offer-current-p] + + ) + + ["Switch buffers on execute" + (setq py-switch-buffers-on-execute-p + (not py-switch-buffers-on-execute-p)) + :help "When non-nil switch to the Python output buffer. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-switch-buffers-on-execute-p] + + ["Split windows on execute" + (setq py-split-windows-on-execute-p + (not py-split-windows-on-execute-p)) + :help "When non-nil split windows. + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-split-windows-on-execute-p] + + ("Other" + + ["Defun use top level " + (setq py-defun-use-top-level-p + (not py-defun-use-top-level-p)) + :help "When non-nil, keys C-M-a, C-M-e address top-level form. + +Beginning- end-of-defun forms use +commands `py-beginning-of-top-level', `py-end-of-top-level' + +mark-defun marks top-level form at point etc. " + :style toggle :selected py-defun-use-top-level-p] + + ["Python mode v5 behavior" + (setq python-mode-v5-behavior-p + (not python-mode-v5-behavior-p)) + :help "Execute region through `shell-command-on-region' as +v5 did it - lp:990079. This might fail with certain chars - see UnicodeEncodeError lp:550661 + +Use `M-x customize-variable' to set it permanently" + :style toggle :selected python-mode-v5-behavior-p] + + ["Load pymacs " + (setq py-load-pymacs-p + (not py-load-pymacs-p)) + :help "If Pymacs related stuff should be loaded. + +Default is nil. + +Pymacs has been written by François Pinard and many others. +See original source: http://pymacs.progiciels-bpi.caUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-load-pymacs-p] + + ["Verbose " + (setq py-verbose-p + (not py-verbose-p)) + :help "If functions should report results. + +Default is nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-verbose-p] + + ["Edit only " + (setq py-edit-only-p + (not py-edit-only-p)) + :help "When `t' `python-mode' will not take resort nor check for installed Python executables. Default is nil. + +See bug report at launchpad, lp:944093. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-edit-only-p] + + ["Imenu create index " + (setq py-imenu-create-index-p + (not py-imenu-create-index-p)) + :help "Non-nil means Python mode creates and displays an index menu of functions and global variables. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-imenu-create-index-p] + + ["Imenu show method args " + (setq py-imenu-show-method-args-p + (not py-imenu-show-method-args-p)) + :help "Controls echoing of arguments of functions & methods in the Imenu buffer. +When non-nil, arguments are printed.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-imenu-show-method-args-p] + + ["Match paren mode" + (setq py-match-paren-mode + (not py-match-paren-mode)) + :help "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. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-match-paren-mode] + + ["Close provides newline" + (setq py-close-provides-newline + (not py-close-provides-newline)) + :help "If a newline is inserted, when line after block isn't empty. Default is non-nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-close-provides-newline] + + ["Block comment prefix " + (setq py-block-comment-prefix-p + (not py-block-comment-prefix-p)) + :help "If py-comment inserts py-block-comment-prefix. + +Default is tUse `M-x customize-variable' to set it permanently" + :style toggle :selected py-block-comment-prefix-p] + + ["Empty comment line separates paragraph " + (setq empty-comment-line-separates-paragraph-p + (not empty-comment-line-separates-paragraph-p)) + :help "Consider paragraph start/end lines with nothing inside but comment sign. + +Default is non-nilUse `M-x customize-variable' to set it permanently" + :style toggle :selected empty-comment-line-separates-paragraph-p] + + ["Org cycle " + (setq py-org-cycle-p + (not py-org-cycle-p)) + :help "When non-nil, command `org-cycle' is available at shift-TAB, + +Default is nil. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-org-cycle-p] + + ("Underscore word syntax" + :help "Toggle `py-underscore-word-syntax-p'" + + ["Toggle underscore word syntax" toggle-py-underscore-word-syntax-p + :help " `toggle-py-underscore-word-syntax-p' + +If `py-underscore-word-syntax-p' should be on or off. + + Returns value of `py-underscore-word-syntax-p' switched to. . + +Use `M-x customize-variable' to set it permanently"] + + ["Underscore word syntax on" py-underscore-word-syntax-p-on + :help " `py-underscore-word-syntax-p-on' + +Make sure, py-underscore-word-syntax-p' is on. + +Returns value of `py-underscore-word-syntax-p'. . + +Use `M-x customize-variable' to set it permanently"] + + ["Underscore word syntax off" py-underscore-word-syntax-p-off + :help " `py-underscore-word-syntax-p-off' + +Make sure, `py-underscore-word-syntax-p' is off. + +Returns value of `py-underscore-word-syntax-p'. . + +Use `M-x customize-variable' to set it permanently"] + + ) + + ["Set pager cat" + (setq py-set-pager-cat-p + (not py-set-pager-cat-p)) + :help "If the shell environment variable \$PAGER should set to `cat'. + +If `t', use `C-c C-r' to jump to beginning of output. Then scroll normally. + +Avoids lp:783828, \"Terminal not fully functional\", for help('COMMAND') in python-shell + +When non-nil, imports module `os' Use `M-x customize-variable' to +set it permanently" + :style toggle :selected py-set-pager-cat-p] + + ["Current defun show" + (setq py-current-defun-show + (not py-current-defun-show)) + :help "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'.Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-current-defun-show] + + ("Autopair mode" + :help "Toggle `autopair-mode'" + + ["Toggle autopair mode" toggle-py-autopair-mode + :help " `toggle-autopair-mode' + +If `autopair-mode' should be on or off. + + Returns value of `autopair-mode ' switched to. "] + + ["Autopair mode on" py-autopair-mode-on + :help " `autopair-mode on' + +Make sure, `autopair-mode' is on. + +Returns value of `autopair-mode'. "] + + ["Autopair mode off" py-autopair-mode-off + :help " `autopair-mode' off + +Make sure, `autopair-mode' is off. + +Returns value of `autopair-mode'. "] + + ) + + ["Switch index-function" py-switch-imenu-index-function + :help "`py-switch-imenu-index-function' +Switch between `py-imenu-create-index' from 5.1 series and `py-imenu-create-index-new'."] + + ;; py-smart-operator-mode-p forms + ("Smart operator mode" + :help "Toggle `smart-operator-mode'" + + ["Toggle smart operator mode" toggle-py-smart-operator-mode-p + :help " `toggle-smart-operator-mode' + +If `smart-operator-mode' should be on or off. + + Returns value of `smart-operator-mode ' switched to. "] + + ["Smart operator mode on" py-smart-operator-mode-p-on + :help " `smart-operator-mode -on' + +Make sure, `smart-operator-mode' is on. + +Returns value of `smart-operator-mode'. "] + + ["Smart operator mode off" py-smart-operator-mode-p-off + :help " `smart-operator-mode' off + +Make sure, `smart-operator-mode' is off. + +Returns value of `smart-operator-mode'. "] + + ) + ) + ) + ) + + ("More... " + ("Edit commands " + + ("Kill " + + ["Kill statement" py-kill-statement + :help "`py-kill-statement' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill top level" py-kill-top-level + :help " `py-kill-top-level' + +Delete top-level form at point. + +Stores data in kill ring. Might be yanked back using `C-y'. "] + + ["Kill clause" py-kill-clause + :help "`py-kill-clause' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill block" py-kill-block + :help "`py-kill-block' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill minor block" py-kill-minor-block + :help " `py-kill-minor-block' + +Delete minor-block at point. + +Stores data in kill ring. Might be yanked back using `C-y'. "] + + ["Kill def-or-class" py-kill-def-or-class + :help "`py-kill-def-or-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill expression" py-kill-expression + :help "`py-kill-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill partial-expression" py-kill-partial-expression + :help "`py-kill-partial-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill class" py-kill-class + :help "`py-kill-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Kill def" py-kill-def + :help "`py-kill-def' +Delete innermost compound statement at point, store deleted string in kill-ring"]) + + ("Delete" + ["Delete statement " py-delete-statement + :help "`py-delete-statement' +Delete STATEMENT at point, don't store in kill-ring. "] + + ["Delete top-level " py-delete-top-level + :help "`py-delete-top-level' +Delete TOP-LEVEL at point, don't store in kill-ring. "] + + ["Delete block " py-delete-block + :help "`py-delete-block' +Delete BLOCK at point, don't store in kill-ring. "] + + ["Delete block-or-clause " py-delete-block-or-clause + :help "`py-delete-block-or-clause' +Delete BLOCK-OR-CLAUSE at point, don't store in kill-ring. "] + + ["Delete def " py-delete-def + :help "`py-delete-def' +Delete DEF at point, don't store in kill-ring. "] + + ["Delete class " py-delete-class + :help "`py-delete-class' +Delete CLASS at point, don't store in kill-ring. "] + + ["Delete def-or-class " py-delete-def-or-class + :help "`py-delete-def-or-class' +Delete DEF-OR-CLASS at point, don't store in kill-ring. "] + + ["Delete expression " py-delete-expression + :help "`py-delete-expression' +Delete EXPRESSION at point, don't store in kill-ring. "] + + ["Delete partial-expression " py-delete-partial-expression + :help "`py-delete-partial-expression' +Delete PARTIAL-EXPRESSION at point, don't store in kill-ring. "] + + ["Delete minor-block " py-delete-minor-block + :help "`py-delete-minor-block' +Delete MINOR-BLOCK at point, don't store in kill-ring. + +A minor block is started by a `for', `if', `try' or `with'. "] + ) + "-" + + ("Shift right " + ["Shift block right" py-shift-block-right + :help "`py-shift-block-right' +Shift block right. "] + + ["Shift clause right" py-shift-clause-right + :help "`py-shift-clause-right' +Shift clause right. "] + + ["Shift statement right" py-shift-statement-right + :help "`py-shift-statement-right' +Shift statement right. "] + + ["Shift minor block right" py-shift-minor-block-right + :help " `py-shift-minor-block-right' + +Indent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use \[universal-argument] to specify a different value. + +Returns outmost indentation reached. "] + + ["Shift def-or-class right" py-shift-def-or-class-right + :help "`py-shift-def-or-class-right' +Shift def-or-class right. "] + + ["Shift class right" py-shift-class-right + :help "`py-shift-class-right' +Shift class right. "] + + ["Shift def right" py-shift-def-right + :help "`py-shift-def-right' +Shift def right. "] + + ["Shift block-or-clause right" py-shift-block-or-clause-right + :help "`py-shift-block-or-clause-right' +Shift block-or-clause right. "] + + ["Shift region left" py-shift-region-left + :help " `py-shift-region-left' + +Dedent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is dedented. +Returns indentation reached. "] + + ["Shift region right" py-shift-region-right + :help " `py-shift-region-right' + +Indent region according to `py-indent-offset' by COUNT times. + +If no region is active, current line is indented. +Returns indentation reached. "] + + ) + + ("Shift left " + + ["Shift block left" py-shift-block-left + :help "`py-shift-block-left' +Shift block left. "] + + ["Shift clause left" py-shift-clause-left + :help "`py-shift-clause-left' +Shift clause left. "] + + ["Shift statement left" py-shift-statement-left + :help "`py-shift-statement-left' +Shift statement left. "] + + ["Shift minor block left" py-shift-minor-block-left + :help " `py-shift-minor-block-left' + +Dedent minor-block by COUNT spaces. + +COUNT defaults to `py-indent-offset', +use \[universal-argument] to specify a different value. + +Returns outmost indentation reached. "] + + ["Shift def-or-class left" py-shift-def-or-class-left + :help "`py-shift-def-or-class-left' +Shift def-or-class left. "] + + ["Shift class left" py-shift-class-left + :help "`py-shift-class-left' +Shift class left. "] + + ["Shift def left" py-shift-def-left + :help "`py-shift-def-left' +Shift def left. "] + + ["Shift block-or-clause left" py-shift-block-or-clause-left + :help "`py-shift-block-or-clause-left' +Shift block-or-clause left. "] + + ) + ("More" + :help "extended edit commands'" + + ["Empty out list backward" py-empty-out-list-backward + :help " `py-empty-out-list-backward' +Deletes all elements from list before point. "] + + ["Revert boolean assignent" py-boolswitch + :help " `py-boolswitch' +Edit the assigment of a boolean variable, rever them. + +I.e. switch it from \"True\" to \"False\" and vice versa "] + + ["Remove overlays at point" py-remove-overlays-at-point + :help " `py-remove-overlays-at-point' + +Remove overlays as set when `py-highlight-error-source-p' is non-nil. "] + + ) + + ) + + "-" + ("Forms " + ("Comment" + + ["Beginning of comment" py-beginning-of-comment + :help " `py-beginning-of-comment' +Go to beginning of comment at point. "] + + ["End of comment" py-end-of-comment + :help " `py-end-of-comment' + +Go to end of comment at point. "] + ) + ("Block" + ["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"] + + ["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. "] + + ["Up block" py-up-block + :help "`py-up-block' + +Go upwards to the beginning of next block below in buffer. + +Returns indentation if block found, nil otherwise. "] + + ["Copy block" py-copy-block + :help "`py-copy-block' +Copy innermost compound statement at point"] + + ["Kill block" py-kill-block + :help "`py-kill-block' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete block" py-delete-block + :help "`py-delete-block' +Delete innermost compound statement at point, don't store deleted string in kill-ring"] + + ["Shift block right" py-shift-block-right + :help "`py-shift-block-right' +Shift block right. "] + + ["Shift block left" py-shift-block-left + :help "`py-shift-block-left' +Shift block left. "] + + ["Comment block" py-comment-block + :help " `py-comment-block' + +Comments block at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + ("Top-level form" + + ["Beginning of top-level form" py-beginning-of-top-level + :help "`py-beginning-of-top-level' +Go to start of top-level form form at point"] + + ["End of top-level form" py-end-of-top-level + :help "`py-end-of-top-level' +Go to end of top-level form at point"] + + ["Down top-level form" py-down-top-level + :help "`py-down-top-level' + +Go to the beginning of top-level form below in buffer. "] + + ["Up top-level form" py-up-top-level + :help "`py-up-top-level' + +Go upwards to the beginning of next top-level form in buffer. "] + + ["Copy top-level form" py-copy-top-level + :help "`py-copy-top-level' +Copy innermost top-level form at point"] + + ["Kill top-level form" py-kill-top-level + :help "`py-kill-top-level' +Delete top-level form at point, store deleted string in kill-ring"] + + ["Delete top-level form" py-delete-top-level + :help "`py-delete-top-level' +Delete top-level form at point, don't store deleted string in kill-ring"] + + ["Comment top-level form" py-comment-top-level + :help " `py-comment-top-level' + +Comments top-level form at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + ("Minor-block" + + ["Beginning of minor-block" py-beginning-of-minor-block + :help "`py-beginning-of-minor-block' +Go to start of innermost minor-block at point"] + ["End of minor-block" py-end-of-minor-block + :help "`py-end-of-minor-block' +Go to end of innermost minor-block at point"] + + ["Down minor-block" py-down-minor-block + :help "`py-down-minor-block' + +Go to the beginning of next minor-block below in buffer. + +Returns indentation if minor-block found, nil otherwise. "] + + ["Up minor-block" py-up-minor-block + :help "`py-up-minor-block' + +Go upwards to the beginning of next minor-block below in buffer. + +Returns indentation if minor-block found, nil otherwise. "] + + ["Copy minor-block" py-copy-minor-block + :help "`py-copy-minor-block' +Copy innermost minor-block at point"] + + ["Kill minor-block" py-kill-minor-block + :help "`py-kill-minor-block' +Delete innermost minor-block at point, store deleted string in kill-ring"] + + ["Delete minor-block" py-delete-minor-block + :help "`py-delete-minor-block' +Delete innermost minor-block at point, don't store deleted string in kill-ring"] + + ["Shift minor-block right" py-shift-minor-block-right + :help "`py-shift-minor-block-right' +Shift minor-block right. "] + + ["Shift minor-block left" py-shift-minor-block-left + :help "`py-shift-minor-block-left' +Shift minor-block left. "] + + ["Comment minor-block" py-comment-minor-block + :help " `py-comment-minor-block' + +Comments minor-block at point. + +Uses double hash (`#') comment starter when `py-minor-block-comment-prefix-p' is `t', +the default. "] + + ) + + ("Def-or-class " + + ["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"] + + ["Down def-or-class" py-down-def-or-class + :help "`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. "] + + ["Up def-or-class" py-up-def-or-class + :help "`py-up-def-or-class' + +Go upwards to the beginning of next def-or-class below in buffer. + +Returns indentation if def-or-class found, nil otherwise. "] + + ["Copy Def-or-Class" py-copy-def-or-class + :help "`py-copy-def-or-class' +Copy innermost definition at point"] + + ["Kill def-or-class" py-kill-def-or-class + :help "`py-kill-def-or-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete def-or-class" py-delete-def-or-class + :help "`py-delete-def-or-class' +Delete def-or-class at point, don't store deleted string in kill-ring"] + + ["Shift def-or-class right" py-shift-def-or-class-right + :help "`py-shift-def-or-class-right' +Shift def-or-class right. "] + + ["Shift def-or-class left" py-shift-def-or-class-left + :help "`py-shift-def-or-class-left' +Shift def-or-class left. "] + + ["Comment def or class" py-comment-def-or-class + :help " `py-comment-def-or-class' + +Comments def-or-class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Clause " + + ["Beginning of clause" py-beginning-of-clause + :help "`py-beginning-of-clause' +Go to start of innermost compound statement at point"] + ["End of clause" py-end-of-clause + :help "`py-end-of-clause' +Go to end of innermost compound statement at point"] + + ["Down clause" py-down-clause + :help "`py-down-clause' + +Go to the beginning of next clause below in buffer. + +Returns indentation if clause found, nil otherwise. "] + + ["Up clause" py-up-clause + :help "`py-up-clause' + +Go upwards to the beginning of next clause below in buffer. + +Returns indentation if clause found, nil otherwise. "] + + ["Copy clause" py-copy-clause + :help "`py-copy-clause' +Copy innermost compound statement at point"] + + ["Kill clause" py-kill-clause + :help "`py-kill-clause' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete clause" py-delete-clause + :help "`py-delete-clause' +Delete innermost compound statement at point, don't store deleted string in kill-ring"] + + ["Shift clause right" py-shift-clause-right + :help "`py-shift-clause-right' +Shift clause right. "] + + ["Shift clause left" py-shift-clause-left + :help "`py-shift-clause-left' +Shift clause left. "] + + ["Comment clause" py-comment-clause + :help " `py-comment-clause' + +Comments clause at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Statement " + + ["Beginning of Statement" py-beginning-of-statement + :help "`py-beginning-of-statement' +Go to start of innermost definition at point"] + + ["End of Statement" py-end-of-statement + :help "`py-end-of-statement' +Go to end of innermost function definition at point"] + + ["Copy statement" py-copy-statement + :help "`py-copy-statement' +Copy innermost definition at point"] + + ["Kill statement" py-kill-statement + :help "`py-kill-statement' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete statement" py-delete-statement + :help "`py-delete-statement' +Delete statement at point, don't store deleted string in kill-ring"] + + ["Shift statement right" py-shift-statement-right + :help "`py-shift-statement-right' +Shift statement right. "] + + ["Shift statement left" py-shift-statement-left + :help "`py-shift-statement-left' +Shift statement left. "] + + ["Comment statement" py-comment-statement + :help " `py-comment-statement' + +Comments statement at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Expression" + + ["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 expression" py-beginning-of-expression + :help "`py-beginning-of-expression' +Go to start of a Python expression"] + + ["End of expression" py-end-of-expression + :help "`py-end-of-expression' +Go to end of a Python expression"] + + ["Copy expression" py-copy-expression + :help "`py-copy-expression' +Copy expression at point"] + + ["Kill expression" py-kill-expression + :help "`py-kill-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete expression" py-delete-expression + :help "`py-delete-expression' +Delete expression at point, don't store deleted string in kill-ring"]) + + ("Partial expression" + + ["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."] + + ["Copy partial expression" py-copy-partial-expression + :help "`py-copy-partial-expression' +\".\" operators delimit a partial-expression expression on it's level"] + + ["Kill partial-expression" py-kill-partial-expression + :help "`py-kill-partial-expression' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete partial-expression" py-delete-partial-expression + :help "`py-delete-partial-expression' +Delete partial-expression at point, don't store deleted string in kill-ring"]) + + ("Class " + + ["Beginning of Class" py-beginning-of-class + :help "`py-beginning-of-class' +Go to start of innermost definition at point"] + + ["End of Class" py-end-of-class + :help "`py-end-of-class' +Go to end of innermost function definition at point"] + + ["Down class" py-down-class + :help "`py-down-class' + +Go to the beginning of next class below in buffer. + +Returns indentation if class found, nil otherwise. "] + + ["Up class" py-up-class + :help "`py-up-class' + +Go upwards to the beginning of next class below in buffer. + +Returns indentation if class found, nil otherwise. "] + + ["Copy class" py-copy-class + :help "`py-copy-class' +Copy innermost definition at point"] + + ["Kill class" py-kill-class + :help "`py-kill-class' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete class" py-delete-class + :help "`py-delete-class' +Delete class at point, don't store deleted string in kill-ring"] + + ["Shift class right" py-shift-class-right + :help "`py-shift-class-right' +Shift class right. "] + + ["Shift class left" py-shift-class-left + :help "`py-shift-class-left' +Shift class left. "] + + ["Comment class" py-comment-class + :help " `py-comment-class' + +Comments class at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "]) + + ("Def " + + ["Beginning of Def" py-beginning-of-def + :help "`py-beginning-of-def' +Go to start of innermost definition at point"] + + ["End of Def" py-end-of-def + :help "`py-end-of-def' +Go to end of innermost function definition at point"] + + ["Down def" py-down-def + :help "`py-down-def' + +Go to the beginning of next def below in buffer. + +Returns indentation if def found, nil otherwise. "] + + ["Up def" py-up-def + :help "`py-up-def' + +Go upwards to the beginning of next def below in buffer. + +Returns indentation if def found, nil otherwise. "] + + ["Copy def" py-copy-def + :help "`py-copy-def' +Copy innermost definition at point"] + + ["Kill def" py-kill-def + :help "`py-kill-def' +Delete innermost compound statement at point, store deleted string in kill-ring"] + + ["Delete def" py-delete-def + :help "`py-delete-def' +Delete def at point, don't store deleted string in kill-ring"] + + ["Shift def right" py-shift-def-right + :help "`py-shift-def-right' +Shift def right. "] + + ["Shift def left" py-shift-def-left + :help "`py-shift-def-left' +Shift def left. "] + + ["Comment def" py-comment-def + :help " `py-comment-def' + +Comments def at point. + +Uses double hash (`#') comment starter when `py-block-comment-prefix-p' is `t', +the default. "] + + ) + + "-" + + ("Block bol " + + ["Beginning of block bol" py-beginning-of-block-bol + :help "`py-beginning-of-block-bol' +Go to beginning of line at beginning of block. + +Returns position reached, if successful, nil otherwise. "] + + ["End of block bol" py-end-of-block-bol + :help "`py-end-of-block-bol' +Go to beginning of line following end of block. + +Returns position reached, if successful, nil otherwise. "] + + ["Up block bol" py-up-block-bol + :help "`py-up-block-bol' +Go to next block upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down block bol" py-down-block-bol + :help "`py-down-block-bol' +Go to next block downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark block bol" py-mark-block-bol + :help "`py-mark-block-bol' +Mark block at point. "] + + ["Copy block bol" py-copy-block-bol + :help "`py-copy-block-bol' +Copy block at point. "] + + ["Kill block bol" py-kill-block-bol + :help "`py-kill-block-bol' +Kill block at point. "] + + ["Delete block bol" py-delete-block-bol + :help "`py-delete-block-bol' +Delete block at point. "] + + ["Shift block right" py-shift-block-right + :help "`py-shift-block-right' +Shift block right. "] + + ["Shift block left" py-shift-block-left + :help "`py-shift-block-left' +Shift block left. "] + ) + + ("Minor-block bol " + + ["Beginning of minor-block bol" py-beginning-of-minor-block-bol + :help "`py-beginning-of-minor-block-bol' +Go to beginning of line at beginning of minor-block. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["End of minor-block bol" py-end-of-minor-block-bol + :help "`py-end-of-minor-block-bol' +Go to beginning of line following end of minor-block. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Up minor-block bol" py-up-minor-block-bol + :help "`py-up-minor-block-bol' +Go to next minor-block upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Down minor-block bol" py-down-minor-block-bol + :help "`py-down-minor-block-bol' +Go to next minor-block downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Mark minor-block bol" py-mark-minor-block-bol + :help "`py-mark-minor-block-bol' +Mark minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Copy minor-block bol" py-copy-minor-block-bol + :help "`py-copy-minor-block-bol' +Copy minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Kill minor-block bol" py-kill-minor-block-bol + :help "`py-kill-minor-block-bol' +Kill minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Delete minor-block bol" py-delete-minor-block-bol + :help "`py-delete-minor-block-bol' +Delete minor-block at point. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Shift minor-block right" py-shift-minor-block-right + :help "`py-shift-minor-block-right' +Shift minor-block right. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ["Shift minor-block left" py-shift-minor-block-left + :help "`py-shift-minor-block-left' +Shift minor-block left. + +A minor block is started by a `for', `if', `try' or `with'. "] + + ) + + ("Clause bol " + + ["Beginning of clause bol" py-beginning-of-clause-bol + :help "`py-beginning-of-clause-bol' +Go to beginning of line at beginning of clause. + +Returns position reached, if successful, nil otherwise. "] + + ["End of clause bol" py-end-of-clause-bol + :help "`py-end-of-clause-bol' +Go to beginning of line following end of clause. + +Returns position reached, if successful, nil otherwise. "] + + ["Up clause bol" py-up-clause-bol + :help "`py-up-clause-bol' +Go to next clause upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down clause bol" py-down-clause-bol + :help "`py-down-clause-bol' +Go to next clause downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark clause bol" py-mark-clause-bol + :help "`py-mark-clause-bol' +Mark clause at point. "] + + ["Copy clause bol" py-copy-clause-bol + :help "`py-copy-clause-bol' +Copy clause at point. "] + + ["Kill clause bol" py-kill-clause-bol + :help "`py-kill-clause-bol' +Kill clause at point. "] + + ["Delete clause bol" py-delete-clause-bol + :help "`py-delete-clause-bol' +Delete clause at point. "] + + ["Shift clause right" py-shift-clause-right + :help "`py-shift-clause-right' +Shift clause right. "] + + ["Shift clause left" py-shift-clause-left + :help "`py-shift-clause-left' +Shift clause left. "]) + + ("Block-Or-Clause bol " + + ["Beginning of block-or-clause bol" py-beginning-of-block-or-clause-bol + :help "`py-beginning-of-block-or-clause-bol' +Go to beginning of line at beginning of block-or-clause. + +Returns position reached, if successful, nil otherwise. "] + + ["End of block-or-clause bol" py-end-of-block-or-clause-bol + :help "`py-end-of-block-or-clause-bol' +Go to beginning of line following end of block-or-clause. + +Returns position reached, if successful, nil otherwise. "] + + ["Up block-or-clause bol" py-up-block-or-clause-bol + :help "`py-up-block-or-clause-bol' +Go to next block-or-clause upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down block-or-clause bol" py-down-block-or-clause-bol + :help "`py-down-block-or-clause-bol' +Go to next block-or-clause downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark block-or-clause bol" py-mark-block-or-clause-bol + :help "`py-mark-block-or-clause-bol' +Mark block-or-clause at point. "] + + ["Copy block-or-clause bol" py-copy-block-or-clause-bol + :help "`py-copy-block-or-clause-bol' +Copy block-or-clause at point. "] + + ["Kill block-or-clause bol" py-kill-block-or-clause-bol + :help "`py-kill-block-or-clause-bol' +Kill block-or-clause at point. "] + + ["Delete block-or-clause bol" py-delete-block-or-clause-bol + :help "`py-delete-block-or-clause-bol' +Delete block-or-clause at point. "] + + ["Shift block-or-clause right" py-shift-block-or-clause-right + :help "`py-shift-block-or-clause-right' +Shift block-or-clause right. "] + + ["Shift block-or-clause left" py-shift-block-or-clause-left + :help "`py-shift-block-or-clause-left' +Shift block-or-clause left. "]) + + ("Def bol " + + ["Beginning of def bol" py-beginning-of-def-bol + :help "`py-beginning-of-def-bol' +Go to beginning of line at beginning of def. + +Returns position reached, if successful, nil otherwise. "] + + ["End of def bol" py-end-of-def-bol + :help "`py-end-of-def-bol' +Go to beginning of line following end of def. + +Returns position reached, if successful, nil otherwise. "] + + ["Up def bol" py-up-def-bol + :help "`py-up-def-bol' +Go to next def upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down def bol" py-down-def-bol + :help "`py-down-def-bol' +Go to next def downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark def bol" py-mark-def-bol + :help "`py-mark-def-bol' +Mark def at point. "] + + ["Copy def bol" py-copy-def-bol + :help "`py-copy-def-bol' +Copy def at point. "] + + ["Kill def bol" py-kill-def-bol + :help "`py-kill-def-bol' +Kill def at point. "] + + ["Delete def bol" py-delete-def-bol + :help "`py-delete-def-bol' +Delete def at point. "] + + ["Shift def right" py-shift-def-right + :help "`py-shift-def-right' +Shift def right. "] + + ["Shift def left" py-shift-def-left + :help "`py-shift-def-left' +Shift def left. "]) + + ("Class bol " + ["Beginning of class bol" py-beginning-of-class-bol + :help "`py-beginning-of-class-bol' +Go to beginning of line at beginning of class. + +Returns position reached, if successful, nil otherwise. "] + + ["End of class bol" py-end-of-class-bol + :help "`py-end-of-class-bol' +Go to beginning of line following end of class. + +Returns position reached, if successful, nil otherwise. "] + + ["Up class bol" py-up-class-bol + :help "`py-up-class-bol' +Go to next class upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down class bol" py-down-class-bol + :help "`py-down-class-bol' +Go to next class downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark class bol" py-mark-class-bol + :help "`py-mark-class-bol' +Mark class at point. "] + + ["Copy class bol" py-copy-class-bol + :help "`py-copy-class-bol' +Copy class at point. "] + + ["Kill class bol" py-kill-class-bol + :help "`py-kill-class-bol' +Kill class at point. "] + + ["Delete class bol" py-delete-class-bol + :help "`py-delete-class-bol' +Delete class at point. "] + + ["Shift class right" py-shift-class-right + :help "`py-shift-class-right' +Shift class right. "] + + ["Shift class left" py-shift-class-left + :help "`py-shift-class-left' +Shift class left. "]) + + ("Def-Or-Class bol " + ["Beginning of def-or-class bol" py-beginning-of-def-or-class-bol + :help "`py-beginning-of-def-or-class-bol' +Go to beginning of line at beginning of def-or-class. + +Returns position reached, if successful, nil otherwise. "] + + ["End of def-or-class bol" py-end-of-def-or-class-bol + :help "`py-end-of-def-or-class-bol' +Go to beginning of line following end of def-or-class. + +Returns position reached, if successful, nil otherwise. "] + + ["Up def-or-class bol" py-up-def-or-class-bol + :help "`py-up-def-or-class-bol' +Go to next def-or-class upwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Down def-or-class bol" py-down-def-or-class-bol + :help "`py-down-def-or-class-bol' +Go to next def-or-class downwards in buffer if any. Go to beginning of line. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark def-or-class bol" py-mark-def-or-class-bol + :help "`py-mark-def-or-class-bol' +Mark def-or-class at point. "] + + ["Copy def-or-class bol" py-copy-def-or-class-bol + :help "`py-copy-def-or-class-bol' +Copy def-or-class at point. "] + + ["Kill def-or-class bol" py-kill-def-or-class-bol + :help "`py-kill-def-or-class-bol' +Kill def-or-class at point. "] + + ["Delete def-or-class bol" py-delete-def-or-class-bol + :help "`py-delete-def-or-class-bol' +Delete def-or-class at point. "] + + ["Shift def-or-class right" py-shift-def-or-class-right + :help "`py-shift-def-or-class-right' +Shift def-or-class right. "] + + ["Shift def-or-class left" py-shift-def-or-class-left + :help "`py-shift-def-or-class-left' +Shift def-or-class left. "] + + ) + + ("Statement bol " + ["Beginning of statement bol" py-beginning-of-statement-bol + :help "`py-beginning-of-statement-bol' +Go to beginning of line at beginning of statement. + +Returns position reached, if successful, nil otherwise. "] + + ["End of statement bol" py-end-of-statement-bol + :help "`py-end-of-statement-bol' +Go to beginning of line following end of statement. + +Returns position reached, if successful, nil otherwise. "] + + ["Mark statement bol" py-mark-statement-bol + :help "`py-mark-statement-bol' +Mark statement at point. "] + + ["Copy statement bol" py-copy-statement-bol + :help "`py-copy-statement-bol' +Copy statement at point. "] + + ["Kill statement bol" py-kill-statement-bol + :help "`py-kill-statement-bol' +Kill statement at point. "] + + ["Delete statement bol" py-delete-statement-bol + :help "`py-delete-statement-bol' +Delete statement at point. "] + + ["Shift statement right" py-shift-statement-right + :help "`py-shift-statement-right' +Shift statement right. "] + + ["Shift statement left" py-shift-statement-left + :help "`py-shift-statement-left' +Shift statement left. "]) + ) + "-" + ("Filling" + :help "see also customizable `py-docstring-style'" + + ["Fill string" py-fill-string + :help " `py-fill-string' + +Uses value of `py-docstring-style', if set. "] + + ["Fill paragraph" py-fill-paragraph + :help " `py-fill-paragraph' + +Uses value of `py-docstring-style', if set. "] + + ["Fill comment" py-fill-comment + :help " `py-fill-comment' + +Fill comment at point. "] + + ["Fill string django-style " py-fill-string-django + :help " `py-fill-string-django' + + \"\"\" + Process foo, return bar. + \"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style' + "] + + ["py fill string onetwo" py-fill-string-onetwo + :help " `py-fill-string-onetwo' +One newline and start and Two at end style. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"] + + ["py fill string pep 257" py-fill-string-pep-257 + :help " `py-fill-string-pep-257' + +PEP-257 with 2 newlines at end of string. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"] + + ["py fill string pep 257 nn" py-fill-string-pep-257-nn + :help " `py-fill-string-pep-257-nn' + +PEP-257 with 1 newline at end of string. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\"Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"] + + ["py fill string symmetric" py-fill-string-symmetric + :help " `py-fill-string-symmetric' + +Symmetric style. + + \"\"\"Process foo, return bar.\"\"\" + + \"\"\" + Process foo, return bar. + + If processing fails throw ProcessingError. + \"\"\" + +See available styles at `py-fill-paragraph' or var `py-docstring-style'"]) + + ("Electric " + :help "electric commands'" + + ["Hungry delete backwards" py-hungry-delete-backwards + :help " `py-hungry-delete-backwards' + +Delete the preceding character or all preceding whitespace +back to the previous non-whitespace character. +See also C-c . "] + + ["Hungry delete forward" py-hungry-delete-forward + :help " `py-hungry-delete-forward' + +Delete the following character or all following whitespace +up to the next non-whitespace character. +See also C-c . "] + + ["Electric colon" py-electric-colon + :help " `py-electric-colon' +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. + +Switched by `py-electric-colon-active-p', default is nil +See also `py-electric-colon-greedy-p' "] + + ["Electric colon greedy " + (setq py-electric-colon-greedy-p + (not py-electric-colon-greedy-p)) + :help "If py-electric-colon should indent to the outmost reasonable level. + +If nil, default, it will not move from at any reasonable level. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-colon-greedy-p] + + ["Electric colon newline and indent " + (setq py-electric-colon-newline-and-indent-p + (not py-electric-colon-newline-and-indent-p)) + :help "If non-nil, `py-electric-colon' will call `newline-and-indent'. Default is `nil'. Use `M-x customize-variable' to set it permanently" + :style toggle :selected py-electric-colon-newline-and-indent-p] + + ["Electric delete" py-electric-delete + :help " `py-electric-delete' +Delete following character or levels of whitespace. + +With ARG do that ARG times. "] + + ["Electric backspace" py-electric-backspace + :help " `py-electric-backspace' +Delete preceding character or level of indentation. + +With ARG do that ARG times. +Returns column reached. "] + + ["Electric comment" py-electric-comment + :help " `py-electric-comment' +Insert a comment. If starting a comment, indent accordingly. + +If a numeric argument ARG is provided, that many \"#\" are inserted +non-electrically. +With C-u \"#\" electric behavior is inhibited inside a string or comment. "] + + ["Electric left paren" py-complete-electric-lparen + :help " `py-complete-electric-lparen' +electricly insert '(', and try to get a signature for the stuff to the left.\n +Needs Pymacs"] + + ["Complete electric comma" py-complete-electric-comma + :help " `py-complete-electric-comma' +electricly insert ',', and redisplay latest signature.\n +Needs Pymacs"] + + ["Electric yank" py-electric-yank + :help " `py-electric-yank' +Perform command `yank' followed by an `indent-according-to-mode' . "]) + + ("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"] + + ) + + ("Completion" + :help "Completion options" + + ["Complete symbol" py-shell-complete + :help "`py-shell-complete' +Complete (qualified) symbol before point"] + + ["Complete" py-complete + :help " `py-complete' +Complete symbol before point using Pymacs . "]) + + ["Find function" py-find-function + :help "`py-find-function' +Try to find source definition of function at point"] + + )))) + map)) + +(defvaralias 'py-mode-map 'python-mode-map) + +(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)))) + +;;; 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-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 name) + (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))) + +;;; + +(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-end-of-block-or-clause)) + nil)) + +(setq imenu-generic-expression 'py-imenu-generic-regexp) + +(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) + +(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)) + +(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 curexe aktpath) + (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 "\\" 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))))) + +(defun py-input-filter (str) + "`comint-input-filter' function for inferior Python. +Don't save anything for STR matching `inferior-python-filter-regexp'." + (not (string-match inferior-python-filter-regexp str))) + +;; 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) + +(defun py-restore-window-configuration () + "Restore py-restore-window-configuration when completion is done resp. abandoned. " + (and (setq val (get-register 313465889))(and (consp val) (window-configuration-p (car val))(markerp (cadr val)))(marker-buffer (cadr val)) + (jump-to-register 313465889))) + +(defun py-shell-simple-send (proc string) + (comint-simple-send proc string)) + +(defun py-shell-execute-string-now (string &optional shell buffer proc output-buffer) + "Send to Python interpreter process PROC \"exec STRING in {}\". +and return collected output" + (let* (wait + (procbuf (or buffer (process-buffer proc) (progn (setq wait py-new-shell-delay) (py-shell nil nil shell nil t)))) + (proc (or proc (get-buffer-process procbuf))) + (cmd (format "exec '''%s''' in {}" + (mapconcat 'identity (split-string string "\n") "\\n"))) + (outbuf (get-buffer-create (or output-buffer py-output-buffer)))) + ;; wait is used only when a new py-shell buffer was connected + (and wait (sit-for wait)) + (unwind-protect + (condition-case nil + (progn + (with-current-buffer outbuf + (delete-region (point-min) (point-max))) + (with-current-buffer procbuf + ;; (sit-for 3) + (comint-redirect-send-command-to-process + cmd outbuf proc nil t) + (accept-process-output proc 1 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)))))) + +;;; Completion + +;; started from python.el +(defalias 'py-script-complete 'py-shell-complete) + +(defun py-python-script-complete (&optional shell imports beg end word) + "Complete word before point, if any. + +When `py-no-completion-calls-dabbrev-expand-p' is non-nil, try dabbrev-expand. Otherwise, when `py-indent-no-completion-p' is non-nil, call `tab-to-tab-stop'. " + (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))) + proc) + (cond ((string= word "") + (if py-indent-no-completion-p + (tab-to-tab-stop) + (message "%s" "Nothing to complete. "))) + (t (or (setq proc (get-buffer-process (py-buffer-name-prepare))) + (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) + (when py-verbose-p (message "%s" (match-string-no-properties 0))) + (if imports + (setq imports (concat imports (match-string-no-properties 0) ";")) + (setq imports (match-string-no-properties 0))))))) + (py-shell--do-completion-at-point proc imports word)) + (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)) + proc) + (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 t)))) + (py-shell--do-completion-at-point proc nil word orig)))) + 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 "") + (tab-to-tab-stop)) + (t + (py-shell--do-completion-at-point (get-buffer-process (current-buffer)) nil word orig) + nil)))) + +(defun py-comint--complete (shell pos beg end word imports debug) + (let ((shell (or shell (py-report-executable (buffer-name (current-buffer))))) + py-fontify-shell-buffer-p) + (if (string-match "[iI][pP]ython" shell) + (ipython-complete nil nil beg end word shell debug imports) + (let ((proc (get-buffer-process (current-buffer)))) + (cond ((string= word "") + (tab-to-tab-stop)) + (t + ;; (string-match "[pP]ython3[^[:alpha:]]*$" shell) + (py-shell--do-completion-at-point proc imports word pos)) + ;; (t (py-shell-complete-intern word beg end shell imports proc)) + ))))) + +(defun py-complete--base (shell pos beg end word imports debug) + (let* (wait + (shell (or shell (py-choose-shell))) + (proc (or (get-process shell) + (get-buffer-process (progn (setq wait py-new-shell-delay) (py-shell nil nil shell nil t)))))) + (cond ((string= word "") + (tab-to-tab-stop)) + ((string-match "[iI][pP]ython" shell) + (ipython-complete nil nil beg end word shell debug imports pos)) + (t + ;; (string-match "[pP]ython3[^[:alpha:]]*$" shell) + (py-shell--do-completion-at-point proc imports word pos)) + ;; (t (py-shell-complete-intern word beg end shell imports proc debug)) + ))) + +(defun py-shell-complete (&optional shell debug beg end word) + "Complete word before point, if any. Otherwise insert TAB. " + (interactive) + (setq py-completion-last-window-configuration + (current-window-configuration)) + (when debug (setq py-shell-complete-debug nil)) + (let* ((oldbuf (current-buffer)) + (pos (copy-marker (point))) + (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 (py-find-imports)) + py-fontify-shell-buffer-p py-completion-buffer) + ;; (and (string= "open('" word) + ;; (comint-dynamic-complete-filename)) + ;; (ignore-errors (comint-dynamic-complete)) + (if (or (eq major-mode 'comint-mode)(eq major-mode 'inferior-python-mode)) + (py-comint--complete shell pos beg end word imports debug) + (py-complete--base shell pos beg end word imports debug)) + ;; (goto-char pos) + nil)) + +(defun py-after-change-function (beg end len) + "Restore window-confiuration after completion. " + (when + (and (or + (eq this-command 'completion-at-point) + (eq this-command 'choose-completion) + (eq this-command 'choose-completion) + (eq this-command 'py-shell-complete) + (and (or + (eq last-command 'completion-at-point) + (eq last-command 'choose-completion) + (eq last-command 'choose-completion) + (eq last-command 'py-shell-complete)) + (eq this-command 'self-insert-command)))) + (set-window-configuration + py-completion-last-window-configuration)) + (goto-char end)) + +(defun py-shell-complete-finally () + (if (and completions (not (string= "" (car completions)))) + (cond ((eq completions t) + (when (buffer-live-p (get-buffer py-completion-buffer)) + (kill-buffer (get-buffer py-python-completions))) + (message "Can't find completion for \"%s\"" word) + (ding) + nil) + ((< 1 (length completions)) + (with-output-to-temp-buffer py-completion-buffer + (display-completion-list completions + word) + nil)) + ((not (string= word (car completions))) + (sit-for 0.1) + (completion-in-region beg end completions) + (move-marker pos (point)) + (when (buffer-live-p (get-buffer py-python-completions)) + (kill-buffer (get-buffer py-python-completions))) + nil)) + (when py-no-completion-calls-dabbrev-expand-p + (ignore-errors (dabbrev-expand nil))) + (when py-indent-no-completion-p + (tab-to-tab-stop) + (when (buffer-live-p (get-buffer py-python-completions)) + (kill-buffer (get-buffer py-python-completions))))) + (progn (set-buffer oldbuf)(goto-char pos) + ;; completion-at-point requires a list as return value, so givem + nil)) + +(defun py-shell-complete-intern (word &optional beg end shell imports proc debug) + (when imports + (py-send-string-no-output imports proc)) + (let ((py-completion-buffer py-python-completions) + (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 nil proc))) + (if (or (eq result nil)(string= "" result)) + (progn + (if py-no-completion-calls-dabbrev-expand-p + (or (ignore-errors (dabbrev-expand nil)) (message "Can't complete")) + (message "No completion found"))) + + (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<))) + (when debug (setq py-shell-complete-debug completions)) + (py-shell-complete-finally))))) + +;; 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 shell debug imports pos) + "Complete the python symbol before point. + +If no completion available, insert a TAB. +Returns the completed symbol, a string, if successful, nil otherwise. " + + (interactive "*") + (setq py-completion-last-window-configuration + (current-window-configuration)) + (let* (py-fontify-shell-buffer-p + (oldbuf (current-buffer)) + (pos (or pos (copy-marker (point)))) + (beg (or beg (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 ";") + (py-shell-name (or shell (py-choose-shell))) + (processlist (process-list)) + (imports (or imports (py-find-imports))) + (py-completion-buffer py-ipython-completions) + done + (process + (if ipython-complete-use-separate-shell-p + (unless (and (buffer-live-p py-ipython-completions) + (comint-check-proc (process-name (get-buffer-process py-ipython-completions)))) + (get-buffer-process (py-shell nil nil py-shell-name py-ipython-completions t))) + (progn + (while (and processlist (not done)) + (when (and + (string= py-shell-name (process-name (car processlist))) + (processp (car processlist)) + (setq done (car processlist)))) + (setq processlist (cdr processlist))) + done))) + (proc (or process + (get-buffer-process (py-shell nil nil (if (string-match "[iI][pP]ython[^[:alpha:]]*$" py-shell-name) "ipython") nil t)))) + (comint-output-filter-functions + (delq 'py-comint-output-filter-function comint-output-filter-functions)) + (comint-preoutput-filter-functions + (append comint-preoutput-filter-functions + '(ansi-color-filter-apply + (lambda (string) + (setq ugly-return (concat ugly-return string)) + "")))) + (ccs (or completion-command-string + (if imports + (concat imports (py-set-ipython-completion-command-string)) + (py-set-ipython-completion-command-string)))) + completion completions completion-table ugly-return) + (if (string= pattern "") + (tab-to-tab-stop) + (process-send-string proc (format ccs pattern)) + (accept-process-output proc 0.2) + (if ugly-return + (progn + (setq completions + (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep)) + (when debug (setq py-shell-complete-debug completions)) + + (py-shell-complete-finally)) + (message "%s" "No response from Python process. Please check your configuration. If config is okay, please file a bug-regport at http://launchpad.net/python-mode"))))) + +;;; Checker +;; 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)))) + (if (buffer-file-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))) + (message "%s" "flymake needs a `buffer-file-name'. Please save before calling."))) + +(defun pylint-flymake-mode () + "Toggle `pylint' `flymake-mode'. " + (interactive) + (if flymake-mode + ;; switch off + (flymake-mode 0) + (py-toggle-flymake-intern "pylint" "pylint") + (flymake-mode 1))) + +(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))) + +;; 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 %s" py-pylint-command + (mapconcat 'identity py-pylint-command-args " ") + (buffer-name (current-buffer))))) + (last (and py-pylint-history (car py-pylint-history))) + erg) + + (list + (if (fboundp 'read-shell-command) + (read-shell-command "Run pylint like this: " + (if py-pylint-offer-current-p + (or default last) + (or last default)) + 'py-pylint-history) + (read-string "Run pylint like this: " + (if py-pylint-offer-current-p + (or default last) + (or last default)) + 'py-pylint-history))))) + (save-some-buffers (not py-ask-about-save)) + (unless (file-readable-p buffer-file-name) + (message "Warning: %s" "pylint needs a file")) + (shell-command (concat command " " buffer-file-name))) + +(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*")) + +;; flake8 +(defalias 'flake8 'py-flake8-run) +(defun py-flake8-run (command) + "Flake8 is a wrapper around these tools: + - PyFlakes + - pep8 + - Ned Batchelder's McCabe script + + It also adds features: + - files that contain this line are skipped:: + # flake8: noqa + - lines that contain a ``# noqa`` comment at the end will not issue warnings. + - a Git and a Mercurial hook. + - a McCabe complexity checker. + - extendable through ``flake8.extension`` entry points. + +" + (interactive + (let* ((py-flake8-command + (if (string= "" py-flake8-command) + (or (executable-find "flake8") + (error "Don't see \"flake8\" on your system. +Consider \"pip install flake8\" resp. visit \"pypi.python.org\"")) + py-flake8-command)) + (default + (if (buffer-file-name) + (format "%s %s %s" py-flake8-command + (mapconcat 'identity py-flake8-command-args " ") + (buffer-file-name)) + (format "%s %s" py-flake8-command + (mapconcat 'identity py-flake8-command-args " ")))) + (last + (when py-flake8-history + (let* ((lastcmd (car py-flake8-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 flake8 like this: " + ;; (if last + ;; last + default + 'py-flake8-history1) + (read-string "Run flake8 like this: " + (if last + last + default) + 'py-flake8-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-flake8-help () + "Display flake8 command line help messages. " + (interactive) + (set-buffer (get-buffer-create "*flake8-Help*")) + (erase-buffer) + (shell-command "flake8 --help" "*flake8-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")))) + +;;; Skeletons +;; Derived from python.el, where it's instrumented as abbrev +;; Original code authored by Dave Love AFAIK + +(defun py-load-skeletons () + "These skeletons are loaded by python-mode, if `py-load-skeletons-p' is non-nil. " + (interactive) + (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 +;; Thanks Gabriele Lanaro and all working on that +;; 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) + +(defvar virtualenv-name nil) + +(if (getenv "WORKON_HOME") + (setq virtualenv-workon-home (getenv "WORKON_HOME")) + (setq virtualenv-workon-home "~/.virtualenvs")) + +(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 (py-normalize-directory dir) "bin")) + (add-to-list 'exec-path (concat (py-normalize-directory 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 virtualenv-p (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 'virtualenv-p + (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)))) + (if (getenv "WORKON_HOME") + (virtualenv-activate (concat (py-normalize-directory (getenv "WORKON_HOME")) name)) + (virtualenv-activate (concat (py-normalize-directory virtualenv-workon-home) name)))) + +;;; Execute forms at point +(defun py-execute-statement () + "Send statement at point to a Python interpreter. " + (interactive) + (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)))) + +(defun py-execute-top-level () + "Send top-level at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (or (py-beginning-of-top-level-p) + (py-beginning-of-top-level)))) + (end (py-end-of-top-level))) + (py-execute-region beg end)))) + +(defun py-execute-block () + "Send block at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (or (py-beginning-of-block-p) + (py-beginning-of-block)))) + (end (py-end-of-block))) + (py-execute-region beg end)))) + +(defun py-execute-minor-block () + "Send minor-block at point to a Python interpreter. + +A minor block is started by a `for', `if', `try' or `with'. +" + (interactive) + (save-excursion + (let ((beg (prog1 + (or (py-beginning-of-minor-block-p) + (py-beginning-of-minor-block)))) + (end (py-end-of-minor-block))) + (py-execute-region beg end)))) + +(defun py-execute-block-or-clause () + "Send block-or-clause at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (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)))) + +(defun py-execute-def () + "Send def at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (or (py-beginning-of-def-p) + (py-beginning-of-def)))) + (end (py-end-of-def))) + (py-execute-region beg end)))) + +(defun py-execute-class () + "Send class at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (or (py-beginning-of-class-p) + (py-beginning-of-class)))) + (end (py-end-of-class))) + (py-execute-region beg end)))) + +(defun py-execute-def-or-class () + "Send def-or-class at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (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)))) + +(defun py-execute-expression () + "Send expression at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (or (py-beginning-of-expression-p) + (py-beginning-of-expression)))) + (end (py-end-of-expression))) + (py-execute-region beg end)))) + +(defun py-execute-partial-expression () + "Send partial-expression at point to a Python interpreter. " + (interactive) + (save-excursion + (let ((beg (prog1 + (or (py-beginning-of-partial-expression-p) + (py-beginning-of-partial-expression)))) + (end (py-end-of-partial-expression))) + (py-execute-region beg end)))) + +;;; Execute line +(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) +(defalias 'py-send-region-ipython 'py-execute-region-ipython) +(defalias 'py-ipython-shell-command-on-region 'py-execute-region-ipython) + +;;; Execute file commands +(defun py-execute-file-python (&optional filename) + "Send file to a Python interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "python" nil nil nil nil t)) + +(defun py-execute-file-python-switch (&optional filename) + "Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python" nil 'switch nil nil t)) + +(defun py-execute-file-python-no-switch (&optional filename) + "Send file to a Python interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python" nil 'no-switch nil nil t)) + +(defun py-execute-file-python-dedicated (&optional filename) + "Send file to a Python interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "python" 'dedicated nil nil nil t)) + +(defun py-execute-file-python-dedicated-switch (&optional filename) + "Send file to a Python interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-ipython (&optional filename) + "Send file to a Ipython interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "ipython" nil nil nil nil t)) + +(defun py-execute-file-ipython-switch (&optional filename) + "Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "ipython" nil 'switch nil nil t)) + +(defun py-execute-file-ipython-no-switch (&optional filename) + "Send file to a Ipython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "ipython" nil 'no-switch nil nil t)) + +(defun py-execute-file-ipython-dedicated (&optional filename) + "Send file to a Ipython interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "ipython" 'dedicated nil nil nil t)) + +(defun py-execute-file-ipython-dedicated-switch (&optional filename) + "Send file to a Ipython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "ipython" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-python3 (&optional filename) + "Send file to a Python3 interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "python3" nil nil nil nil t)) + +(defun py-execute-file-python3-switch (&optional filename) + "Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3" nil 'switch nil nil t)) + +(defun py-execute-file-python3-no-switch (&optional filename) + "Send file to a Python3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3" nil 'no-switch nil nil t)) + +(defun py-execute-file-python3-dedicated (&optional filename) + "Send file to a Python3 interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "python3" 'dedicated nil nil nil t)) + +(defun py-execute-file-python3-dedicated-switch (&optional filename) + "Send file to a Python3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-python2 (&optional filename) + "Send file to a Python2 interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "python2" nil nil nil nil t)) + +(defun py-execute-file-python2-switch (&optional filename) + "Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python2" nil 'switch nil nil t)) + +(defun py-execute-file-python2-no-switch (&optional filename) + "Send file to a Python2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python2" nil 'no-switch nil nil t)) + +(defun py-execute-file-python2-dedicated (&optional filename) + "Send file to a Python2 interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "python2" 'dedicated nil nil nil t)) + +(defun py-execute-file-python2-dedicated-switch (&optional filename) + "Send file to a Python2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python2" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-python2.7 (&optional filename) + "Send file to a Python2.7 interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "python2.7" nil nil nil nil t)) + +(defun py-execute-file-python2.7-switch (&optional filename) + "Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python2.7" nil 'switch nil nil t)) + +(defun py-execute-file-python2.7-no-switch (&optional filename) + "Send file to a Python2.7 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python2.7" nil 'no-switch nil nil t)) + +(defun py-execute-file-python2.7-dedicated (&optional filename) + "Send file to a Python2.7 interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "python2.7" 'dedicated nil nil nil t)) + +(defun py-execute-file-python2.7-dedicated-switch (&optional filename) + "Send file to a Python2.7 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python2.7" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-jython (&optional filename) + "Send file to a Jython interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "jython" nil nil nil nil t)) + +(defun py-execute-file-jython-switch (&optional filename) + "Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "jython" nil 'switch nil nil t)) + +(defun py-execute-file-jython-no-switch (&optional filename) + "Send file to a Jython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "jython" nil 'no-switch nil nil t)) + +(defun py-execute-file-jython-dedicated (&optional filename) + "Send file to a Jython interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "jython" 'dedicated nil nil nil t)) + +(defun py-execute-file-jython-dedicated-switch (&optional filename) + "Send file to a Jython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "jython" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-python3.2 (&optional filename) + "Send file to a Python3.2 interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "python3.2" nil nil nil nil t)) + +(defun py-execute-file-python3.2-switch (&optional filename) + "Send file to a Python3.2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3.2" nil 'switch nil nil t)) + +(defun py-execute-file-python3.2-no-switch (&optional filename) + "Send file to a Python3.2 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3.2" nil 'no-switch nil nil t)) + +(defun py-execute-file-python3.2-dedicated (&optional filename) + "Send file to a Python3.2 interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "python3.2" 'dedicated nil nil nil t)) + +(defun py-execute-file-python3.2-dedicated-switch (&optional filename) + "Send file to a Python3.2 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3.2" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-python3.3 (&optional filename) + "Send file to a Python3.3 interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "python3.3" nil nil nil nil t)) + +(defun py-execute-file-python3.3-switch (&optional filename) + "Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3.3" nil 'switch nil nil t)) + +(defun py-execute-file-python3.3-no-switch (&optional filename) + "Send file to a Python3.3 interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3.3" nil 'no-switch nil nil t)) + +(defun py-execute-file-python3.3-dedicated (&optional filename) + "Send file to a Python3.3 interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "python3.3" 'dedicated nil nil nil t)) + +(defun py-execute-file-python3.3-dedicated-switch (&optional filename) + "Send file to a Python3.3 interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "python3.3" 'dedicated 'switch nil nil t)) + +(defun py-execute-file-bpython (&optional filename) + "Send file to a Bpython interpreter." + (interactive "fFile: ") + (py-execute-prepare filename "bpython" nil nil nil nil t)) + +(defun py-execute-file-bpython-switch (&optional filename) + "Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "bpython" nil 'switch nil nil t)) + +(defun py-execute-file-bpython-no-switch (&optional filename) + "Send file to a Bpython interpreter. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "bpython" nil 'no-switch nil nil t)) + +(defun py-execute-file-bpython-dedicated (&optional filename) + "Send file to a Bpython interpreter. + +Uses a dedicated shell." + (interactive "fFile: ") + (py-execute-prepare filename "bpython" 'dedicated nil nil nil t)) + +(defun py-execute-file-bpython-dedicated-switch (&optional filename) + "Send file to a Bpython interpreter. + +Uses a dedicated shell. +Ignores default of `py-switch-buffers-on-execute-p', uses it with value \"non-nil\"" + (interactive "fFile: ") + (py-execute-prepare filename "bpython" 'dedicated 'switch nil nil t)) + +;;; Extended executes +;; created by `write-extended-execute-forms' +(defun py-masterfile () + "Internal use. Set master-file, if given. " + (and (or py-master-file (py-fetch-py-master-file)) + (let* ((filename (expand-file-name py-master-file)) + (buffer (or (get-file-buffer filename) + (find-file-noselect filename)))) + (set-buffer buffer)))) + +(defun py-execute-prepare (form &optional shell dedicated switch beg end file wholebuf) + "Used by python-extended-executes ." + (save-excursion + (let ((beg (unless file + (prog1 + (or beg (funcall (intern-soft (concat "py-beginning-of-" form "-p"))) + + (funcall (intern-soft (concat "py-beginning-of-" form))) + (push-mark))))) + (end (unless file + (or end (funcall (intern-soft (concat "py-end-of-" form)))))) + (py-shell-name shell) + (py-dedicated-process-p dedicated) + (py-switch-buffers-on-execute-p (cond ((eq 'switch switch) + t) + ((eq 'no-switch switch) + nil) + (t py-switch-buffers-on-execute-p))) + filename erg) + (if file + (progn + (setq filename (expand-file-name form)) + (if (file-readable-p filename) + (setq erg (py-execute-file-base nil filename nil nil (or (and (boundp 'py-orig-buffer-or-file) py-orig-buffer-or-file) filename))) + (message "%s not readable. %s" file "Do you have write permissions?"))) + (py-execute-base beg end shell nil nil wholebuf))))) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "python" nil 'switch)) + +(defun py-execute-statement-python-no-switch () + "Send statement at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "ipython" nil 'switch)) + +(defun py-execute-statement-ipython-no-switch () + "Send statement at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "python3" nil 'switch)) + +(defun py-execute-statement-python3-no-switch () + "Send statement at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "python2" nil 'switch)) + +(defun py-execute-statement-python2-no-switch () + "Send statement at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "python2.7" nil 'switch)) + +(defun py-execute-statement-python2.7-no-switch () + "Send statement at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "jython" nil 'switch)) + +(defun py-execute-statement-jython-no-switch () + "Send statement at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "python3.2" nil 'switch)) + +(defun py-execute-statement-python3.2-no-switch () + "Send statement at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "python3.2" nil 'no-switch)) + +(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-statement-python3.3 () + "Send statement at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "statement" "python3.3" nil nil)) + +(defun py-execute-statement-python3.3-switch () + "Send statement at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "python3.3" nil 'switch)) + +(defun py-execute-statement-python3.3-no-switch () + "Send statement at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "python3.3" nil 'no-switch)) + +(defun py-execute-statement-python3.3-dedicated () + "Send statement at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "statement" "python3.3" t nil)) + +(defun py-execute-statement-python3.3-dedicated-switch () + "Send statement at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "statement" "python3.3" t 'switch)) + +(defun py-execute-statement-bpython () + "Send statement at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "statement" "bpython" nil nil)) + +(defun py-execute-statement-bpython-switch () + "Send statement at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "statement" "bpython" nil 'switch)) + +(defun py-execute-statement-bpython-no-switch () + "Send statement at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "statement" "bpython" nil 'no-switch)) + +(defun py-execute-statement-bpython-dedicated () + "Send statement at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "statement" "bpython" t nil)) + +(defun py-execute-statement-bpython-dedicated-switch () + "Send statement at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "statement" "bpython" 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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "python" nil 'switch)) + +(defun py-execute-block-python-no-switch () + "Send block at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "ipython" nil 'switch)) + +(defun py-execute-block-ipython-no-switch () + "Send block at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "python3" nil 'switch)) + +(defun py-execute-block-python3-no-switch () + "Send block at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "python2" nil 'switch)) + +(defun py-execute-block-python2-no-switch () + "Send block at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "python2.7" nil 'switch)) + +(defun py-execute-block-python2.7-no-switch () + "Send block at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "jython" nil 'switch)) + +(defun py-execute-block-jython-no-switch () + "Send block at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "python3.2" nil 'switch)) + +(defun py-execute-block-python3.2-no-switch () + "Send block at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "python3.2" nil 'no-switch)) + +(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-block-python3.3 () + "Send block at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "block" "python3.3" nil nil)) + +(defun py-execute-block-python3.3-switch () + "Send block at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "python3.3" nil 'switch)) + +(defun py-execute-block-python3.3-no-switch () + "Send block at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "python3.3" nil 'no-switch)) + +(defun py-execute-block-python3.3-dedicated () + "Send block at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "block" "python3.3" t nil)) + +(defun py-execute-block-python3.3-dedicated-switch () + "Send block at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "block" "python3.3" t 'switch)) + +(defun py-execute-block-bpython () + "Send block at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "block" "bpython" nil nil)) + +(defun py-execute-block-bpython-switch () + "Send block at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block" "bpython" nil 'switch)) + +(defun py-execute-block-bpython-no-switch () + "Send block at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block" "bpython" nil 'no-switch)) + +(defun py-execute-block-bpython-dedicated () + "Send block at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "block" "bpython" t nil)) + +(defun py-execute-block-bpython-dedicated-switch () + "Send block at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "block" "bpython" 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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "python" nil 'switch)) + +(defun py-execute-clause-python-no-switch () + "Send clause at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "ipython" nil 'switch)) + +(defun py-execute-clause-ipython-no-switch () + "Send clause at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "python3" nil 'switch)) + +(defun py-execute-clause-python3-no-switch () + "Send clause at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "python2" nil 'switch)) + +(defun py-execute-clause-python2-no-switch () + "Send clause at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "python2.7" nil 'switch)) + +(defun py-execute-clause-python2.7-no-switch () + "Send clause at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "jython" nil 'switch)) + +(defun py-execute-clause-jython-no-switch () + "Send clause at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "python3.2" nil 'switch)) + +(defun py-execute-clause-python3.2-no-switch () + "Send clause at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "python3.2" nil 'no-switch)) + +(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-clause-python3.3 () + "Send clause at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "clause" "python3.3" nil nil)) + +(defun py-execute-clause-python3.3-switch () + "Send clause at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "python3.3" nil 'switch)) + +(defun py-execute-clause-python3.3-no-switch () + "Send clause at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "python3.3" nil 'no-switch)) + +(defun py-execute-clause-python3.3-dedicated () + "Send clause at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "clause" "python3.3" t nil)) + +(defun py-execute-clause-python3.3-dedicated-switch () + "Send clause at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "clause" "python3.3" t 'switch)) + +(defun py-execute-clause-bpython () + "Send clause at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "clause" "bpython" nil nil)) + +(defun py-execute-clause-bpython-switch () + "Send clause at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "clause" "bpython" nil 'switch)) + +(defun py-execute-clause-bpython-no-switch () + "Send clause at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "clause" "bpython" nil 'no-switch)) + +(defun py-execute-clause-bpython-dedicated () + "Send clause at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "clause" "bpython" t nil)) + +(defun py-execute-clause-bpython-dedicated-switch () + "Send clause at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "clause" "bpython" 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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "python" nil 'switch)) + +(defun py-execute-block-or-clause-python-no-switch () + "Send block-or-clause at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "ipython" nil 'switch)) + +(defun py-execute-block-or-clause-ipython-no-switch () + "Send block-or-clause at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "python3" nil 'switch)) + +(defun py-execute-block-or-clause-python3-no-switch () + "Send block-or-clause at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "python2" nil 'switch)) + +(defun py-execute-block-or-clause-python2-no-switch () + "Send block-or-clause at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "python2.7" nil 'switch)) + +(defun py-execute-block-or-clause-python2.7-no-switch () + "Send block-or-clause at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "jython" nil 'switch)) + +(defun py-execute-block-or-clause-jython-no-switch () + "Send block-or-clause at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "python3.2" nil 'switch)) + +(defun py-execute-block-or-clause-python3.2-no-switch () + "Send block-or-clause at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "python3.2" nil 'no-switch)) + +(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-block-or-clause-python3.3 () + "Send block-or-clause at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "block-or-clause" "python3.3" nil nil)) + +(defun py-execute-block-or-clause-python3.3-switch () + "Send block-or-clause at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "python3.3" nil 'switch)) + +(defun py-execute-block-or-clause-python3.3-no-switch () + "Send block-or-clause at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "python3.3" nil 'no-switch)) + +(defun py-execute-block-or-clause-python3.3-dedicated () + "Send block-or-clause at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "block-or-clause" "python3.3" t nil)) + +(defun py-execute-block-or-clause-python3.3-dedicated-switch () + "Send block-or-clause at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "block-or-clause" "python3.3" t 'switch)) + +(defun py-execute-block-or-clause-bpython () + "Send block-or-clause at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "block-or-clause" "bpython" nil nil)) + +(defun py-execute-block-or-clause-bpython-switch () + "Send block-or-clause at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "block-or-clause" "bpython" nil 'switch)) + +(defun py-execute-block-or-clause-bpython-no-switch () + "Send block-or-clause at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "block-or-clause" "bpython" nil 'no-switch)) + +(defun py-execute-block-or-clause-bpython-dedicated () + "Send block-or-clause at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "block-or-clause" "bpython" t nil)) + +(defun py-execute-block-or-clause-bpython-dedicated-switch () + "Send block-or-clause at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "block-or-clause" "bpython" 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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "python" nil 'switch)) + +(defun py-execute-def-python-no-switch () + "Send def at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "ipython" nil 'switch)) + +(defun py-execute-def-ipython-no-switch () + "Send def at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "python3" nil 'switch)) + +(defun py-execute-def-python3-no-switch () + "Send def at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "python2" nil 'switch)) + +(defun py-execute-def-python2-no-switch () + "Send def at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "python2.7" nil 'switch)) + +(defun py-execute-def-python2.7-no-switch () + "Send def at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "jython" nil 'switch)) + +(defun py-execute-def-jython-no-switch () + "Send def at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "python3.2" nil 'switch)) + +(defun py-execute-def-python3.2-no-switch () + "Send def at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "python3.2" nil 'no-switch)) + +(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-def-python3.3 () + "Send def at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "def" "python3.3" nil nil)) + +(defun py-execute-def-python3.3-switch () + "Send def at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "python3.3" nil 'switch)) + +(defun py-execute-def-python3.3-no-switch () + "Send def at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "python3.3" nil 'no-switch)) + +(defun py-execute-def-python3.3-dedicated () + "Send def at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "def" "python3.3" t nil)) + +(defun py-execute-def-python3.3-dedicated-switch () + "Send def at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "def" "python3.3" t 'switch)) + +(defun py-execute-def-bpython () + "Send def at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "def" "bpython" nil nil)) + +(defun py-execute-def-bpython-switch () + "Send def at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "def" "bpython" nil 'switch)) + +(defun py-execute-def-bpython-no-switch () + "Send def at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "def" "bpython" nil 'no-switch)) + +(defun py-execute-def-bpython-dedicated () + "Send def at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "def" "bpython" t nil)) + +(defun py-execute-def-bpython-dedicated-switch () + "Send def at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "def" "bpython" 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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "python" nil 'switch)) + +(defun py-execute-class-python-no-switch () + "Send class at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "ipython" nil 'switch)) + +(defun py-execute-class-ipython-no-switch () + "Send class at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "python3" nil 'switch)) + +(defun py-execute-class-python3-no-switch () + "Send class at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "python2" nil 'switch)) + +(defun py-execute-class-python2-no-switch () + "Send class at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "python2.7" nil 'switch)) + +(defun py-execute-class-python2.7-no-switch () + "Send class at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "jython" nil 'switch)) + +(defun py-execute-class-jython-no-switch () + "Send class at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "python3.2" nil 'switch)) + +(defun py-execute-class-python3.2-no-switch () + "Send class at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "python3.2" nil 'no-switch)) + +(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-class-python3.3 () + "Send class at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "class" "python3.3" nil nil)) + +(defun py-execute-class-python3.3-switch () + "Send class at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "python3.3" nil 'switch)) + +(defun py-execute-class-python3.3-no-switch () + "Send class at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "python3.3" nil 'no-switch)) + +(defun py-execute-class-python3.3-dedicated () + "Send class at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "class" "python3.3" t nil)) + +(defun py-execute-class-python3.3-dedicated-switch () + "Send class at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "class" "python3.3" t 'switch)) + +(defun py-execute-class-bpython () + "Send class at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "class" "bpython" nil nil)) + +(defun py-execute-class-bpython-switch () + "Send class at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "class" "bpython" nil 'switch)) + +(defun py-execute-class-bpython-no-switch () + "Send class at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "class" "bpython" nil 'no-switch)) + +(defun py-execute-class-bpython-dedicated () + "Send class at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "class" "bpython" t nil)) + +(defun py-execute-class-bpython-dedicated-switch () + "Send class at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "class" "bpython" t 'switch)) + +(defun py-execute-region-python (beg end) + "Send region at point to Python interpreter. " + (interactive "r") + (py-execute-prepare "region" "python" nil nil beg end)) + +(defun py-execute-region-python-switch (beg end) + "Send region at point to Python interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "python" nil 'switch beg end)) + +(defun py-execute-region-python-no-switch (beg end) + "Send region at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "python" nil 'no-switch beg end)) + +(defun py-execute-region-python-dedicated (beg end) + "Send region at point to Python unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "python" t nil beg end)) + +(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-prepare "region" "python" t 'switch beg end)) + +(defun py-execute-region-ipython (beg end) + "Send region at point to IPython interpreter. " + (interactive "r") + (py-execute-prepare "region" "ipython" nil nil beg end)) + +(defun py-execute-region-ipython-switch (beg end) + "Send region at point to IPython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "ipython" nil 'switch beg end)) + +(defun py-execute-region-ipython-no-switch (beg end) + "Send region at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "ipython" nil 'no-switch beg end)) + +(defun py-execute-region-ipython-dedicated (beg end) + "Send region at point to IPython unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "ipython" t nil beg end)) + +(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-prepare "region" "ipython" t 'switch beg end)) + +(defun py-execute-region-python3 (beg end) + "Send region at point to Python3 interpreter. " + (interactive "r") + (py-execute-prepare "region" "python3" nil nil beg end)) + +(defun py-execute-region-python3-switch (beg end) + "Send region at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "python3" nil 'switch beg end)) + +(defun py-execute-region-python3-no-switch (beg end) + "Send region at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "python3" nil 'no-switch beg end)) + +(defun py-execute-region-python3-dedicated (beg end) + "Send region at point to Python3 unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "python3" t nil beg end)) + +(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-prepare "region" "python3" t 'switch beg end)) + +(defun py-execute-region-python2 (beg end) + "Send region at point to Python2 interpreter. " + (interactive "r") + (py-execute-prepare "region" "python2" nil nil beg end)) + +(defun py-execute-region-python2-switch (beg end) + "Send region at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "python2" nil 'switch beg end)) + +(defun py-execute-region-python2-no-switch (beg end) + "Send region at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "python2" nil 'no-switch beg end)) + +(defun py-execute-region-python2-dedicated (beg end) + "Send region at point to Python2 unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "python2" t nil beg end)) + +(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-prepare "region" "python2" t 'switch beg end)) + +(defun py-execute-region-python2.7 (beg end) + "Send region at point to Python2.7 interpreter. " + (interactive "r") + (py-execute-prepare "region" "python2.7" nil nil beg end)) + +(defun py-execute-region-python2.7-switch (beg end) + "Send region at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "python2.7" nil 'switch beg end)) + +(defun py-execute-region-python2.7-no-switch (beg end) + "Send region at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "python2.7" nil 'no-switch beg end)) + +(defun py-execute-region-python2.7-dedicated (beg end) + "Send region at point to Python2.7 unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "python2.7" t nil beg end)) + +(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-prepare "region" "python2.7" t 'switch beg end)) + +(defun py-execute-region-jython (beg end) + "Send region at point to Jython interpreter. " + (interactive "r") + (py-execute-prepare "region" "jython" nil nil beg end)) + +(defun py-execute-region-jython-switch (beg end) + "Send region at point to Jython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "jython" nil 'switch beg end)) + +(defun py-execute-region-jython-no-switch (beg end) + "Send region at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "jython" nil 'no-switch beg end)) + +(defun py-execute-region-jython-dedicated (beg end) + "Send region at point to Jython unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "jython" t nil beg end)) + +(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-prepare "region" "jython" t 'switch beg end)) + +(defun py-execute-region-python3.2 (beg end) + "Send region at point to Python3.2 interpreter. " + (interactive "r") + (py-execute-prepare "region" "python3.2" nil nil beg end)) + +(defun py-execute-region-python3.2-switch (beg end) + "Send region at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "python3.2" nil 'switch beg end)) + +(defun py-execute-region-python3.2-no-switch (beg end) + "Send region at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "python3.2" nil 'no-switch beg end)) + +(defun py-execute-region-python3.2-dedicated (beg end) + "Send region at point to Python3.2 unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "python3.2" t nil beg end)) + +(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-prepare "region" "python3.2" t 'switch beg end)) + +(defun py-execute-region-python3.3 (beg end) + "Send region at point to Python3.3 interpreter. " + (interactive "r") + (py-execute-prepare "region" "python3.3" nil nil beg end)) + +(defun py-execute-region-python3.3-switch (beg end) + "Send region at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "python3.3" nil 'switch beg end)) + +(defun py-execute-region-python3.3-no-switch (beg end) + "Send region at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "python3.3" nil 'no-switch beg end)) + +(defun py-execute-region-python3.3-dedicated (beg end) + "Send region at point to Python3.3 unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "python3.3" t nil beg end)) + +(defun py-execute-region-python3.3-dedicated-switch (beg end) + "Send region at point to Python3.3 unique interpreter and switch to result. " + (interactive "r") + (py-execute-prepare "region" "python3.3" t 'switch beg end)) + +(defun py-execute-region-bpython (beg end) + "Send region at point to Bpython interpreter. " + (interactive "r") + (py-execute-prepare "region" "bpython" nil nil beg end)) + +(defun py-execute-region-bpython-switch (beg end) + "Send region at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive "r") + (py-execute-prepare "region" "bpython" nil 'switch beg end)) + +(defun py-execute-region-bpython-no-switch (beg end) + "Send region at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive "r") + (py-execute-prepare "region" "bpython" nil 'no-switch beg end)) + +(defun py-execute-region-bpython-dedicated (beg end) + "Send region at point to Bpython unique interpreter. " + (interactive "r") + (py-execute-prepare "region" "bpython" t nil beg end)) + +(defun py-execute-region-bpython-dedicated-switch (beg end) + "Send region at point to Bpython unique interpreter and switch to result. " + (interactive "r") + (py-execute-prepare "region" "bpython" t 'switch beg end)) + +(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))) + (py-execute-prepare "buffer" "python" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-python-switch () + "Send buffer at point to Python interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-python-no-switch () + "Send buffer at point to Python interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python" nil 'no-switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python" t nil (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python" t 'switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "ipython" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-ipython-switch () + "Send buffer at point to IPython interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "ipython" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-ipython-no-switch () + "Send buffer at point to IPython interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "ipython" nil 'no-switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "ipython" t nil (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "ipython" t 'switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python3" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-python3-switch () + "Send buffer at point to Python3 interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python3" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-python3-no-switch () + "Send buffer at point to Python3 interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python3" nil 'no-switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python3" t nil (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python3" t 'switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python2" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-python2-switch () + "Send buffer at point to Python2 interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python2" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-python2-no-switch () + "Send buffer at point to Python2 interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python2" nil 'no-switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python2" t nil (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python2" t 'switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python2.7" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-python2.7-switch () + "Send buffer at point to Python2.7 interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python2.7" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-python2.7-no-switch () + "Send buffer at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python2.7" nil 'no-switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python2.7" t nil (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python2.7" t 'switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "jython" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-jython-switch () + "Send buffer at point to Jython interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "jython" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-jython-no-switch () + "Send buffer at point to Jython interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "jython" nil 'no-switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "jython" t nil (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "jython" t 'switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python3.2" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-python3.2-switch () + "Send buffer at point to Python3.2 interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python3.2" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-python3.2-no-switch () + "Send buffer at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python3.2" nil 'no-switch (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python3.2" t nil (point-min) (point-max))))) + +(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))) + (py-execute-prepare "buffer" "python3.2" t 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-python3.3 () + "Send buffer at point to Python3.3 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))) + (py-execute-prepare "buffer" "python3.3" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-python3.3-switch () + "Send buffer at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python3.3" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-python3.3-no-switch () + "Send buffer at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "python3.3" nil 'no-switch (point-min) (point-max))))) + +(defun py-execute-buffer-python3.3-dedicated () + "Send buffer at point to Python3.3 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))) + (py-execute-prepare "buffer" "python3.3" t nil (point-min) (point-max))))) + +(defun py-execute-buffer-python3.3-dedicated-switch () + "Send buffer at point to Python3.3 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))) + (py-execute-prepare "buffer" "python3.3" t 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-bpython () + "Send buffer at point to Bpython 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))) + (py-execute-prepare "buffer" "bpython" nil nil (point-min) (point-max))))) + +(defun py-execute-buffer-bpython-switch () + "Send buffer at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "bpython" nil 'switch (point-min) (point-max))))) + +(defun py-execute-buffer-bpython-no-switch () + "Send buffer at point to Bpython interpreter. + +Keep current buffer. Ignores `py-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))) + (py-execute-prepare "buffer" "bpython" nil 'no-switch (point-min) (point-max))))) + +(defun py-execute-buffer-bpython-dedicated () + "Send buffer at point to Bpython 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))) + (py-execute-prepare "buffer" "bpython" t nil (point-min) (point-max))))) + +(defun py-execute-buffer-bpython-dedicated-switch () + "Send buffer at point to Bpython 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))) + (py-execute-prepare "buffer" "bpython" t 'switch (point-min) (point-max))))) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "python" nil 'switch)) + +(defun py-execute-expression-python-no-switch () + "Send expression at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "ipython" nil 'switch)) + +(defun py-execute-expression-ipython-no-switch () + "Send expression at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "python3" nil 'switch)) + +(defun py-execute-expression-python3-no-switch () + "Send expression at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "python2" nil 'switch)) + +(defun py-execute-expression-python2-no-switch () + "Send expression at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "python2.7" nil 'switch)) + +(defun py-execute-expression-python2.7-no-switch () + "Send expression at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "jython" nil 'switch)) + +(defun py-execute-expression-jython-no-switch () + "Send expression at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "python3.2" nil 'switch)) + +(defun py-execute-expression-python3.2-no-switch () + "Send expression at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "python3.2" nil 'no-switch)) + +(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-expression-python3.3 () + "Send expression at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "expression" "python3.3" nil nil)) + +(defun py-execute-expression-python3.3-switch () + "Send expression at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "python3.3" nil 'switch)) + +(defun py-execute-expression-python3.3-no-switch () + "Send expression at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "python3.3" nil 'no-switch)) + +(defun py-execute-expression-python3.3-dedicated () + "Send expression at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "expression" "python3.3" t nil)) + +(defun py-execute-expression-python3.3-dedicated-switch () + "Send expression at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "expression" "python3.3" t 'switch)) + +(defun py-execute-expression-bpython () + "Send expression at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "expression" "bpython" nil nil)) + +(defun py-execute-expression-bpython-switch () + "Send expression at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "expression" "bpython" nil 'switch)) + +(defun py-execute-expression-bpython-no-switch () + "Send expression at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "expression" "bpython" nil 'no-switch)) + +(defun py-execute-expression-bpython-dedicated () + "Send expression at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "expression" "bpython" t nil)) + +(defun py-execute-expression-bpython-dedicated-switch () + "Send expression at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "expression" "bpython" 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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "python" nil 'switch)) + +(defun py-execute-partial-expression-python-no-switch () + "Send partial-expression at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "ipython" nil 'switch)) + +(defun py-execute-partial-expression-ipython-no-switch () + "Send partial-expression at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "python3" nil 'switch)) + +(defun py-execute-partial-expression-python3-no-switch () + "Send partial-expression at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "python2" nil 'switch)) + +(defun py-execute-partial-expression-python2-no-switch () + "Send partial-expression at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "python2.7" nil 'switch)) + +(defun py-execute-partial-expression-python2.7-no-switch () + "Send partial-expression at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "jython" nil 'switch)) + +(defun py-execute-partial-expression-jython-no-switch () + "Send partial-expression at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "python3.2" nil 'switch)) + +(defun py-execute-partial-expression-python3.2-no-switch () + "Send partial-expression at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "python3.2" nil 'no-switch)) + +(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-partial-expression-python3.3 () + "Send partial-expression at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "partial-expression" "python3.3" nil nil)) + +(defun py-execute-partial-expression-python3.3-switch () + "Send partial-expression at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "python3.3" nil 'switch)) + +(defun py-execute-partial-expression-python3.3-no-switch () + "Send partial-expression at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "python3.3" nil 'no-switch)) + +(defun py-execute-partial-expression-python3.3-dedicated () + "Send partial-expression at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "partial-expression" "python3.3" t nil)) + +(defun py-execute-partial-expression-python3.3-dedicated-switch () + "Send partial-expression at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "partial-expression" "python3.3" t 'switch)) + +(defun py-execute-partial-expression-bpython () + "Send partial-expression at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "partial-expression" "bpython" nil nil)) + +(defun py-execute-partial-expression-bpython-switch () + "Send partial-expression at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "partial-expression" "bpython" nil 'switch)) + +(defun py-execute-partial-expression-bpython-no-switch () + "Send partial-expression at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "partial-expression" "bpython" nil 'no-switch)) + +(defun py-execute-partial-expression-bpython-dedicated () + "Send partial-expression at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "partial-expression" "bpython" t nil)) + +(defun py-execute-partial-expression-bpython-dedicated-switch () + "Send partial-expression at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "partial-expression" "bpython" 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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "python" nil 'switch)) + +(defun py-execute-line-python-no-switch () + "Send line at point to Python interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "python" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "ipython" nil 'switch)) + +(defun py-execute-line-ipython-no-switch () + "Send line at point to IPython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "ipython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "python3" nil 'switch)) + +(defun py-execute-line-python3-no-switch () + "Send line at point to Python3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "python3" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "python2" nil 'switch)) + +(defun py-execute-line-python2-no-switch () + "Send line at point to Python2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "python2" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "python2.7" nil 'switch)) + +(defun py-execute-line-python2.7-no-switch () + "Send line at point to Python2.7 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "python2.7" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "jython" nil 'switch)) + +(defun py-execute-line-jython-no-switch () + "Send line at point to Jython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "jython" nil 'no-switch)) + +(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-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "python3.2" nil 'switch)) + +(defun py-execute-line-python3.2-no-switch () + "Send line at point to Python3.2 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "python3.2" nil 'no-switch)) + +(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)) + +(defun py-execute-line-python3.3 () + "Send line at point to Python3.3 interpreter. " + (interactive) + (py-execute-prepare "line" "python3.3" nil nil)) + +(defun py-execute-line-python3.3-switch () + "Send line at point to Python3.3 interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "python3.3" nil 'switch)) + +(defun py-execute-line-python3.3-no-switch () + "Send line at point to Python3.3 interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "python3.3" nil 'no-switch)) + +(defun py-execute-line-python3.3-dedicated () + "Send line at point to Python3.3 unique interpreter. " + (interactive) + (py-execute-prepare "line" "python3.3" t nil)) + +(defun py-execute-line-python3.3-dedicated-switch () + "Send line at point to Python3.3 unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "line" "python3.3" t 'switch)) + +(defun py-execute-line-bpython () + "Send line at point to Bpython interpreter. " + (interactive) + (py-execute-prepare "line" "bpython" nil nil)) + +(defun py-execute-line-bpython-switch () + "Send line at point to Bpython interpreter. + +Switch to output buffer. Ignores `py-switch-buffers-on-execute-p'. " + (interactive) + (py-execute-prepare "line" "bpython" nil 'switch)) + +(defun py-execute-line-bpython-no-switch () + "Send line at point to Bpython interpreter. + +Keep current buffer. Ignores `py-switch-buffers-on-execute-p' " + (interactive) + (py-execute-prepare "line" "bpython" nil 'no-switch)) + +(defun py-execute-line-bpython-dedicated () + "Send line at point to Bpython unique interpreter. " + (interactive) + (py-execute-prepare "line" "bpython" t nil)) + +(defun py-execute-line-bpython-dedicated-switch () + "Send line at point to Bpython unique interpreter and switch to result. " + (interactive) + (py-execute-prepare "line" "bpython" t 'switch)) + +;;; Subprocess utilities and filters + +(defun py-postprocess-output-buffer (buf) + "Highlight exceptions found in BUF. +If an exception occurred return error-string, otherwise return nil. BUF must exist. + +Indicate LINE if code wasn't run from a file, thus remember line of source buffer " + (set-buffer buf) + ;; (sit-for 0.1) + (let ((pmx (copy-marker (point-max))) + file bol err-p estring ecode limit) + (unless (looking-back py-pdbtrack-input-prompt) + (save-excursion + (forward-line -1) + (end-of-line) + (when (or (re-search-backward py-shell-prompt-regexp nil t 1) + ;; (and (string= "ipython" (process-name proc)) + (re-search-backward ipython-de-input-prompt-regexp nil t 1)) + ;; not a useful message, delete it - please tell when thinking otherwise + (and (re-search-forward "File \"\", line 1,.*\n" nil t) + (replace-match "")) + ;; File "/tmp/ipython-3984xMQ.py", line 1 + ;; print(3*5f) + (when (and (re-search-forward py-traceback-line-re limit t) + (match-string-no-properties 0) + (or (match-string 1) (match-string 3))) + (when (match-string-no-properties 1) + (replace-match (buffer-name py-exception-buffer) nil nil nil 1) + (setq file py-exception-buffer) + (and origline + (replace-match (number-to-string origline) nil nil nil 2)) + (goto-char (match-beginning 0)) + ;; if no buffer-file exists, signal "Buffer", not "File" + (save-match-data + (and (not (buffer-file-name + (or + (get-buffer py-exception-buffer) + (get-buffer (file-name-nondirectory py-exception-buffer))))) (string-match "^[ \t]*File" (buffer-substring-no-properties (match-beginning 0) (match-end 0))) + (looking-at "[ \t]*File") + (replace-match " Buffer"))) + (add-to-list 'err-p origline) + (add-to-list 'err-p file) + (overlay-put (make-overlay (match-beginning 0) (match-end 0)) + 'face 'highlight)) + ;; If not file exists, just a buffer, correct message + (forward-line 1) + (when (looking-at "[ \t]*\\([^\t\n\r\f]+\\)[ \t]*$") + (setq estring (match-string-no-properties 1)) + (add-to-list 'err-p estring t) + (setq ecode (buffer-substring-no-properties (line-end-position) + (progn (re-search-forward comint-prompt-regexp nil t 1)(match-beginning 0)))) + (setq ecode (replace-regexp-in-string "[ \n\t\f\r^]+" " " ecode)) + (add-to-list 'err-p ecode t)))))) + err-p)) + +(defun py-remove-overlays-at-point () + "Remove overlays as set when `py-highlight-error-source-p' is non-nil. " + (interactive "*") + (delete-overlay (car (overlays-at (point))))) + +(defun py-jump-to-exception-intern (action exception-buffer) + (let (erg) + (set-buffer exception-buffer) + ;; (message "%s" (current-buffer)) + (goto-char (point-min)) + (forward-line (1- origline)) + (switch-to-buffer (current-buffer)) + (push-mark) + (and (search-forward action (line-end-position) t) + (and py-verbose-p (message "Exception in file %s on line %d" py-exception-buffer origline)) + (and py-highlight-error-source-p + (setq erg (make-overlay (match-beginning 0) (match-end 0))) + (overlay-put erg + 'face 'highlight)) + ;; (remove-overlays (match-beginning 0) (match-end 0) 'face 'highlight) + ))) + +(defun py-jump-to-exception (err-p &optional file) + "Jump to the Python code in FILE at LINE." + (let ( + ;; (inhibit-point-motion-hooks t) + (file (or file (car err-p))) + (line (cadr err-p)) + (action (nth 2 err-p)) + (errm (nth 3 err-p))) + (cond ((and py-exception-buffer + (buffer-live-p py-exception-buffer)) + ;; (pop-to-buffer procbuf) + (py-jump-to-exception-intern action py-exception-buffer)) + ((ignore-errors (file-readable-p file)) + (find-file file) + (py-jump-to-exception-intern action (get-buffer (file-name-nondirectory file)))) + ((buffer-live-p (get-buffer file)) + (set-buffer file) + (switch-to-buffer (current-buffer)) + (py-jump-to-exception-intern action file)) + (t (setq file (find-file (read-file-name "Exception file: " + nil + file t))) + (py-jump-to-exception-intern action file))))) + +(defun py-down-exception (&optional bottom) + "Go to the next line down in the traceback. + +With \\[universal-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 (file line) + (save-excursion + (set-buffer buffer) + (goto-char (py-point start)) + (if (funcall searchdir py-traceback-line-re nil t) + (setq file (match-string 1) + line (string-to-number (match-string 2))))) + (if (and file line) + (py-goto-exception file line) + (error "%s of traceback" errwhere)))) + +(defun py-mouseto-exception (event) + "Jump to the code which caused the Python exception at EVENT. +EVENT is usually a mouse click." + (interactive "e") + (cond + ((fboundp 'event-point) + ;; XEmacs + (let* ((point (event-point event)) + (buffer (event-buffer event)) + (e (and point buffer (extent-at point buffer 'py-exc-info))) + (info (and e (extent-property e 'py-exc-info)))) + (message "Event point: %d, info: %s" point info) + (and info + (py-jump-to-exception (car info) (cdr info))))))) + +(defun py-goto-exception (&optional file line) + "Go to the line indicated by the traceback." + (interactive) + (let ((file file) + (line line)) + (unless (and file line) + (save-excursion + (beginning-of-line) + (if (looking-at py-traceback-line-re) + (setq file (substring-no-properties (match-string 1)) + line (string-to-number (match-string 2)))))) + (if (not file) + (error "Not on a traceback line")) + (find-file file) + (goto-char (point-min)) + (forward-line (1- line)))) + +;; 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")))) + +(defun py-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 (get-buffer-process (py-shell)))) + (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")) + (py-shell-send-string + (format + (concat "__pyfile = open('''%s''');" + "exec(compile(__pyfile.read(), '''%s''', 'exec'));" + "__pyfile.close()") + ;; (or (file-remote-p temp-file-name 'localname) file-name) file-name) + (or (file-remote-p temp-file-name 'localname) file-name) "Fehlerdatei") + process))) +;;; + +;; Pymacs +;; (defun py-load-pymacs () +;; "Load Pymacs as delivered with python-mode.el. +;; +;; Pymacs has been written by François Pinard and many others. +;; See original source: http://pymacs.progiciels-bpi.ca" +;; (interactive) +;; (let* ((pyshell (py-choose-shell)) +;; (path (getenv "PYTHONPATH")) +;; (py-install-directory (cond ((string= "" py-install-directory) +;; (py-guess-py-install-directory)) +;; (t (py-normalize-directory py-install-directory)))) +;; (pymacs-installed-p +;; (ignore-errors (string-match (expand-file-name (concat py-install-directory "Pymacs")) path)))) +;; ;; Python side +;; (unless pymacs-installed-p +;; (setenv "PYTHONPATH" (concat +;; (expand-file-name py-install-directory) +;; path-separator +;; (expand-file-name py-install-directory) "completion" +;; (if path (concat path-separator path))))) +;; +;; (if (py-install-directory-check) +;; (progn +;; ;; don't interfere with already installed Pymacs +;; (unless (featurep 'pymacs) +;; (load (concat py-install-directory "pymacs.el") nil t)) +;; (setenv "PYMACS_PYTHON" (if (string-match "IP" pyshell) +;; "python" +;; pyshell)) +;; (autoload 'pymacs-apply "pymacs") +;; (autoload 'pymacs-call "pymacs") +;; (autoload 'pymacs-eval "pymacs") +;; (autoload 'pymacs-exec "pymacs") +;; (autoload 'pymacs-load "pymacs") +;; (require 'pymacs) +;; (load (concat py-install-directory "completion/pycomplete.el") nil t) +;; (add-hook 'python-mode-hook 'py-complete-initialize)) +;; (error "`py-install-directory' not set, see INSTALL")))) +;; +;; (when py-load-pymacs-p (py-load-pymacs)) + +(when (or py-load-pymacs-p (featurep 'pymacs)) + (defun py-load-pycomplete () + "Load Pymacs based pycomplete." + (interactive) + (let* ((path (getenv "PYTHONPATH")) + (py-install-directory (cond ((string= "" py-install-directory) + (py-guess-py-install-directory)) + (t (py-normalize-directory py-install-directory)))) + (pycomplete-directory (concat (expand-file-name py-install-directory) "completion"))) + (if (py-install-directory-check) + (progn + ;; If the Pymacs process is already running, augment its path. + (when (and (get-process "pymacs") (fboundp 'pymacs-exec)) + (pymacs-exec (concat "sys.path.insert(0, '" pycomplete-directory "')"))) + (require 'pymacs) + (setenv "PYTHONPATH" (concat + pycomplete-directory + (if path (concat path-separator path)))) + (add-to-list 'load-path pycomplete-directory) + (require 'pycomplete) + (add-hook 'python-mode-hook 'py-complete-initialize)) + (error "`py-install-directory' not set, see INSTALL"))))) + +(and (or (eq py-complete-function 'py-complete-completion-at-point) py-load-pymacs-p (featurep 'pymacs)) + (py-load-pycomplete)) + +;; Hooks +(add-hook 'comint-output-filter-functions 'py-pdbtrack-track-stack-file) + +;; 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 'comint-output-filter-functions +;; 'py-comint-output-filter-function) + +(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 () + (setq py-this-abbrevs-changed abbrevs-changed) + (load abbrev-file-name nil t) + (setq abbrevs-changed py-this-abbrevs-changed))) + (message "Warning: %s" "no abbrev-file found, customize `abbrev-file-name' in order to make mode-specific abbrevs work. ")) + +(when py-sexp-function + (add-hook 'python-mode-hook + (lambda () + (set (make-local-variable 'forward-sexp-function) py-sexp-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) + )) + +;; (add-hook 'python-mode-hook +;; (lambda () +;; (when py-load-highlight-indentation-p +;; (unless (featurep 'highlight-indentation) +;; (load (concat (py-normalize-directory py-install-directory) "extensions" py-separator-char "highlight-indentation.el")))))) + +(add-to-list 'same-window-buffer-names (purecopy "*Python*")) +(add-to-list 'same-window-buffer-names (purecopy "*IPython*")) + +;; interpreter-mode-alist +;; 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 '(("ipython" . python-mode) + ("ipython2" . python-mode) + ("ipython3" . python-mode) + ("jython" . jython-mode) + ("python" . python-mode) + ("python2" . python-mode) + ("python2.4" . python-mode) + ("python2.5" . python-mode) + ("python2.6" . python-mode) + ("python2.7" . python-mode) + ("python3" . python-mode) + ("python3.0" . python-mode) + ("python3.1" . python-mode) + ("python3.2" . python-mode) + ("python3.3" . python-mode) + ("python3.4" . 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)) + +;; (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)) + +(defun py-set-auto-fill-values () + "Internal use by `py-run-auto-fill-timer'" + (let ((pps (syntax-ppss))) + (cond ((and (nth 4 pps)(numberp py-comment-fill-column)) + (set (make-local-variable 'fill-column) py-comment-fill-column)) + ((and (nth 3 pps)(numberp py-docstring-fill-column)) + (set (make-local-variable 'fill-column) py-docstring-fill-column)) + (t (set (make-local-variable 'fill-column) py-fill-column-orig))))) + +(defun py-run-auto-fill-timer () + "Set fill-column to values of `py-docstring-fill-column' resp. to `py-comment-fill-column' according to environment. " + (when py-set-fill-column-p + (unless py-autofill-timer + (setq py-autofill-timer + (run-with-idle-timer + py-autofill-timer-delay t + 'py-set-auto-fill-values))))) + +;;; +(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. + * \\[py-execute-region] sends the current region to the Python process. + +\\{inferior-python-mode-map}" + :group 'python + (require 'ansi-color) ; for ipython + (setq mode-line-process '(":%s")) + (set (make-local-variable 'comint-input-filter) 'py-input-filter) + (add-hook 'comint-preoutput-filter-functions #'py-preoutput-filter + nil t) + (set (make-local-variable 'compilation-error-regexp-alist) + python-compilation-regexp-alist) + (set (make-local-variable 'comint-prompt-regexp) + (cond ((string-match "[iI][pP]ython[[:alnum:]*-]*$" py-buffer-name) + (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)) + "\\|") + "\\)")) + (t (concat "\\(" + (mapconcat 'identity + (delq nil (list py-shell-input-prompt-1-regexp py-shell-input-prompt-2-regexp py-pdbtrack-input-prompt py-pydbtrack-input-prompt)) + "\\|") + "\\)")))) + (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)) + (compilation-shell-minor-mode 1)) + +(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 + +`py-shell'\tStart an interactive Python interpreter in another window +`py-execute-statement'\tSend statement at point to a Python interpreter +`py-beginning-of-statement'\tGo to the initial line of a simple statement + +etc. + +See available commands listed in files commands-python-mode at directory doc + +VARIABLES + +`py-indent-offset' indentation increment +`py-shell-name' shell command to invoke Python interpreter +`py-split-windows-on-execute-p' When non-nil split windows +`py-switch-buffers-on-execute-p' When non-nil switch to the Python output buffer + +See available customizations listed in files variables-python-mode at directory doc + +\\{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) + "\\|"))) + (if py-use-font-lock-doc-face-p + (set (make-local-variable 'font-lock-defaults) + '(py-font-lock-keywords nil nil nil nil + (font-lock-syntactic-keywords + . py-font-lock-syntactic-keywords) + (font-lock-syntactic-face-function + . py-font-lock-syntactic-face-function))) + (set (make-local-variable 'font-lock-defaults) + '(py-font-lock-keywords nil nil nil nil + (font-lock-syntactic-keywords + . py-font-lock-syntactic-keywords)))) + (set (make-local-variable 'which-func-functions) 'py-which-def-or-class) + (set (make-local-variable 'parse-sexp-lookup-properties) t) + (set (make-local-variable 'parse-sexp-ignore-comments) t) + (set (make-local-variable 'comment-use-syntax) t) + (set (make-local-variable 'comment-start) "#") + (if empty-comment-line-separates-paragraph-p + (progn + (set (make-local-variable 'paragraph-separate) "\f\\|^[ \t]*$\\|^[ \t]*#[ \t]*$\\|^[ \t\f]*:[[:alpha:]]+ [[:alpha:]]+:.+$") + (set (make-local-variable 'paragraph-start) "\f\\|^[ \t]*$\\|^[ \t]*#[ \t]*$\\|^[ \t\f]*:[[:alpha:]]+ [[:alpha:]]+:.+$")) + (set (make-local-variable 'paragraph-separate) "\f\\|^[ \t]*$\\|^[ \t]*#[ \t]*$\\|^[ \t\f]*:[[:alpha:]]+ [[:alpha:]]+:.+$") + (set (make-local-variable 'paragraph-start) "\f\\|^[ \t]*$\\|^[ \t]*#[ \t]*$\\|^[ \t\f]*:[[:alpha:]]+ [[:alpha:]]+:.+$")) + (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 '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 'fill-paragraph-function) 'py-fill-paragraph) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) + (set (make-local-variable 'tab-width) py-indent-offset) + (set (make-local-variable 'eldoc-documentation-function) + #'py-eldoc-function) + (and py-load-skeletons-p + (py-load-skeletons) + (set (make-local-variable 'skeleton-further-elements) + '((< '(backward-delete-char-untabify (min py-indent-offset + (current-column)))) + (^ '(- (1+ (current-indentation))))))) + (set (make-local-variable 'imenu-create-index-function) 'py-imenu-create-index-function) + (and py-guess-py-install-directory-p (py-set-load-path)) + ;; (add-to-list 'load-path py-install-directory) + ;; (add-to-list 'load-path (concat py-install-directory "extensions")) + (and py-autopair-mode + ;; (py-autopair-check) + (load-library "autopair") + (add-hook 'python-mode-hook + #'(lambda () + (setq autopair-handle-action-fns + (list #'autopair-default-handle-action + #'autopair-python-triple-quote-action)))) + (py-autopair-mode-on)) + (when py-trailing-whitespace-smart-delete-p + (add-hook 'before-save-hook 'delete-trailing-whitespace nil 'local)) + (cond + (py-complete-function + (add-hook 'completion-at-point-functions + py-complete-function nil 'local)) + (py-load-pymacs-p + (add-hook 'completion-at-point-functions + 'py-complete-completion-at-point nil 'local)) + (t + (add-hook 'completion-at-point-functions + 'py-shell-complete nil 'local))) + (if py-set-fill-column-p + (add-hook 'python-mode-hook 'py-run-auto-fill-timer) + (remove-hook 'python-mode-hook 'py-run-auto-fill-timer)) + (add-hook 'after-change-functions 'py-after-change-function nil t) + ;; (add-hook 'post-command-hook 'py-after-change-function nil t) + (when (and py-imenu-create-index-p + (fboundp 'imenu-add-to-menubar) + (ignore-errors (require 'imenu))) + (imenu-add-to-menubar "PyIndex")) + ;; add the menu + (when py-menu + (easy-menu-add py-menu)) + (when py-hide-show-minor-mode-p (hs-minor-mode 1)) + + (when py-start-run-py-shell + ;; py-shell may split window, provide restore + (window-configuration-to-register 213465879) + (unless (get-process (py-process-name py-shell-name)) + (let ((oldbuf (current-buffer))) + (save-excursion + (py-shell) + (set-buffer py-exception-buffer)))) + ;; (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-message-string))) + +(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")) + +(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")) + +(provide 'python-mode) +;; python-mode.el ends here diff --git a/elpa/python-mode-6.1.3/python-mode.elc b/elpa/python-mode-6.1.3/python-mode.elc new file mode 100644 index 0000000000000000000000000000000000000000..0910f605aa1553b12ddfaa5d4179942948686fc3 GIT binary patch literal 882605 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�UJ2HT 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

1yNr04!~2#H?75sD?0=4kH5m66erEXGVz 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

~de{6-)2 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 IdbIcd0kH3Bpa1{> literal 0 HcmV?d00001 diff --git a/elpa/python-mode-6.1.3/setup.py b/elpa/python-mode-6.1.3/setup.py new file mode 100644 index 000000000..255a48317 --- /dev/null +++ b/elpa/python-mode-6.1.3/setup.py @@ -0,0 +1,14 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +from distutils.core import setup + +setup(name='python-mode.el', + version='6.1.3', + url='http://launchpad.net/python-mode', + maintainer_email='andreas.roehler@online.de', + maintainer='Andreas Roehler', + description='Major mode for editing Python programs', + download_url='http://launchpad.net/python-mode/trunk/6.1.3/+download/python-mode.el-6.1.3.tar.gz', + license='GNU GPLv3, Python License', + ) diff --git a/elpa/python-mode-6.1.3/test/doctest-mode.el b/elpa/python-mode-6.1.3/test/doctest-mode.el new file mode 100644 index 000000000..75bd9cd63 --- /dev/null +++ b/elpa/python-mode-6.1.3/test/doctest-mode.el @@ -0,0 +1,2061 @@ +;;; doctest-mode.el --- Major mode for editing Python doctest files + +;; Copyright (C) 2004-2007 Edward Loper + +;; Author: Edward Loper +;; Maintainer: edloper@alum.mit.edu +;; Created: Aug 2004 +;; Keywords: python doctest unittest test docstring + +(defconst doctest-version "0.5 alpha" + "`doctest-mode' version number.") + +;; This software is provided as-is, without express or implied +;; warranty. Permission to use, copy, modify, distribute or sell this +;; software, without fee, for any purpose and by any individual or +;; organization, is hereby granted, provided that the above copyright +;; notice and this paragraph appear in all copies. + +;; This is a major mode for editing text files that contain Python +;; doctest examples. Doctest is a testing framework for Python that +;; emulates an interactive session, and checks the result of each +;; command. For more information, see the Python library reference: +;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Table of Contents +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; 1. Customization: use-editable variables to customize +;; doctest-mode. +;; +;; 2. Fonts: defines new font-lock faces. +;; +;; 3. Constants: various consts (mainly regexps) used by the rest +;; of the code. +;; +;; 4. Syntax Highlighting: defines variables and functions used by +;; font-lock-mode to perform syntax highlighting. +;; +;; 5. Source code editing & indentation: commands used to +;; automatically indent, dedent, & handle prompts. +;; +;; 6. Code Execution: commands used to start doctest processes, +;; and handle their output. +;; +;; 7. Markers: functions used to insert markers at the start of +;; doctest examples. These are used to keep track of the +;; correspondence between examples in the source buffer and +;; results in the output buffer. +;; +;; 8. Navigation: commands used to navigate between failed examples. +;; +;; 9. Replace Output: command used to replace a doctest example's +;; expected output with its actual output. +;; +;; 10. Helper functions: various helper functions used by the rest +;; of the code. +;; +;; 11. Emacs compatibility functions: defines compatible versions of +;; functions that are defined for some versions of emacs but not +;; others. +;; +;; 12. Doctest Results Mode: defines doctest-results-mode, which is +;; used for the output generated by doctest. +;; +;; 13. Doctest Mode: defines doctest-mode itself. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Customizable Constants +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defgroup doctest nil + "Support for the Python doctest framework" + :group 'languages + :prefix "doctest-") + +(defcustom doctest-default-margin 4 + "The default pre-prompt margin for doctest examples." + :type 'integer + :group 'doctest) + +(defcustom doctest-avoid-trailing-whitespace t + "If true, then delete trailing whitespace when inserting a newline." + :type 'boolean + :group 'doctest) + +(defcustom doctest-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)))) + (or (funcall ok (getenv "TMPDIR")) + (funcall ok "/usr/tmp") + (funcall ok "/tmp") + (funcall ok "/var/tmp") + (funcall ok ".") + (error (concat "Couldn't find a usable temp directory -- " + "set `doctest-temp-directory'")))) + "Directory used for temporary files created when running doctest. +By default, 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." + :type 'string + :group 'doctest) + +(defcustom doctest-hide-example-source nil + "If true, then don't display the example source code for each +failure in the results buffer." + :type 'boolean + :group 'doctest) + +(defcustom doctest-python-command "python" + "Shell command used to start the python interpreter" + :type 'string + :group 'doctest) + +(defcustom doctest-results-buffer-name "*doctest-output (%N)*" + "The name of the buffer used to store the output of the doctest +command. This name can contain the following special sequences: + %n -- replaced by the doctest buffer's name. + %N -- replaced by the doctest buffer's name, with '.doctest' + stripped off. + %f -- replaced by the doctest buffer's filename." + :type 'string + :group 'doctest) + +(defcustom doctest-optionflags '() + "Option flags for doctest" + :group 'doctest + :type '(repeat (choice (const :tag "Select an option..." "") + (const :tag "Normalize whitespace" + "NORMALIZE_WHITESPACE") + (const :tag "Ellipsis" + "ELLIPSIS") + (const :tag "Don't accept True for 1" + "DONT_ACCEPT_TRUE_FOR_1") + (const :tag "Don't accept " + "DONT_ACCEPT_BLANKLINE") + (const :tag "Ignore Exception detail" + "IGNORE_EXCEPTION_DETAIL") + (const :tag "Report only first failure" + "REPORT_ONLY_FIRST_FAILURE") + ))) + +(defcustom doctest-async t + "If true, then doctest will be run asynchronously." + :type 'boolean + :group 'doctest) + +(defcustom doctest-trim-exceptions t + "If true, then any exceptions inserted by doctest-replace-output +will have the stack trace lines trimmed." + :type 'boolean + :group 'doctest) + +(defcustom doctest-highlight-strings t + "If true, then highlight strings. If you find that doctest-mode +is responding slowly when you type, turning this off might help." + :type 'boolean + :group 'doctest) + +(defcustom doctest-follow-output t + "If true, then when doctest is run asynchronously, the output buffer +will scroll to display its output as it is generated. If false, then +the output buffer not scroll." + :type 'boolean + :group 'doctest) + +(defvar doctest-mode-hook nil + "Hook called by `doctest-mode'.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Fonts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defface doctest-prompt-face + '((((class color) (background dark)) + (:foreground "#68f")) + (t (:foreground "#226"))) + "Face for Python prompts in doctest examples." + :group 'doctest) + +(defface doctest-output-face + '((((class color) (background dark)) + (:foreground "#afd")) + (t (:foreground "#262"))) + "Face for the output of doctest examples." + :group 'doctest) + +(defface doctest-output-marker-face + '((((class color) (background dark)) + (:foreground "#0f0")) + (t (:foreground "#080"))) + "Face for markers in the output of doctest examples." + :group 'doctest) + +(defface doctest-output-traceback-face + '((((class color) (background dark)) + (:foreground "#f88")) + (t (:foreground "#622"))) + "Face for traceback headers in the output of doctest examples." + :group 'doctest) + +(defface doctest-results-divider-face + '((((class color) (background dark)) + (:foreground "#08f")) + (t (:foreground "#00f"))) + "Face for dividers in the doctest results window." + :group 'doctest) + +(defface doctest-results-loc-face + '((((class color) (background dark)) + (:foreground "#0f8")) + (t (:foreground "#084"))) + "Face for location headers in the doctest results window." + :group 'doctest) + +(defface doctest-results-header-face + '((((class color) (background dark)) + (:foreground "#8ff")) + (t (:foreground "#088"))) + "Face for sub-headers in the doctest results window." + :group 'doctest) + +(defface doctest-results-selection-face + '((((class color) (background dark)) + (:foreground "#ff0" :background "#008")) + (t (:background "#088" :foreground "#fff"))) + "Face for selected failure's location header in the results window." + :group 'doctest) + +(defface doctest-selection-face + '((((class color) (background dark)) + (:foreground "#ff0" :background "#00f" :bold t)) + (t (:foreground "#f00"))) + "Face for selected example's prompt" + :group 'doctest) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Constants +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst doctest-prompt-re + "^\\(?:\\([ \t]*\\)\\(>>> ?\\|[.][.][.] ?\\)\\([ \t]*\\)\\)" + "Regular expression for doctest prompts. It defines three groups: +the pre-prompt margin; the prompt; and the post-prompt indentation.") + +(defconst doctest-open-block-re + "[^\n]+:[ \t]*\\(#.*\\)?$" + "Regular expression for a line that opens a block") + +(defconst doctest-close-block-re + "\\(return\\|raise\\|break\\|continue\\|pass\\)\\b" + "Regular expression for a line that closes a block") + +(defconst doctest-example-source-re + "^Failed example:\n\\(\n\\| [^\n]*\n\\)+" + "Regular expression for example source in doctest's output.") + +(defconst doctest-results-divider-re + "^\\([*]\\{60,\\}\\)$" + "Regular expression for example dividers in doctest's output.") + +(defconst doctest-py24-results-loc-re + "^File \"[^\"]+\", line \\([0-9]+\\), in [^\n]+" + "Regular expression for example location markers in doctest's output.") + +(defconst doctest-py21-results-loc-re + "^from line #\\([0-9]+\\) of [^\n]*" + "Regular expression for example location markers in doctest's output, +when the output was generated by an old version of doctest.") + +(defconst doctest-results-header-re + "^\\([^ \n\t].+:\\|Expected nothing\\|Got nothing\\)$" + "Regular expression for example headers in doctest's output.") + +(defconst doctest-traceback-header-re + "^[ \t]*Traceback (\\(most recent call last\\|innermost last\\)):" + "Regular expression for Python traceback headers.") + +(defconst doctest-py21-results-re + "^from line #" + "Regular expression used to test which version of doctest was used.") + +;; nb: There's a bug in Python's traceback.print_exception function +;; which causes SyntaxError exceptions to be displayed incorrectly; +;; which prevents this regexp from matching. But there shouldn't be +;; too many people testing for SyntaxErrors, so I won't worry about +;; it. +(defconst doctest-traceback-re + (let ((nonprompt + ;; This matches any non-blank line that doesn't start with + ;; a prompt (... or >>>). + (concat + "\\(?:[.][.][^.\n]\\|[>][>][^>\n]\\|" + "[.][^.\n]\\|[>][^>\n]\\|[^.>\n \t]\\)[^\n]*"))) + (concat + "^\\(\\([ \t]*\\)Traceback " + "(\\(?:most recent call last\\|innermost last\\)):\n\\)" + "\\(?:\\2[ \t]+[^ \t\n][^\n]*\n\\)*" + "\\(\\(?:\\2" nonprompt "\n\\)" + "\\(?:\\2[ \t]*" nonprompt "\n\\)*\\)")) + "Regular expression that matches a complete exception traceback. +It contains three groups: group 1 is the header line; group 2 is +the indentation; and group 3 is the exception message.") + +(defconst doctest-blankline-re + "^[ \t]*" + "Regular expression that matches blank line markers in doctest +output.") + +(defconst doctest-outdent-re + (concat "\\(" (mapconcat 'identity + '("else:" + "except\\(\\s +.*\\)?:" + "finally:" + "elif\\s +.*:") + "\\|") + "\\)") + "Regular expression for a line that should be outdented. Any line +that matches `doctest-outdent-re', but does not follow a line matching +`doctest-no-outdent-re', will be outdented.") + +;; It's not clear to me *why* the behavior given by this definition of +;; doctest-no-outdent-re is desirable; but it's basically just copied +;; from python-mode. +(defconst doctest-no-outdent-re + (concat + "\\(" + (mapconcat 'identity + (list "try:" + "except\\(\\s +.*\\)?:" + "while\\s +.*:" + "for\\s +.*:" + "if\\s +.*:" + "elif\\s +.*:" + "\\(return\\|raise\\|break\\|continue\\|pass\\)[ \t\n]" + ) + "\\|") + "\\)") + "Regular expression matching lines not to outdent after. Any line +that matches `doctest-outdent-re', but does not follow a line matching +`doctest-no-outdent-re', will be outdented.") + +(defconst doctest-script + "\ +from doctest import * +import sys +if '%m': + import imp + try: + m = imp.load_source('__imported__', '%m') + globs = m.__dict__ + except Exception, e: + print ('doctest-mode encountered an error while importing ' + 'the current buffer:\\n\\n %s' % e) + sys.exit(1) +else: + globs = {} +doc = open('%t').read() +if sys.version_info[:2] >= (2,4): + test = DocTestParser().get_doctest(doc, globs, '%n', '%f', 0) + r = DocTestRunner(optionflags=%l) + r.run(test) +else: + Tester(globs=globs).runstring(doc, '%f')" + ;; Docstring: + "Python script used to run doctest. +The following special sequences are defined: + %n -- replaced by the doctest buffer's name. + %f -- replaced by the doctest buffer's filename. + %l -- replaced by the doctest flags string. + %t -- replaced by the name of the tempfile containing the doctests." + ) + +(defconst doctest-keyword-re + (let* ((kw1 (mapconcat 'identity + '("and" "assert" "break" "class" + "continue" "def" "del" "elif" + "else" "except" "exec" "for" + "from" "global" "if" "import" + "in" "is" "lambda" "not" + "or" "pass" "print" "raise" + "return" "while" "yield" + ) + "\\|")) + (kw2 (mapconcat 'identity + '("else:" "except:" "finally:" "try:") + "\\|")) + (kw3 (mapconcat 'identity + '("ArithmeticError" "AssertionError" + "AttributeError" "DeprecationWarning" "EOFError" + "Ellipsis" "EnvironmentError" "Exception" "False" + "FloatingPointError" "FutureWarning" "IOError" + "ImportError" "IndentationError" "IndexError" + "KeyError" "KeyboardInterrupt" "LookupError" + "MemoryError" "NameError" "None" "NotImplemented" + "NotImplementedError" "OSError" "OverflowError" + "OverflowWarning" "PendingDeprecationWarning" + "ReferenceError" "RuntimeError" "RuntimeWarning" + "StandardError" "StopIteration" "SyntaxError" + "SyntaxWarning" "SystemError" "SystemExit" + "TabError" "True" "TypeError" "UnboundLocalError" + "UnicodeDecodeError" "UnicodeEncodeError" + "UnicodeError" "UnicodeTranslateError" + "UserWarning" "ValueError" "Warning" + "ZeroDivisionError" "__debug__" + "__import__" "__name__" "abs" "apply" "basestring" + "bool" "buffer" "callable" "chr" "classmethod" + "cmp" "coerce" "compile" "complex" "copyright" + "delattr" "dict" "dir" "divmod" + "enumerate" "eval" "execfile" "exit" "file" + "filter" "float" "getattr" "globals" "hasattr" + "hash" "hex" "id" "input" "int" "intern" + "isinstance" "issubclass" "iter" "len" "license" + "list" "locals" "long" "map" "max" "min" "object" + "oct" "open" "ord" "pow" "property" "range" + "raw_input" "reduce" "reload" "repr" "round" + "setattr" "slice" "staticmethod" "str" "sum" + "super" "tuple" "type" "unichr" "unicode" "vars" + "xrange" "zip") + "\\|")) + (pseudokw (mapconcat 'identity + '("self" "None" "True" "False" "Ellipsis") + "\\|")) + (string (concat "'\\(?:\\\\[^\n]\\|[^\n']*\\)'" "\\|" + "\"\\(?:\\\\[^\n]\\|[^\n\"]*\\)\"")) + (brk "\\(?:[ \t(]\\|$\\)")) + (concat + ;; Comments (group 1) + "\\(#.*\\)" + ;; Function & Class Definitions (groups 2-3) + "\\|\\b\\(class\\|def\\)" + "[ \t]+\\([a-zA-Z_][a-zA-Z0-9_]*\\)" + ;; Builtins preceeded by '.'(group 4) + "\\|[.][\t ]*\\(" kw3 "\\)" + ;; Keywords & builtins (group 5) + "\\|\\b\\(" kw1 "\\|" kw2 "\\|" + kw3 "\\|" pseudokw "\\)" brk + ;; Decorators (group 6) + "\\|\\(@[a-zA-Z_][a-zA-Z0-9_]*\\)" + )) + "A regular expression used for syntax highlighting of Python +source code.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Syntax Highlighting (font-lock mode) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Define the font-lock keyword table. +(defconst doctest-font-lock-keywords + `( + ;; The following pattern colorizes source lines. In particular, + ;; it first matches prompts, and then looks for any of the + ;; following matches *on the same line* as the prompt. It uses + ;; the form: + ;; + ;; (MATCHER MATCH-HIGHLIGHT + ;; (ANCHOR-MATCHER nil nil MATCH-HIGHLIGHT)) + ;; + ;; See the variable documentation for font-lock-keywords for a + ;; description of what each of those means. + ("^[ \t]*\\(>>>\\|\\.\\.\\.\\)" + (1 'doctest-prompt-face) + (doctest-source-matcher + nil nil + (1 'font-lock-comment-face t t) ; comments + (2 'font-lock-keyword-face t t) ; def/class + (3 'font-lock-type-face t t) ; func/class name + ;; group 4 (builtins preceeded by '.') gets no colorization. + (5 'font-lock-keyword-face t t) ; keywords & builtins + (6 'font-lock-preprocessor-face t t) ; decorators + (7 'font-lock-string-face t t) ; strings + )) + + ;; The following pattern colorizes output lines. In particular, + ;; it uses doctest-output-line-matcher to check if this is an + ;; output line, and if so, it colorizes it, and any special + ;; markers it contains. + (doctest-output-line-matcher + (0 'doctest-output-face t) + ("\\.\\.\\." (beginning-of-line) (end-of-line) + (0 'doctest-output-marker-face t)) + (,doctest-blankline-re (beginning-of-line) (end-of-line) + (0 'doctest-output-marker-face t)) + (doctest-traceback-line-matcher (beginning-of-line) (end-of-line) + (0 'doctest-output-traceback-face t)) + (,doctest-traceback-header-re (beginning-of-line) (end-of-line) + (0 'doctest-output-traceback-face t)) + ) + + ;; A PS1 prompt followed by a non-space is an error. + ("^[ \t]*\\(>>>[^ \t\n][^\n]*\\)" (1 'font-lock-warning-face t)) + ) + "Expressions to highlight in doctest-mode.") + +(defconst doctest-results-font-lock-keywords + `((,doctest-results-divider-re + (0 'doctest-results-divider-face)) + (,doctest-py24-results-loc-re + (0 'doctest-results-loc-face)) + (,doctest-results-header-re + (0 'doctest-results-header-face)) + (doctest-results-selection-matcher + (0 'doctest-results-selection-face t))) + "Expressions to highlight in doctest-results-mode.") + +(defun doctest-output-line-matcher (limit) + "A `font-lock-keyword' MATCHER that returns t if the current +line is the expected output for a doctest example, and if so, +sets `match-data' so that group 0 spans the current line." + ;; The real work is done by doctest-find-output-line. + (when (doctest-find-output-line limit) + ;; If we found one, then mark the entire line. + (beginning-of-line) + (re-search-forward "[^\n]*" limit))) + +(defun doctest-traceback-line-matcher (limit) + "A `font-lock-keyword' MATCHER that returns t if the current line is +the beginning of a traceback, and if so, sets `match-data' so that +group 0 spans the entire traceback. n.b.: limit is ignored." + (beginning-of-line) + (when (looking-at doctest-traceback-re) + (goto-char (match-end 0)) + t)) + +(defun doctest-source-matcher (limit) + "A `font-lock-keyword' MATCHER that returns t if the current line +contains a Python source expression that should be highlighted +after the point. If so, it sets `match-data' to cover the string +literal. The groups in `match-data' should be interpreted as follows: + + Group 1: comments + Group 2: def/class + Group 3: function/class name + Group 4: builtins preceeded by '.' + Group 5: keywords & builtins + Group 6: decorators + Group 7: strings +" + (let ((matchdata nil)) + ;; First, look for string literals. + (when doctest-highlight-strings + (save-excursion + (when (doctest-string-literal-matcher limit) + (setq matchdata + (list (match-beginning 0) (match-end 0) + nil nil nil nil nil nil nil nil nil nil nil nil + (match-beginning 0) (match-end 0)))))) + ;; Then, look for other keywords. If they occur before the + ;; string literal, then they take precedence. + (save-excursion + (when (and (re-search-forward doctest-keyword-re limit t) + (or (null matchdata) + (< (match-beginning 0) (car matchdata)))) + (setq matchdata (match-data)))) + (when matchdata + (set-match-data matchdata) + (goto-char (match-end 0)) + t))) + +(defun doctest-string-literal-matcher (limit &optional debug) + "A `font-lock-keyword' MATCHER that returns t if the current line +contains a string literal starting at or after the point. If so, it +expands `match-data' to cover the string literal. This matcher uses +`doctest-statement-info' to collect information about strings that +continue over multiple lines. It therefore might be a little slow for +very large statements." + (let* ((stmt-info (doctest-statement-info)) + (quotes (reverse (nth 5 stmt-info))) + (result nil)) + (if debug (doctest-debug "quotes %s" quotes)) + (while (and quotes (null result)) + (let* ((quote (pop quotes)) + (start (car quote)) + (end (min limit (or (cdr quote) limit)))) + (if debug (doctest-debug "quote %s-%s pt=%s lim=%s" + start end (point) limit)) + (when (or (and (<= (point) start) (< start limit)) + (and (< start (point)) (< (point) end))) + (setq start (max start (point))) + (set-match-data (list start end)) + (if debug (doctest-debug "marking string %s" (match-data))) + (goto-char end) + (setq result t)))) + result)) + +(defun doctest-results-selection-matcher (limit) + "Matches from `doctest-selected-failure' to the end of the +line. This is used to highlight the currently selected failure." + (when (and doctest-selected-failure + (<= (point) doctest-selected-failure) + (< doctest-selected-failure limit)) + (goto-char doctest-selected-failure) + (re-search-forward "[^\n]+" limit))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Source code editing & indentation +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun doctest-indent-source-line (&optional dedent-only) + "Re-indent the current line, as doctest source code. I.e., add a +prompt to the current line if it doesn't have one, and re-indent the +source code (to the right of the prompt). If `dedent-only' is true, +then don't increase the indentation level any." + (interactive "*") + (let ((indent-end nil)) + (save-excursion + (beginning-of-line) + (let ((new-indent (doctest-current-source-line-indentation dedent-only)) + (new-margin (doctest-current-source-line-margin)) + (line-had-prompt (looking-at doctest-prompt-re))) + ;; Delete the old prompt (if any). + (when line-had-prompt + (goto-char (match-beginning 2)) + (delete-char (- (match-end 2) (match-beginning 2)))) + ;; Delete the old indentation. + (delete-backward-char (skip-chars-forward " \t")) + ;; If it's a continuation line, or a new PS1 prompt, + ;; then copy the margin. + (when (or new-indent (not line-had-prompt)) + (beginning-of-line) + (delete-backward-char (skip-chars-forward " \t")) + (insert-char ?\ new-margin)) + ;; Add the new prompt. + (insert-string (if new-indent "... " ">>> ")) + ;; Add the new indentation + (if new-indent (insert-char ?\ new-indent)) + (setq indent-end (point)))) + ;; If we're left of the indentation end, then move up to the + ;; indentation end. + (if (< (point) indent-end) (goto-char indent-end)))) + +(defun doctest-current-source-line-indentation (&optional dedent-only) + "Return the post-prompt indent to use for this line. This is an +integer for a continuation lines, and nil for non-continuation lines." + (save-excursion + ;; Examine the previous doctest line (if present). + (let* ((prev-stmt-info (doctest-prev-statement-info)) + (prev-stmt-indent (nth 0 prev-stmt-info)) + (continuation-indent (nth 1 prev-stmt-info)) + (prev-stmt-opens-block (nth 2 prev-stmt-info)) + (prev-stmt-closes-block (nth 3 prev-stmt-info)) + (prev-stmt-blocks-outdent (nth 4 prev-stmt-info)) + ) + ;; Examine this doctest line. + (let* ((curr-line-indent 0) + (curr-line-outdented nil)) + (beginning-of-line) + (when (looking-at doctest-prompt-re) + (setq curr-line-indent (- (match-end 3) (match-beginning 3))) + (goto-char (match-end 3))) + (setq curr-line-outdented (and (looking-at doctest-outdent-re) + (not prev-stmt-blocks-outdent))) + ;; Compute the overall indent. + (let ((indent (or continuation-indent + (+ prev-stmt-indent + (if curr-line-outdented -4 0) + (if prev-stmt-opens-block 4 0) + (if prev-stmt-closes-block -4 0))))) + ;; If dedent-only is true, then make sure we don't indent. + (when dedent-only + (setq indent (min indent curr-line-indent))) + ;; If indent=0 and we're not outdented, then set indent to + ;; nil (to signify the start of a new source example). + (when (and (= indent 0) + (not (or curr-line-outdented continuation-indent))) + (setq indent nil)) + ;; Return the indentation. + indent))))) + +(defun doctest-prev-statement-info (&optional debug) + (save-excursion + (forward-line -1) + (doctest-statement-info debug))) + +(defun doctest-statement-info (&optional debug) + "Collect info about the previous statement, and return it as a list: + + (INDENT, CONTINUATION, OPENS-BLOCK, CLOSES-BLOCK, BLOCKS-OUTDENT, + QUOTES) + +INDENT -- The indentation of the previous statement (after the prompt) + +CONTINUATION -- If the previous statement is incomplete (e.g., has an +open paren or quote), then this is the appropriate indentation +level; otherwise, it's nil. + +OPENS-BLOCK -- True if the previous statement opens a Python control +block. + +CLOSES-BLOCK -- True if the previous statement closes a Python control +block. + +BLOCKS-OUTDENT -- True if the previous statement should 'block the +next statement from being considered an outdent. + +QUOTES -- A list of (START . END) pairs for all quotation strings. +" + (save-excursion + (end-of-line) + (let ((end (point))) + (while (and (doctest-on-source-line-p "...") (= (forward-line -1) 0))) + (cond + ;; If there's no previous >>> line, then give up. + ((not (doctest-on-source-line-p ">>>")) + '(0 nil nil nil nil)) + + ;; If there is a previous statement, walk through the source + ;; code, checking for operators that may be of interest. + (t + (beginning-of-line) + (let* ((quote-mark nil) (nesting 0) (indent-stack '()) + (stmt-indent 0) + (stmt-opens-block nil) + (stmt-closes-block nil) + (stmt-blocks-outdent nil) + (quotes '()) + (elt-re (concat "\\\\[^\n]\\|" + "(\\|)\\|\\[\\|\\]\\|{\\|}\\|" + "\"\"\"\\|\'\'\'\\|\"\\|\'\\|" + "#[^\n]*\\|" doctest-prompt-re))) + (while (re-search-forward elt-re end t) + (let* ((elt (match-string 0)) + (elt-first-char (substring elt 0 1))) + (if debug (doctest-debug "Debug: %s" elt)) + (cond + ;; Close quote -- set quote-mark back to nil. The + ;; second case is for cases like: ' ''' + (quote-mark + (cond + ((equal quote-mark elt) + (setq quote-mark nil) + (setcdr (car quotes) (point))) + ((equal quote-mark elt-first-char) + (setq quote-mark nil) + (setcdr (car quotes) (point)) + (backward-char 2)))) + ;; Prompt -- check if we're starting a new stmt. If so, + ;; then collect various info about it. + ((string-match doctest-prompt-re elt) + (when (and (null quote-mark) (= nesting 0)) + (let ((indent (- (match-end 3) (match-end 2)))) + (unless (looking-at "[ \t]*\n") + (setq stmt-indent indent) + (setq stmt-opens-block + (looking-at doctest-open-block-re)) + (setq stmt-closes-block + (looking-at doctest-close-block-re)) + (setq stmt-blocks-outdent + (looking-at doctest-no-outdent-re)))))) + ;; Open paren -- increment nesting, and update indent-stack. + ((string-match "(\\|\\[\\|{" elt-first-char) + (let ((elt-pos (point)) + (at-eol (looking-at "[ \t]*\n")) + (indent 0)) + (save-excursion + (re-search-backward doctest-prompt-re) + (if at-eol + (setq indent (+ 4 (- (match-end 3) (match-end 2)))) + (setq indent (- elt-pos (match-end 2)))) + (push indent indent-stack))) + (setq nesting (+ nesting 1))) + ;; Close paren -- decrement nesting, and pop indent-stack. + ((string-match ")\\|\\]\\|}" elt-first-char) + (setq indent-stack (cdr indent-stack)) + (setq nesting (max 0 (- nesting 1)))) + ;; Open quote -- set quote-mark. + ((string-match "\"\\|\'" elt-first-char) + (push (cons (- (point) (length elt)) nil) quotes) + (setq quote-mark elt))))) + + (let* ((continuation-indent + (cond + (quote-mark 0) + ((> nesting 0) (if (null indent-stack) 0 (car indent-stack))) + (t nil))) + (result + (list stmt-indent continuation-indent + stmt-opens-block stmt-closes-block + stmt-blocks-outdent quotes))) + (if debug (doctest-debug "Debug: %s" result)) + result))))))) + +(defun doctest-current-source-line-margin () + "Return the pre-prompt margin to use for this source line. This is +copied from the most recent source line, or set to +`doctest-default-margin' if there are no preceeding source lines." + (save-excursion + (save-restriction + (when (doctest-in-mmm-docstring-overlay) + (doctest-narrow-to-mmm-overlay)) + (beginning-of-line) + (forward-line -1) + (while (and (not (doctest-on-source-line-p)) + (re-search-backward doctest-prompt-re nil t)))) + (cond ((looking-at doctest-prompt-re) + (- (match-end 1) (match-beginning 1))) + ((doctest-in-mmm-docstring-overlay) + (doctest-default-margin-in-mmm-docstring-overlay)) + (t + doctest-default-margin)))) + +(defun doctest-electric-backspace () + "Delete the preceeding character, level of indentation, or +prompt. + +If point is at the leftmost column, delete the preceding newline. + +Otherwise, if point is at the first non-whitespace character +following an indented source line's prompt, then reduce the +indentation to the next multiple of 4; and update the source line's +prompt, when necessary. + +Otherwise, if point is at the first non-whitespace character +following an unindented source line's prompt, then remove the +prompt (converting the line to an output line or text line). + +Otherwise, if point is at the first non-whitespace character of a +line, the delete the line's indentation. + +Otherwise, delete the preceeding character. +" + (interactive "*") + (cond + ;; Beginning of line: delete preceeding newline. + ((bolp) (backward-delete-char 1)) + + ;; First non-ws char following prompt: dedent or remove prompt. + ((and (looking-at "[^ \t\n]\\|$") (doctest-looking-back doctest-prompt-re)) + (let* ((prompt-beg (match-beginning 2)) + (indent-beg (match-beginning 3)) (indent-end (match-end 3)) + (old-indent (- indent-end indent-beg)) + (new-indent (* (/ (- old-indent 1) 4) 4))) + (cond + ;; Indented source line: dedent it. + ((> old-indent 0) + (goto-char indent-beg) + (delete-region indent-beg indent-end) + (insert-char ?\ new-indent) + ;; Change prompt to PS1, when appropriate. + (when (and (= new-indent 0) (not (looking-at doctest-outdent-re))) + (delete-backward-char 4) + (insert-string ">>> "))) + ;; Non-indented source line: remove prompt. + (t + (goto-char indent-end) + (delete-region prompt-beg indent-end))))) + + ;; First non-ws char of a line: delete all indentation. + ((and (looking-at "[^ \n\t]\\|$") (doctest-looking-back "^[ \t]+")) + (delete-region (match-beginning 0) (match-end 0))) + + ;; Otherwise: delete a character. + (t + (backward-delete-char 1)))) + +(defun doctest-newline-and-indent () + "Insert a newline, and indent the new line appropriately. + +If the current line is a source line containing a bare prompt, +then clear the current line, and insert a newline. + +Otherwise, if the current line is a source line, then insert a +newline, and add an appropriately indented prompt to the new +line. + +Otherwise, if the current line is an output line, then insert a +newline and indent the new line to match the example's margin. + +Otherwise, insert a newline. + +If `doctest-avoid-trailing-whitespace' is true, then clear any +whitespace to the left of the point before inserting a newline. +" + (interactive "*") + ;; If we're avoiding trailing spaces, then delete WS before point. + (if doctest-avoid-trailing-whitespace + (delete-char (- (skip-chars-backward " \t")))) + (cond + ;; If we're on an empty prompt, delete it. + ((doctest-on-empty-source-line-p) + (delete-region (match-beginning 0) (match-end 0)) + (insert-char ?\n 1)) + ;; If we're on a doctest line, add a new prompt. + ((doctest-on-source-line-p) + (insert-char ?\n 1) + (doctest-indent-source-line)) + ;; If we're in doctest output, indent to the margin. + ((doctest-on-output-line-p) + (insert-char ?\n 1) + (insert-char ?\ (doctest-current-source-line-margin))) + ;; Otherwise, just add a newline. + (t (insert-char ?\n 1)))) + +(defun doctest-electric-colon () + "Insert a colon, and dedent the line when appropriate." + (interactive "*") + (insert-char ?: 1) + (when (doctest-on-source-line-p) + (doctest-indent-source-line t))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Code Execution +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun doctest-execute () + "Run doctest on the current buffer, or on the current docstring +if the point is inside an `mmm-mode' `doctest-docstring' region. +Display the results in the *doctest-output* buffer." + (interactive) + (doctest-execute-region (point-min) (point-max) nil t)) + +(defun doctest-execute-with-diff () + "Run doctest on the current buffer, or on the current docstring +if the point is inside an `mmm-mode' `doctest-docstring' region. +Display the results in the *doctest-output* buffer, using diff format." + (interactive) + (doctest-execute-region (point-min) (point-max) t t)) + +(defun doctest-execute-buffer-with-diff () + "Run doctest on the current buffer, and display the results in the +*doctest-output* buffer, using the diff format." + (interactive) + (doctest-execute-region (point-min) (point-max) t nil)) + +(defun doctest-execute-buffer () + "Run doctest on the current buffer, and display the results in the +*doctest-output* buffer." + (interactive) + (doctest-execute-region (point-min) (point-max) nil nil)) + +(defun doctest-execute-region (start end &optional diff + check-for-mmm-docstring-overlay) + "Run doctest on the current buffer, and display the results in the +*doctest-output* buffer." + (interactive "r") + ;; If it's already running, give the user a chance to restart it. + (when (doctest-process-live-p doctest-async-process) + (when (y-or-n-p "Doctest is already running. Restart it? ") + (doctest-cancel-async-process) + (message "Killing doctest..."))) + (cond + ((and doctest-async (doctest-process-live-p doctest-async-process)) + (message "Can't run two doctest processes at once!")) + (t + (let* ((results-buf-name (doctest-results-buffer-name)) + (in-docstring (and check-for-mmm-docstring-overlay + (doctest-in-mmm-docstring-overlay))) + (temp (doctest-temp-name)) (dir doctest-temp-directory) + (input-file (expand-file-name (concat temp ".py") dir)) + (globs-file (when in-docstring + (expand-file-name (concat temp "-globs.py") dir))) + (cur-buf (current-buffer)) + (in-buf (get-buffer-create "*doctest-input*")) + (script (doctest-script input-file globs-file diff))) + ;; If we're in a docstring, narrow start & end. + (when in-docstring + (let ((bounds (doctest-mmm-overlay-bounds))) + (setq start (max start (car bounds)) + end (min end (cdr bounds))))) + ;; Write the doctests to a file. + (save-excursion + (goto-char (min start end)) + (let ((lineno (doctest-line-number))) + (set-buffer in-buf) + ;; Add blank lines, to keep line numbers the same: + (dotimes (n (- lineno 1)) (insert-string "\n")) + ;; Add the selected region + (insert-buffer-substring cur-buf start end) + ;; Write it to a file + (write-file input-file))) + ;; If requested, write the buffer to a file for use as globs. + (when globs-file + (let ((cur-buf-start (point-min)) (cur-buf-end (point-max))) + (save-excursion + (set-buffer in-buf) + (delete-region (point-min) (point-max)) + (insert-buffer-substring cur-buf cur-buf-start cur-buf-end) + (write-file globs-file)))) + ;; Dispose of in-buf (we're done with it now. + (kill-buffer in-buf) + ;; Prepare the results buffer. Clear it, if it contains + ;; anything, and set its mode. + (setq doctest-results-buffer (get-buffer-create results-buf-name)) + (save-excursion + (set-buffer doctest-results-buffer) + (toggle-read-only 0) + (delete-region (point-min) (point-max)) + (doctest-results-mode) + (setq doctest-source-buffer cur-buf) + ) + ;; Add markers to examples, and record what line number each one + ;; starts at. That way, if the input buffer is edited, we can + ;; still find corresponding examples in the output. + (doctest-mark-examples) + + ;; Run doctest + (cond (doctest-async + ;; Asynchronous mode: + (let ((process (start-process "*doctest*" doctest-results-buffer + doctest-python-command + "-c" script))) + ;; Store some information about the process. + (setq doctest-async-process-buffer cur-buf) + (setq doctest-async-process process) + (push input-file doctest-async-process-tempfiles) + (when globs-file + (push globs-file doctest-async-process-tempfiles)) + ;; Set up a sentinel to respond when it's done running. + (set-process-sentinel process 'doctest-async-process-sentinel) + + ;; Show the output window. + (let ((w (display-buffer doctest-results-buffer))) + (when doctest-follow-output + ;; Insert a newline, which will move the buffer's + ;; point past the process's mark -- this causes the + ;; window to scroll as new output is generated. + (save-current-buffer + (set-buffer doctest-results-buffer) + (insert-string "\n") + (set-window-point w (point))))) + + ;; Let the user know the process is running. + (doctest-update-mode-line ":running") + (message "Running doctest..."))) + (t + ;; Synchronous mode: + (call-process doctest-python-command nil + doctest-results-buffer t "-c" script) + (doctest-handle-output) + (delete-file input-file) + (when globs-file + (delete-file globs-file)))))))) + +(defun doctest-handle-output () + "This function, which is called after the 'doctest' process spawned +by doctest-execute-buffer has finished, checks the doctest results +buffer. If that buffer is empty, it reports no errors and hides it; +if that buffer is not empty, it reports that errors occured, displays +the buffer, and runs doctest-postprocess-results." + ;; If any tests failed, display them. + (cond ((not (buffer-live-p doctest-results-buffer)) + (doctest-warn "Results buffer not found!")) + ((> (buffer-size doctest-results-buffer) 1) + (display-buffer doctest-results-buffer) + (doctest-postprocess-results) + (let ((num (length doctest-example-markers))) + (message "%d doctest example%s failed!" num + (if (= num 1) "" "s")))) + (t + (display-buffer doctest-results-buffer) + (delete-windows-on doctest-results-buffer) + (message "All doctest examples passed!")))) + +(defun doctest-async-process-sentinel (process state) + "A process sentinel, called when the asynchronous doctest process +completes, which calls doctest-handle-output." + ;; Check to make sure we got the process we're expecting. On + ;; some operating systems, this will end up getting called twice + ;; when we use doctest-cancel-async-process; this check keeps us + ;; from trying to clean up after the same process twice (since we + ;; set doctest-async-process to nil when we're done). + (when (and (equal process doctest-async-process) + (buffer-live-p doctest-async-process-buffer)) + (save-current-buffer + (set-buffer doctest-async-process-buffer) + (cond ((not (buffer-live-p doctest-results-buffer)) + (doctest-warn "Results buffer not found!")) + ((equal state "finished\n") + (doctest-handle-output) + (let ((window (get-buffer-window + doctest-async-process-buffer t))) + (when window (set-window-point window (point))))) + ((equal state "killed\n") + (message "Doctest killed.")) + (t + (message "Doctest failed -- %s" state) + (display-buffer doctest-results-buffer))) + (doctest-update-mode-line "") + (while doctest-async-process-tempfiles + (delete-file (pop doctest-async-process-tempfiles))) + (setq doctest-async-process nil)))) + +(defun doctest-cancel-async-process () + "If a doctest process is running, then kill it." + (interactive "") + (when (doctest-process-live-p doctest-async-process) + ;; Update the modeline + (doctest-update-mode-line ":killing") + ;; Kill the process. + (kill-process doctest-async-process) + ;; Run the sentinel. (Depending on what OS we're on, the sentinel + ;; may end up getting called once or twice.) + (doctest-async-process-sentinel doctest-async-process "killed\n") + )) + +(defun doctest-postprocess-results () + "Post-process the doctest results buffer: check what version of +doctest was used, and set doctest-results-py-version accordingly; +turn on read-only mode; filter the example markers; hide the example +source (if `doctest-hide-example-source' is non-nil); and select the +first failure." + (save-excursion + (set-buffer doctest-results-buffer) + ;; Check if we're using an old doctest version. + (goto-char (point-min)) + (if (re-search-forward doctest-py21-results-re nil t) + (setq doctest-results-py-version 'py21) + (setq doctest-results-py-version 'py24)) + ;; Turn on read-only mode. + (toggle-read-only t)) + + (doctest-filter-example-markers) + (if doctest-hide-example-source + (doctest-hide-example-source)) + (doctest-next-failure 1)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Markers +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun doctest-mark-examples () + "Add a marker at the beginning of every (likely) example in the +input buffer; and create a list, `doctest-example-markers', +which maps from markers to the line numbers they originally occured +on. This will allow us to find the corresponding example in the +doctest output, even if the input buffer is edited." + (dolist (marker-info doctest-example-markers) + (set-marker (car marker-info) nil)) + (setq doctest-example-markers '()) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "^ *>>> " nil t) + (backward-char 4) + (push (cons (point-marker) (doctest-line-number)) + doctest-example-markers) + (forward-char 4)))) + +(defun doctest-filter-example-markers () + "Remove any entries from `doctest-example-markers' that do not +correspond to a failed example." + (let ((filtered nil) (markers doctest-example-markers)) + (save-excursion + (set-buffer doctest-results-buffer) + (goto-char (point-max)) + (while (re-search-backward (doctest-results-loc-re) nil t) + (let ((lineno (string-to-int (match-string 1)))) + (when (equal doctest-results-py-version 'py21) + (setq lineno (+ lineno 1))) + (while (and markers (< lineno (cdar markers))) + (set-marker (caar markers) nil) + (setq markers (cdr markers))) + (if (and markers (= lineno (cdar markers))) + (push (pop markers) filtered) + (doctest-warn "Example expected on line %d but not found %s" + lineno markers))))) + (dolist (marker-info markers) + (set-marker (car marker-info) nil)) + (setq doctest-example-markers filtered))) + +(defun doctest-prev-example-marker () + "Helper for doctest-replace-output: move to the preceeding example +marker, and return the corresponding 'original' lineno. If none is +found, return nil." + (let ((lineno nil) + (pos nil)) + (save-excursion + (end-of-line) + (when (re-search-backward "^\\( *\\)>>> " nil t) + (goto-char (match-end 1)) + (dolist (marker-info doctest-example-markers) + (when (= (marker-position (car marker-info)) (point)) + (setq lineno (cdr marker-info)) + (setq pos (point)))))) + (unless (null lineno) + (goto-char pos) + lineno))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Navigation +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun doctest-next-failure (count) + "Move to the top of the next failing example, and highlight the +example's failure description in *doctest-output*." + (interactive "p") + (cond + ((and doctest-async (doctest-process-live-p doctest-async-process)) + (message "Wait for doctest to finish running!")) + ((not (doctest-results-buffer-valid-p)) + (message "Run doctest first! (C-c C-c)")) + ((equal count 0) + t) + (t + (let ((marker nil) (example-markers doctest-example-markers) + (results-window (display-buffer doctest-results-buffer))) + (save-excursion + (set-buffer doctest-results-buffer) + ;; Pick up where we left off. + ;; (nb: doctest-selected-failure is buffer-local) + (goto-char (or doctest-selected-failure (point-min))) + ;; Skip past anything on *this* line. + (if (>= count 0) (end-of-line) (beginning-of-line)) + ;; Look for the next failure + (when + (if (>= count 0) + (re-search-forward (doctest-results-loc-re) nil t count) + (re-search-backward (doctest-results-loc-re) nil t (- count))) + ;; We found a failure: + (let ((old-selected-failure doctest-selected-failure)) + (beginning-of-line) + ;; Extract the line number for the doctest file. + (let ((orig-lineno (string-to-int (match-string 1)))) + (when (equal doctest-results-py-version 'py21) + (setq orig-lineno (+ orig-lineno 1))) + (dolist (marker-info example-markers) + (when (= orig-lineno (cdr marker-info)) + (setq marker (car marker-info))))) + + ;; Update the window cursor. + (beginning-of-line) + (set-window-point results-window (point)) + ;; Store our position for next time. + (setq doctest-selected-failure (point)) + ;; Update selection. + (doctest-fontify-line old-selected-failure) + (doctest-fontify-line doctest-selected-failure)))) + + (cond + ;; We found a failure -- move point to the selected failure. + (marker + (goto-char (marker-position marker)) + (beginning-of-line)) + ;; We didn't find a failure, but there is one -- wrap. + ((> (length doctest-example-markers) 0) + (if (>= count 0) (doctest-first-failure) (doctest-last-failure))) + ;; We didn't find a failure -- alert the user. + (t (message "No failures found!"))))))) + +(defun doctest-prev-failure (count) + "Move to the top of the previous failing example, and highlight +the example's failure description in *doctest-output*." + (interactive "p") + (doctest-next-failure (- count))) + +(defun doctest-first-failure () + "Move to the top of the first failing example, and highlight +the example's failure description in *doctest-output*." + (interactive) + (if (buffer-live-p doctest-results-buffer) + (save-excursion + (set-buffer doctest-results-buffer) + (let ((old-selected-failure doctest-selected-failure)) + (setq doctest-selected-failure (point-min)) + (doctest-fontify-line old-selected-failure)))) + (doctest-next-failure 1)) + +(defun doctest-last-failure () + "Move to the top of the last failing example, and highlight +the example's failure description in *doctest-output*." + (interactive) + (if (buffer-live-p doctest-results-buffer) + (save-excursion + (set-buffer doctest-results-buffer) + (let ((old-selected-failure doctest-selected-failure)) + (setq doctest-selected-failure (point-max)) + (doctest-fontify-line old-selected-failure)))) + (doctest-next-failure -1)) + +(defun doctest-select-failure () + "Move to the top of the currently selected example, and select that +example in the source buffer. Intended for use in the results +buffer." + (interactive) + (re-search-backward doctest-results-divider-re) + (let ((old-selected-failure doctest-selected-failure)) + (setq doctest-selected-failure (point)) + (doctest-fontify-line doctest-selected-failure) + (doctest-fontify-line old-selected-failure)) + (pop-to-buffer doctest-source-buffer) + (doctest-next-failure 1)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Replace Output +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun doctest-replace-output () + "Move to the top of the closest example, and replace its output +with the 'got' output from the *doctest-output* buffer. An error is +displayed if the chosen example is not listed in *doctest-output*, or +if the 'expected' output for the example does not exactly match the +output listed in the source buffer. The user is asked to confirm the +replacement." + (interactive) + ;; Move to the beginning of the example. + (cond + ((and doctest-async (doctest-process-live-p doctest-async-process)) + (message "Wait for doctest to finish running!")) + ((not (doctest-results-buffer-valid-p)) + (message "Run doctest first! (C-c C-c)")) + ((save-excursion (set-buffer doctest-results-buffer) + (equal doctest-results-py-version 'py21)) + (error "doctest-replace-output requires python 2.4+")) + (t + (save-excursion + (save-restriction + (when (doctest-in-mmm-docstring-overlay) + (doctest-narrow-to-mmm-overlay)) + + (let* ((orig-buffer (current-buffer)) + ;; Find an example, and look up its original lineno. + (lineno (doctest-prev-example-marker)) + ;; Find the example's indentation. + (prompt-indent (doctest-line-indentation))) + + ;; Switch to the output buffer, and look for the example. + ;; If we don't find one, complain. + (cond + ((null lineno) (message "Doctest example not found")) + (t + (set-buffer doctest-results-buffer) + (goto-char (point-min)) + (let ((output-re (format "^File .*, line %s," lineno))) + (when (not (re-search-forward output-re nil t)) + (message "This doctest example did not fail") + (setq lineno nil))))) + + ;; If we didn't find an example, give up. + (when (not (null lineno)) + ;; Get the output's 'expected' & 'got' texts. + (let ((doctest-got nil) (doctest-expected nil) (header nil)) + (while (setq header (doctest-results-next-header)) + (cond + ((equal header "Failed example:") + t) + ((equal header "Expected nothing") + (setq doctest-expected "")) + ((equal header "Expected:") + (unless (re-search-forward "^\\(\\( \\).*\n\\)*" nil t) + (error "Error parsing doctest output")) + (setq doctest-expected (doctest-replace-regexp-in-string + "^ " prompt-indent + (match-string 0)))) + ((equal header "Got nothing") + (setq doctest-got "")) + ((or (equal header "Got:") (equal header "Exception raised:")) + (unless (re-search-forward "^\\(\\( \\).*\n\\)*" nil t) + (error "Error parsing doctest output")) + (setq doctest-got (doctest-replace-regexp-in-string + "^ " prompt-indent (match-string 0)))) + ((string-match "^Differences" header) + (error (concat "doctest-replace-output can not be used " + "with diff style output"))) + (t (error "Unexpected header %s" header)))) + + ;; Go back to the source buffer. + (set-buffer orig-buffer) + + ;; Skip ahead to the output. + (beginning-of-line) + (unless (re-search-forward "^ *>>>.*") + (error "Error parsing doctest output")) + (re-search-forward "\\(\n *\\.\\.\\..*\\)*\n?") + (when (looking-at "\\'") (insert-char ?\n)) + + ;; Check that the output matches. + (let ((start (point)) end) + (cond ((re-search-forward "^ *\\(>>>.*\\|$\\)" nil t) + (setq end (match-beginning 0))) + (t + (goto-char (point-max)) + (insert-string "\n") + (setq end (point-max)))) + (when (and doctest-expected + (not (equal (buffer-substring start end) + doctest-expected))) + (warn "{%s} {%s}" (buffer-substring start end) + doctest-expected) + (error (concat "This example's output has been modified " + "since doctest was last run"))) + (setq doctest-expected (buffer-substring start end)) + (goto-char end)) + + ;; Trim exceptions + (when (and doctest-trim-exceptions + (string-match doctest-traceback-re + doctest-got)) + (let ((s1 0) (e1 (match-end 1)) + (s2 (match-beginning 2)) (e2 (match-end 2)) + (s3 (match-beginning 3)) (e3 (length doctest-got))) + (setq doctest-got + (concat (substring doctest-got s1 e1) + (substring doctest-got s2 e2) " . . .\n" + (substring doctest-got s3 e3))))) + + ;; Confirm it with the user. + (let ((confirm-buffer (get-buffer-create "*doctest-confirm*"))) + (set-buffer confirm-buffer) + ;; Erase anything left over in the buffer. + (delete-region (point-min) (point-max)) + ;; Write a confirmation message + (if (equal doctest-expected "") + (insert-string "Replace nothing\n") + (insert-string (concat "Replace:\n" doctest-expected))) + (if (equal doctest-got "") + (insert-string "With nothing\n") + (insert-string (concat "With:\n" doctest-got))) + (let ((confirm-window (display-buffer confirm-buffer))) + ;; Shrink the confirm window. + (shrink-window-if-larger-than-buffer confirm-window) + ;; Return to the original buffer. + (set-buffer orig-buffer) + ;; Match the old expected region. + (when doctest-expected + (search-backward doctest-expected)) + (when (equal doctest-expected "") (backward-char 1)) + ;; Get confirmation & do the replacement + (widen) + (cond ((y-or-n-p "Ok to replace? ") + (when (equal doctest-expected "") (forward-char 1)) + (replace-match doctest-got t t) + (message "Replaced.")) + (t + (message "Replace cancelled."))) + ;; Clean up our confirm window + (kill-buffer confirm-buffer) + (delete-window confirm-window))))))))))) + +(defun doctest-results-next-header () + "Move to the next header in the doctest results buffer, and return +the string contents of that header. If no header is found, return +nil." + (if (re-search-forward (concat doctest-results-header-re "\\|" + doctest-results-divider-re) nil t) + (let ((result (match-string 0))) + (if (string-match doctest-results-header-re result) + result + nil)) + nil)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; mmm-mode support +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; MMM Mode is a minor mode for Emacs which allows Multiple Major +;; Modes to coexist in a single buffer. + +;;;###autoload +(defun doctest-register-mmm-classes (&optional add-mode-ext-classes + fix-mmm-fontify-region-bug) + "Register doctest's mmm classes, allowing doctest to be used as a +submode region in other major modes, such as python-mode and rst-mode. +Two classes are registered: + +`doctest-docstring' + + Used to edit docstrings containing doctest examples in python- + mode. Docstring submode regions start and end with triple-quoted + strings (\"\"\"). In order to avoid confusing start-string + markers and end-string markers, all triple-quote strings in the + buffer are treated as submode regions (even if they're not + actually docstrings). Use (C-c % C-d) to insert a new doctest- + docstring region. When `doctest-execute' (C-c C-c) is called + inside a doctest-docstring region, it executes just the current + docstring. The globals for this execution are constructed by + importing the current buffer's contents in Python. + +`doctest-example' + + Used to edit doctest examples in text-editing modes, such as + `rst-mode' or `text-mode'. Docstring submode regions start with + optionally indented prompts (>>>) and end with blank lines. Use + (C-c % C-e) to insert a new doctest-example region. When + `doctest-execute' (C-c C-c) is called inside a doctest-example + region, it executes all examples in the buffer. + +If ADD-MODE-EXT-CLASSES is true, then register the new classes in +`mmm-mode-ext-classes-alist', which will cause them to be used by +default in the following modes: + + doctest-docstring: python-mode + doctest-example: rst-mode + +If FIX-MMM-FONTIFY-REGION-BUG is true, then register a hook that will +fix a bug in `mmm-fontify-region' that affects some (but not all) +versions of emacs. (See `doctest-fixed-mmm-fontify-region' for more +info.)" + (interactive) + (require 'mmm-auto) + (mmm-add-classes + '( + ;; === doctest-docstring === + (doctest-docstring :submode doctest-mode + + ;; The front is any triple-quote. Include it in the submode region, + ;; to prevent clashes between the two syntax tables over quotes. + :front "\\(\"\"\"\\|'''\\)" :include-front t + + ;; The back matches the front. Include just the first character + ;; of the quote. If we didn't include at least one quote, then + ;; the outer modes quote-counting would be thrown off. But if + ;; we include all three, we run into a bug in mmm-mode. See + ;; for more info about the bug. + :save-matches t :back "~1" :back-offset 1 :end-not-begin t + + ;; Define a skeleton for entering new docstrings. + :insert ((?d docstring nil @ "\"\"" @ "\"" \n + _ \n "\"" @ "\"\"" @))) + + ;; === doctest-example === + (doctest-example + :submode doctest-mode + ;; The front is an optionally indented prompt. + :front "^[ \t]*>>>" :include-front t + ;; The back is a blank line. + :back "^[ \t]*$" + ;; Define a skeleton for entering new docstrings. + :insert ((?e doctest-example nil + @ @ " >>> " _ "\n\n" @ @))))) + + ;; Register some local variables that need to be saved. + (add-to-list 'mmm-save-local-variables + '(doctest-results-buffer buffer)) + (add-to-list 'mmm-save-local-variables + '(doctest-example-markers buffer)) + + ;; Register association with modes, if requested. + (when add-mode-ext-classes + (mmm-add-mode-ext-class 'python-mode nil 'doctest-docstring) + (mmm-add-mode-ext-class 'rst-mode nil 'doctest-example)) + + ;; Fix the buggy mmm-fontify-region, if requested. + (when fix-mmm-fontify-region-bug + (add-hook 'mmm-mode-hook 'doctest-fix-mmm-fontify-region-bug))) + +(defvar doctest-old-mmm-fontify-region 'nil + "Used to hold the original definition of `mmm-fontify-region' when it +is rebound by `doctest-fix-mmm-fontify-region-bug'.") + +(defun doctest-fix-mmm-fontify-region-bug () + "A function for `mmm-mode-hook' which fixes a potential bug in +`mmm-fontify-region' by using `doctest-fixed-mmm-fontify-region' +instead. (See `doctest-fixed-mmm-fontify-region' for more info.)" + (setq font-lock-fontify-region-function + 'doctest-fixed-mmm-fontify-region)) + +(defun doctest-fixed-mmm-fontify-region (start stop &optional loudly) + "A replacement for `mmm-fontify-region', which fixes a bug caused by +versions of emacs where post-command-hooks are run *before* +fontification. `mmm-mode' assumes that its post-command-hook will be +run after fontification; and if it's not, then mmm-mode can end up +with the wrong local variables, keymap, etc. after fontification. We +fix that here by redefining `mmm-fontify-region' to remember what +submode overlay it started in; and to return to that overlay after +fontification is complete. The original definition of +`mmm-fontify-region' is stored in `doctest-old-mmm-fontify-region'." + (let ((overlay mmm-current-overlay)) + (mmm-fontify-region start stop loudly) + (if (and overlay (or (< (point) (overlay-start overlay)) + (> (point) (overlay-end overlay)))) + (goto-char (overlay-start overlay))) + (mmm-update-submode-region))) + +(defun doctest-in-mmm-docstring-overlay () + (and (featurep 'mmm-auto) + (mmm-overlay-at (point)) + (save-excursion + (goto-char (overlay-start (mmm-overlay-at (point)))) + (looking-at "\"\"\"\\|\'\'\'")))) + +(defun doctest-narrow-to-mmm-overlay () + "If we're in an mmm-mode overlay, then narrow to that overlay. +This is useful, e.g., to keep from interpreting the close-quote of a +docstring as part of the example's output." + (let ((bounds (doctest-mmm-overlay-bounds))) + (when bounds (narrow-to-region (car bounds) (cdr bounds))))) + +(defun doctest-default-margin-in-mmm-docstring-overlay () + (save-excursion + (let ((pos (car (doctest-mmm-overlay-bounds)))) + (goto-char pos) + (when (doctest-looking-back "\"\"\"\\|\'\'\'") + (setq pos (- pos 3))) + (beginning-of-line) + (- pos (point))))) + +(defun doctest-mmm-overlay-bounds () + (when (featurep 'mmm-auto) + (let ((overlay (mmm-overlay-at (point)))) + (when overlay + (let ((start (overlay-start overlay)) + (end (overlay-end overlay))) + (when (doctest-in-mmm-docstring-overlay) + (save-excursion + (goto-char start) + (re-search-forward "[\"\']*") + (setq start (point)) + (goto-char end) + (while (doctest-looking-back "[\"\']") + (backward-char 1)) + (setq end (point)))) + (cons start end)))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Helper functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun doctest-on-source-line-p (&optional prompt) + "Return true if the current line is a source line. The optional +argument prompt can be used to specify which type of source +line (... or >>>)." + (save-excursion + (beginning-of-line) + ;; Check if we're looking at a prompt (of the right type). + (when (and (looking-at doctest-prompt-re) + (or (null prompt) + (equal prompt (substring (match-string 2) 0 3)))) + ;; Scan backwards to make sure there's a >>> somewhere. Otherwise, + ;; this might be a '...' in the text or in an example's output. + (while (looking-at "^[ \t]*[.][.][.]") + (forward-line -1)) + (looking-at "^[ \t]*>>>")))) + +(defun doctest-on-empty-source-line-p () + "Return true if the current line contains a bare prompt." + (save-excursion + (beginning-of-line) + (and (doctest-on-source-line-p) + (looking-at (concat doctest-prompt-re "$"))))) + +(defun doctest-on-output-line-p () + "Return true if the current line is an output line." + (save-excursion + (beginning-of-line) + ;; The line must not be blank or a source line. + (when (not (or (doctest-on-source-line-p) (looking-at "[ \t]*$"))) + ;; The line must follow a source line, with no intervening blank + ;; lines. + (while (not (or (doctest-on-source-line-p) (looking-at "[ \t]*$") + (= (point) (point-min)))) + (forward-line -1)) + (doctest-on-source-line-p)))) + +(defun doctest-find-output-line (&optional limit) + "Move forward to the next doctest output line (staying within +the given bounds). Return the character position of the doctest +output line if one was found, and false otherwise." + (let ((found-it nil) ; point where we found an output line + (limit (or limit (point-max)))) ; default value for limit + (save-excursion + ;; Keep moving forward, one line at a time, until we find a + ;; doctest output line. + (while (and (not found-it) (< (point) limit) (not (eobp))) + (if (and (not (eolp)) (doctest-on-output-line-p)) + (setq found-it (point)) + (forward-line)))) + ;; If we found a doctest output line, then go to it. + (if found-it (goto-char found-it)))) + +(defun doctest-line-indentation () + "Helper for doctest-replace-output: return the whitespace indentation +at the beginning of this line." + (save-excursion + (end-of-line) + (re-search-backward "^\\( *\\)" nil t) + (match-string 1))) + +(defun doctest-optionflags (&optional diff) + "Return a string describing the optionflags that should be used +by doctest. If DIFF is non-nil, then add the REPORT_UDIFF flag." + (let ((flags "0")) + (dolist (flag doctest-optionflags) + (setq flags (concat flags "|" flag))) + (if diff (concat flags "|" "REPORT_UDIFF") flags))) + +(defun doctest-results-loc-re () + "Return the regexp that should be used to look for doctest example +location markers in doctest's output (based on which version of +doctest was used" + (cond + ((equal doctest-results-py-version 'py21) + doctest-py21-results-loc-re) + ((equal doctest-results-py-version 'py24) + doctest-py24-results-loc-re) + (t (error "bad value for doctest-results-py-version")))) + +(defun doctest-results-buffer-name () + "Return the buffer name that should be used for the doctest results +buffer. This is computed from the variable +`doctest-results-buffer-name'." + (doctest-replace-regexp-in-string + "%[nfN]" + (lambda (sym) + (cond ((equal sym "%n") (buffer-name)) + ((equal sym "%N") (doctest-replace-regexp-in-string + "[.]doctest$" "" (buffer-name) t)) + ((equal sym "%f") (buffer-file-name)))) + doctest-results-buffer-name t)) + +(defun doctest-script (input-file globs-file diff) + "..." + (doctest-replace-regexp-in-string + "%[tnflm]" + (lambda (sym) + (cond ((equal sym "%n") (buffer-name)) + ((equal sym "%f") (buffer-file-name)) + ((equal sym "%l") (doctest-optionflags diff)) + ((equal sym "%t") input-file) + ((equal sym "%m") (or globs-file "")))) + doctest-script t)) + +(defun doctest-hide-example-source () + "Delete the source code listings from the results buffer (since it's +easy enough to see them in the original buffer)" + (save-excursion + (set-buffer doctest-results-buffer) + (toggle-read-only 0) + (goto-char (point-min)) + (while (re-search-forward doctest-example-source-re nil t) + (replace-match "" nil nil)) + (toggle-read-only t))) + +(defun doctest-results-buffer-valid-p () + "Return true if this buffer has a live results buffer; and that +results buffer reports this buffer as its source buffer. (Two +buffers in doctest-mode might point to the same results buffer; +but only one of them will be equal to that results buffer's +source buffer." + (let ((cur-buf (current-buffer))) + (and (buffer-live-p doctest-results-buffer) + (save-excursion + (set-buffer doctest-results-buffer) + (equal cur-buf doctest-source-buffer))))) + +(defun doctest-update-mode-line (value) + "Update the doctest mode line with the given string value. This +is used to display information about asynchronous processes that +are run by doctest-mode." + (setq doctest-mode-line-process + value) + (force-mode-line-update t)) + +(defun doctest-version () + "Echo the current version of `doctest-mode' in the minibuffer." + (interactive) + (message "Using `doctest-mode' version %s" doctest-version)) + +(defun doctest-warn (msg &rest args) + "Display a doctest warning message." + (if (fboundp 'display-warning) + (display-warning 'doctest (apply 'format msg args)) + (apply 'message msg args))) + +(defun doctest-debug (msg &rest args) + "Display a doctest debug message." + (if (fboundp 'display-warning) + (display-warning 'doctest (apply 'format msg args) 'debug) + (apply 'message msg args))) + +(defvar doctest-serial-number 0) ;used if broken-temp-names. +(defun doctest-temp-name () + "Return a new temporary filename, for use in calling doctest." + (if (memq 'broken-temp-names features) + (let + ((sn doctest-serial-number) + (pid (and (fboundp 'emacs-pid) (emacs-pid)))) + (setq doctest-serial-number (1+ doctest-serial-number)) + (if pid + (format "doctest-%d-%d" sn pid) + (format "doctest-%d" sn))) + (make-temp-name "doctest-"))) + +(defun doctest-fontify-line (charpos) + "Run font-lock-fontify-region on the line containing the given +position." + (if (and charpos (functionp 'font-lock-fontify-region)) + (save-excursion + (goto-char charpos) + (let ((beg (progn (beginning-of-line) (point))) + (end (progn (end-of-line) (point)))) + (font-lock-fontify-region beg end))))) + +(defun doctest-do-auto-fill () + "If the current line is a soucre line or an output line, do nothing. +Otherwise, call (do-auto-fill)." + (cond + ;; Don't wrap source lines. + ((doctest-on-source-line-p) nil) + ;; Don't wrap output lines + ((doctest-on-output-line-p) nil) + ;; Wrap all other lines + (t (do-auto-fill)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Emacs Compatibility Functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Define compatible versions of functions that are defined +;; for some versions of emacs but not others. + +;; Backwards compatibility: looking-back +(cond ((fboundp 'looking-back) ;; Emacs 22.x + (defalias 'doctest-looking-back 'looking-back)) + (t + (defun doctest-looking-back (regexp) + "Return true if text before point matches REGEXP." + (save-excursion + (let ((orig-pos (point))) + ;; Search backwards for the regexp. + (if (re-search-backward regexp nil t) + ;; Check if it ends at the original point. + (= orig-pos (match-end 0)))))))) + +;; Backwards compatibility: replace-regexp-in-string +(cond ((fboundp 'replace-regexp-in-string) + (defalias 'doctest-replace-regexp-in-string 'replace-regexp-in-string)) + (t ;; XEmacs 21.x or Emacs 20.x + (defun doctest-replace-regexp-in-string + (regexp rep string &optional fixedcase literal) + "Replace all matches for REGEXP with REP in STRING." + (let ((start 0)) + (while (and (< start (length string)) + (string-match regexp string start)) + (setq start (+ (match-end 0) 1)) + (let ((newtext (if (functionp rep) + (save-match-data + (funcall rep (match-string 0 string))) + rep))) + (setq string (replace-match newtext fixedcase + literal string))))) + string))) + +;; Backwards compatibility: line-number +(cond ((fboundp 'line-number) ;; XEmacs + (defalias 'doctest-line-number 'line-number)) + ((fboundp 'line-number-at-pos) ;; Emacs 22.x + (defalias 'doctest-line-number 'line-number-at-pos)) + (t ;; Emacs 21.x + (defun doctest-line-number (&optional pos) + "Return the line number of POS (default=point)." + (1+ (count-lines 1 + (save-excursion (progn (beginning-of-line) + (or pos (point))))))))) + +;; Backwards compatibility: process-live-p +(cond ((fboundp 'process-live-p) ;; XEmacs + (defalias 'doctest-process-live-p 'process-live-p)) + (t ;; Emacs + (defun doctest-process-live-p (process) + (and (processp process) + (equal (process-status process) 'run))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Doctest Results Mode (output of doctest-execute-buffer) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Register the font-lock keywords (xemacs) +(put 'doctest-results-mode 'font-lock-defaults + '(doctest-results-font-lock-keywords)) + +;; Register the font-lock keywords (older versions of gnu emacs) +(when (boundp 'font-lock-defaults-alist) + (add-to-list 'font-lock-defaults-alist + '(doctest-results-mode doctest-results-font-lock-keywords + nil nil nil nil))) + +(defvar doctest-selected-failure nil + "The location of the currently selected failure. +This variable is uffer-local to doctest-results-mode buffers.") + +(defvar doctest-source-buffer nil + "The buffer that spawned this one. +This variable is uffer-local to doctest-results-mode buffers.") + +(defvar doctest-results-py-version nil + "A symbol indicating which version of Python was used to generate +the results in a doctest-results-mode buffer. Can be either the +symbol `py21' or the symbol `py24'. +This variable is uffer-local to doctest-results-mode buffers.") + +;; Keymap for doctest-results-mode. +(defconst doctest-results-mode-map + (let ((map (make-keymap))) + (define-key map [return] 'doctest-select-failure) + map) + "Keymap for doctest-results-mode.") + +;; Syntax table for doctest-results-mode. +(defvar doctest-results-mode-syntax-table nil + "Syntax table used in `doctest-results-mode' buffers.") +(when (not doctest-results-mode-syntax-table) + (setq doctest-results-mode-syntax-table (make-syntax-table)) + (dolist (entry '(("(" . "()") ("[" . "(]") ("{" . "(}") + (")" . ")(") ("]" . ")[") ("}" . "){") + ("$%&*+-/<=>|'\"`" . ".") ("_" . "w"))) + (dolist (char (string-to-list (car entry))) + (modify-syntax-entry char (cdr entry) + doctest-results-mode-syntax-table)))) + +;; Define the mode +(defun doctest-results-mode () + "A major mode used to display the results of running doctest. +See `doctest-mode'. + +\\{doctest-results-mode-map}" + (interactive) + + ;; Declare local variables. + (kill-all-local-variables) + (make-local-variable 'font-lock-defaults) + (make-local-variable 'doctest-selected-failure) + (make-local-variable 'doctest-source-buffer) + (make-local-variable 'doctest-results-py-version) + + ;; Define local variables. + (setq major-mode 'doctest-results-mode + mode-name "Doctest-Results" + mode-line-process 'doctest-mode-line-process + font-lock-defaults '(doctest-results-font-lock-keywords + nil nil nil nil)) + ;; Define keymap. + (use-local-map doctest-results-mode-map) + + ;; Define the syntax table. + (set-syntax-table doctest-results-mode-syntax-table) + + ;; Enable font-lock mode. + (if (featurep 'font-lock) (font-lock-mode 1))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Doctest Mode +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Register the font-lock keywords (xemacs) +(put 'doctest-mode 'font-lock-defaults '(doctest-font-lock-keywords + nil nil nil nil)) + +;; Register the font-lock keywords (older versions of gnu emacs) +(when (boundp 'font-lock-defaults-alist) + (add-to-list 'font-lock-defaults-alist + '(doctest-mode doctest-font-lock-keywords + nil nil nil nil))) + +(defvar doctest-results-buffer nil + "The output buffer for doctest-mode. +This variable is buffer-local to doctest-mode buffers.") + +(defvar doctest-example-markers nil + "A list mapping markers to the line numbers at which they appeared +in the buffer at the time doctest was last run. This is used to find +'original' line numbers, which can be used to search the doctest +output buffer. It's encoded as a list of (MARKER . POS) tuples, in +reverse POS order. +This variable is buffer-local to doctest-mode buffers.") + +;; These are global, since we only one run process at a time: +(defvar doctest-async-process nil + "The process object created by the asynchronous doctest process") +(defvar doctest-async-process-tempfiles nil + "A list of tempfile names created by the asynchronous doctest process") +(defvar doctest-async-process-buffer nil + "The source buffer for the asynchronous doctest process") +(defvar doctest-mode-line-process "" + "A string displayed on the modeline, to indicate when doctest is +running asynchronously.") + +;; Keymap for doctest-mode. n.b.: we intentionally define [tab] +;; rather than overriding indent-line-function, since we don't want +;; doctest-indent-source-line to be called by do-auto-fill. +(defconst doctest-mode-map + (let ((map (make-keymap))) + (define-key map [backspace] 'doctest-electric-backspace) + (define-key map [return] 'doctest-newline-and-indent) + (define-key map [tab] 'doctest-indent-source-line) + (define-key map ":" 'doctest-electric-colon) + (define-key map "\C-c\C-v" 'doctest-version) + (define-key map "\C-c\C-c" 'doctest-execute) + (define-key map "\C-c\C-d" 'doctest-execute-with-diff) + (define-key map "\C-c\C-n" 'doctest-next-failure) + (define-key map "\C-c\C-p" 'doctest-prev-failure) + (define-key map "\C-c\C-a" 'doctest-first-failure) + (define-key map "\C-c\C-e" 'doctest-last-failure) + (define-key map "\C-c\C-z" 'doctest-last-failure) + (define-key map "\C-c\C-r" 'doctest-replace-output) + (define-key map "\C-c|" 'doctest-execute-region) + map) + "Keymap for doctest-mode.") + +;; Syntax table for doctest-mode. +(defvar doctest-mode-syntax-table nil + "Syntax table used in `doctest-mode' buffers.") +(when (not doctest-mode-syntax-table) + (setq doctest-mode-syntax-table (make-syntax-table)) + (dolist (entry '(("(" . "()") ("[" . "(]") ("{" . "(}") + (")" . ")(") ("]" . ")[") ("}" . "){") + ("$%&*+-/<=>|'\"`" . ".") ("_" . "w"))) + (dolist (char (string-to-list (car entry))) + (modify-syntax-entry char (cdr entry) doctest-mode-syntax-table)))) + +;; Use doctest mode for files ending in .doctest +;;;###autoload +(add-to-list 'auto-mode-alist '("\\.doctest$" . doctest-mode)) + +;;;###autoload +(defun doctest-mode () + "A major mode for editing text files that contain Python +doctest examples. Doctest is a testing framework for Python that +emulates an interactive session, and checks the result of each +command. For more information, see the Python library reference: + + +`doctest-mode' defines three kinds of line, each of which is +treated differently: + + - 'Source lines' are lines consisting of a Python prompt + ('>>>' or '...'), followed by source code. Source lines are + colored (similarly to `python-mode') and auto-indented. + + - 'Output lines' are non-blank lines immediately following + source lines. They are colored using several doctest- + specific output faces. + + - 'Text lines' are any other lines. They are not processed in + any special way. + +\\{doctest-mode-map}" + (interactive) + + ;; Declare local variables. + (kill-all-local-variables) + (make-local-variable 'font-lock-defaults) + (make-local-variable 'doctest-results-buffer) + (make-local-variable 'doctest-example-markers) + + ;; Define local variables. + (setq major-mode 'doctest-mode + mode-name "Doctest" + mode-line-process 'doctest-mode-line-process + font-lock-defaults '(doctest-font-lock-keywords + nil nil nil nil)) + + ;; Define keymap. + (use-local-map doctest-mode-map) + + ;; Define the syntax table. + (set-syntax-table doctest-mode-syntax-table) + + ;; Enable auto-fill mode. + (auto-fill-mode 1) + (setq auto-fill-function 'doctest-do-auto-fill) + + ;; Enable font-lock mode. + (if (featurep 'font-lock) (font-lock-mode 1)) + + ;; Run the mode hook. + (run-hooks 'doctest-mode-hook)) + +(provide 'doctest-mode) +;;; doctest-mode.el ends here diff --git a/elpa/python-mode-6.1.3/test/doctest-mode.elc b/elpa/python-mode-6.1.3/test/doctest-mode.elc new file mode 100644 index 0000000000000000000000000000000000000000..e7ba38a105ac9d4176dc238722d7f56a7ae3f8e6 GIT binary patch literal 56310 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, unless indicated otherwise + +;; Keywords: tools, lisp + +;; This file 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 2, or (at your option) +;; any later version. + +;; This file 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 GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; Prints commented output + +;; (global-set-key (kbd "") 'parse-partial-sexp-iac) +;; (global-set-key (kbd "") 'syntax-ppss-iac) + +(defun parse-partial-sexp-commentstop (&optional arg) + "Interactive form of parse-partial-sexp +output listed with documentation" + (interactive "P") + (save-excursion + (ppse-documented-base 'parse-partial-sexp (point) arg t))) + +(defun parse-partial-sexp-iac (&optional arg) + "Interactive form of parse-partial-sexp +output listed with documentation" + (interactive "P") + (save-excursion + (ppse-documented-base 'parse-partial-sexp (point) arg nil))) + +(defun syntax-ppss-iac (&optional arg) + "Syntax-ppss made interactive output listed with documentation" + (interactive "P") + (ppse-documented-base 'syntax-ppss (point) arg nil)) + +(defun ppse-documented-base (funktion end arg commentstop) + "Parse partial symbolic expression +list results below its documentation " + (let* ((start (point-min)) + (scan (condition-case nil + (scan-lists (point) 1 0) + (error nil))) + (rekord + (if + (or (eq this-command 'parse-partial-sexp-iac) + (eq this-command 'parse-partial-sexp-commentstop)) + (funcall funktion start end nil nil nil commentstop) + (funcall funktion end))) + (doku (documentation 'parse-partial-sexp)) + (doku-abr (list (substring doku (1+ (string-match ":" doku))))) + (count 0)) + (if arg + (what-cursor-position) + (message "%s LEND: %s" rekord scan)) + (with-output-to-temp-buffer (concat (format "%s" funktion) "-output") + (set-buffer standard-output) + (insert (car doku-abr)) + (goto-char (point-min)) + (re-search-forward "^ [0-9]+\." nil t 1) + (replace-match (concat (prin1-to-string count) "-")) + (replace-match "-") + (setq count (1+ count)) + (forward-line 1) + (split-line) + (dolist (elt rekord) + (insert (format "\t ====> %s <====" elt)) + (re-search-forward "^ [0-9]+\." nil t 1) + (replace-match (concat (prin1-to-string count) "-")) + (end-of-line) + (newline) + (setq count (1+ count))))) + (goto-char (point-min)) + (toggle-read-only -1) + (unless (featurep 'xemacs) + (set-window-text-height (selected-window) 4)) + (while (not (eobp)) + (if (looking-at "^[ \t]*$") + (delete-region (point) (progn (forward-line) (point))) + (forward-line)))) + +(defun scan-lists-iac () + " " + (interactive) + (message "%s" (scan-lists (defun-beginning-position) (point) 0))) + +(provide 'pars-part-output) +;;; pars-part-output.el ends here diff --git a/elpa/python-mode-6.1.3/test/pars-part-output.elc b/elpa/python-mode-6.1.3/test/pars-part-output.elc new file mode 100644 index 0000000000000000000000000000000000000000..64fa1bb36e01925cef7650ac434299d91e99fcf3 GIT binary patch literal 2998 zcmcguTW{Mo6n0;R#>M=w0onHAo+xP-x1+3^?cBPh$okNsSOc`c9^!PRCE5}qi<(Hq z^)O(6eIIG1PLK{oQEUQqBM;B@JD0;}FHXK`wOZ}N!$Ufe^D@gtLX#!UxlS{#eow@L z$Eg<8aZ$|%tS*YsHD7M6+*y?+Zc+0h7H%x(Bn$ctr(edJ`~i8RgTe4%;8EcDk>x+F zKs1E}>Zfup`nP2CT`}jea+AKuOWrS+I+X>R%S5oD>$_oJ3#I!duN1>WGg<4h)~?7c z`>dd6<~Uu7N@Y+ch}_T(?A{{NDe*ifS?X+_{mC^5l-stOuhUGe^s1Fmlq?HA&tghs ztaOzXGxY;@E2W7i3G90>$KQ8@{aZW|2_A*i6w5+$5Z8Lj_OMd0r>{<)Kc_h56_4Rk z^@A19i-eS`)v22iKr}iPQ04+$QcKIFb+K*ckuQup5ab!9C#y#&OktA34N~QiG)qK5+Bf# z^f?V^cYB9i8tmEvQS7iCx!o9#-TR05q)e^CI$KWf4LXZeRejVCR zil16@V*h5)&0u{jR@XSv4I_Ln8m_GX9#0MSOl&odF5 zR>-|vE-1s-6+A2)=_VdO1RtPqS{D}vh9r>824~k$3Z=xi0OAn$XdL<;AUgVPT;S7x z0&}CUTlOa~KjHn>y}RS7B@cWbr2dx=zraQ?c3Stw)2%MUxe#}>Wj4DmJ_opm9e3=! zHs@ZRbo*Esb-fPGd*MlI90neN8j`)>7xRns2!amV*fy)3pc__L0M{VGJ-9b^@EV?O z{b9CCe2?t$PPl1uYiI;-Mw<{D8e{xTm==27QFjk-eh9a;f#uoh zAID}#Ow1F6kQ;)ZaT0ij;c%zffX5=Q<89&PpIUC%HH*Ie>3FXNS*_WTM^4QVWnG<$(atGh%He1x{=U zHT;-K8$~{O=M?p5cUM%Eta`lINg6map;@Xfo3te8+$7c7Nr(Fv19z9i-o^kj>yNaO;?-f5PKY?cBhA{UrQl4g%0j3M#@ zqYpEVdUHk_=Z|(AsD2?~Pa-dB`(S)hq0-d_MkCZb)3#AcS&~)YCaWcF`%ktHWS*EM zYND{#r&%x)A;ZWet|)5gXF-O(lV%h60wZ8H&0<@S8}DCjt=Vk{5C)zA41f;DH?bv= zYhq~n2Dc0&SvVy0fSie#Wkq2e`yRH)qG6*;uot2co37St@0OLk%#et72D(1)_S*jddCr&h literal 0 HcmV?d00001 diff --git a/elpa/python-mode-6.1.3/test/py-bug-numbered-tests.el b/elpa/python-mode-6.1.3/test/py-bug-numbered-tests.el new file mode 100644 index 000000000..4e976ff99 --- /dev/null +++ b/elpa/python-mode-6.1.3/test/py-bug-numbered-tests.el @@ -0,0 +1,6228 @@ +;;; py-bug-numbered-tests.el --- run single tests according to bug number + +;; Author: Andreas Roehler +;; Keywords: languages +;; 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 . +;;; Commentary: +;; +;;; Code: + +(defvar py-test-shebang-list (list "#! /usr/bin/env python" "#! /usr/bin/env ipython" "#! /usr/bin/python" "#! /usr/bin/ipython") + "Values to test as `py-test-shebang', resp. `py-shell-name'. ") + +(setq py-test-shebang-list (list "#! /usr/bin/env python" "#! /usr/bin/ipython")) + +(defvar py-test-shebang "#! /usr/bin/env python" + "Default value used for tests. ") + +(defvar py-ipython-test-shebang "#! /usr/bin/env ipython" + "Default value used for testing IPython. ") + +(defvar bug-numbered-tests nil + "Tests following reports at https://bugs.launchpad.net/python-mode") + +(defun py-run-bug-numbered-tests (&optional arg) + "With ARG greater 1 keep test buffers open. " + (interactive "p") + (dolist (ele bug-numbered-tests) + (funcall ele arg))) + +(setq bug-numbered-tests + (list + 'py-execute-buffer-ipython-lp-1252643-test + 'py-empty-line-closes-p-lp-1235324-test + 'C-c-C-c-lp:1221310-and-store-result-test + 'Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-test + 'Bogus-dedent-when-typing-colon-in-dictionary-literal-lp-1197171-test + 'python-mode-very-slow-lp-1107037-test + 'cascading-indent-lp-1101962-test + 'line-after-colon-with-inline-comment-lp-1109946-test + 'more-docstring-filling-woes-lp-1102296-pep-257-nn-test + 'more-docstring-filling-woes-lp-1102296-pep-257-test + 'more-docstring-filling-woes-lp-1102296-nil-test + 'more-docstring-filling-woes-lp-1102296-onetwo-test + 'more-docstring-filling-woes-lp-1102296-django-test + 'more-docstring-filling-woes-lp-1102296-symmetric-test + 'module-docstring-when-following-comment-lp-1102011-test + 'py-newline-and-indent-leaves-eol-whitespace-lp-1100892-test + 'py-underscore-word-syntax-p-customization-has-no-effect-lp-1100947-test + 'py-up-test-python-el-111-test + 'py-down-python-el-112-test + 'enter-key-does-not-indent-properly-after-return-statement-lp-1098793-test + 'filename-completion-fails-in-ipython-lp-1027265-n1-test + 'filename-completion-fails-in-ipython-lp-1027265-n2-test + 'comments-start-a-new-line-lp-1092847-n1-test + 'comments-start-a-new-line-lp-1092847-n2-test + 'temporary-files-remain-when-python-raises-exception-lp-1083973-n1-test + 'temporary-files-remain-when-python-raises-exception-lp-1083973-n2-test + 'temporary-files-remain-when-python-raises-exception-lp-1083973-n3-test + 'temporary-files-remain-when-python-raises-exception-lp-1083973-n4-test + 'wrong-indentation-after-return-or-pass-keyword-lp-1087499-test + 'wrong-indent-after-asignment-lp-1087404-test + 'py-execute-buffer-python3-looks-broken-lp-1085386-test + 'fill-paragraph-in-comments-results-in-mess-lp-1084769-test + 'imenu-add-menubar-index-fails-lp-1084503-test + 'spuriously-indents-whole-line-while-making-some-portion-inline-comment-lp-1080973-test + 'fill-paragraph-in-a-comment-does-not-stop-at-empty-comment-lines-lp-1077139-test + 'incorrect-indentation-of-comments-in-a-multiline-list-lp-1077063-test + 'fails-to-indent-abs-wrong-type-argument-lp-1075673-test + 'incorrect-indentation-of-one-line-functions-lp-1067633-test + 'several-new-bugs-with-paragraph-filling-lp-1066489-test + 'impossible-to-execute-a-buffer-with-from-future-imports-lp-1063884-test + 'exception-in-except-clause-highlighted-as-keyword-lp-909205-test + 'pyindex-mishandles-class-definitions-lp-1018164-test + 'stalls-emacs-probably-due-to-syntax-highlighting-lp-1058261-test + 'py-find-imports-lp-1023236-test + 'pycomplete-imports-not-found-error-when-no-symbol-lp:1019791-test + 'return-statement-indented-incorrectly-lp-1019601-test + 'converts-tabs-to-spaces-in-indent-tabs-mode-t-lp-1019128-test + 'empty-triple-quote-lp:1009318-test + 'spurious-trailing-whitespace-lp-1008679-test + 'completion-fails-in-python-script-r989-lp:1004613-test + 'no-completion-at-all-lp:1001328-test + 'py-narrow-to-defun-lp-1020531-test + 'not-that-useful-completion-lp:1003580-test + 'pycomplete-same-folder-class-lp:889052-test + 'pycomplete-same-folder-def-lp:889052-test + 'indent-region-lp:997958-test + 'py-describe-symbol-fails-on-modules-lp:919719-test + 'mark-block-region-lp:328806-test + 'mark-decorators-lp:328851-test + 'nested-dictionaries-indent-lp:328791-test + 'tqs-lp:302834-lp:1018994-test + 'fore-00007F-breaks-indentation-lp:328788-test + 'dq-in-tqs-string-lp:328813-test + 'flexible-indentation-lp:328842-test + 'py-current-defun-lp:328846-test + 'cls-pseudo-keyword-lp:328849-test + 'hungry-delete-backwards-lp:328853-test + 'hungry-delete-forward-lp:328853-test + 'beg-end-of-defun-lp:303622-test + 'bullet-lists-in-comments-lp:328782-test + 'imenu-newline-arglist-lp:328783-test + 'imenu-matches-in-docstring-lp:436285-test + 'exceptions-not-highlighted-lp:473525-test + 'fill-paragraph-problems-lp:710373-test + 'nested-indents-lp:328775-test + 'previous-statement-lp:637955-test + 'inbound-indentation-multiline-assignment-lp:629916-test + 'indentation-of-continuation-lines-lp:691185-test + ;; test passes only when run from edebug + ;; assistance appreciated + ;; 'syntaxerror-on-py-execute-region-lp:691542-test + 'goto-beginning-of-tqs-lp:735328-test + 'class-treated-as-keyword-lp:709478-test + 'py-decorators-face-lp:744335-test + 'indent-after-return-lp:745208-test + 'keep-assignments-column-lp:748198-test + 'indent-triplequoted-to-itself-lp:752252-test + 'multiline-listings-indent-lp:761946-test + 'new-page-char-causes-loop-lp:762498-test + 'nested-dicts-indent-lp:763756-test + 'bad-indent-after-except-lp:771289-test + 'indent-open-paren-not-last-lp:771291-test + 'wrong-indent-after-else-lp:772610-test + 'except-indents-wrong-lp:784432-test + 'indent-explicitly-set-in-multiline-tqs-lp:784225-test + 'unbalanced-parentheses-lp:784645-test + 'explicitly-indent-in-list-lp:785018-test + 'explicit-backslashed-continuation-line-indent-lp:785091-test + 'indentation-error-lp:795773-test + 'indent-function-arglist-lp:800088-test + 'python-mode-hangs-lp:801780-test + 'stops-backslashed-line-lp:802504-test + 'stops-backslashed-line-lp:802504-test2 + 'python-mode-slow-lp:803275-test + 'master-file-not-honored-lp:794850-test + 'py-variable-name-face-lp:798538-test + 'colon-causes-error-lp:818665-test + 'if-indentation-lp:818720-test + 'closing-parenthesis-indent-lp:821820-test + 'py-indent-line-lp:822532-test + 'indent-honor-arglist-whitespaces-lp:822540-test + 'comments-indent-honor-setting-lp:824427-test + 'infinite-loop-after-tqs-lp:826044-test + 'closing-list-lp:826144-test + 'py-electric-comment-add-space-lp:828398-test + 'py-electric-comment-add-space-t-lp:828398-test + 'execute-indented-code-lp:828314-test + 'py-hungry-delete-backwards-needs-cc-lp:850595-test + 'wrong-guess-for-py-indent-offset-lp:852052-test + 'indent-match-import-pkg-lp:852500-test + 'py-shift-line-when-no-region-lp:855565-test + 'indentation-of-from-import-continuation-lines-lp:858041-test + 'indentation-after-one-line-suites-lp:858044-test + 'py-compute-indentation-wrong-at-eol-lp:858043-test + 'comment-indentation-level-lp:869854-test + 'indentation-wrong-after-multi-line-parameter-list-lp:871698-test + 'no-indent-after-continue-lp:872676-test + 'indent-after-inline-comment-lp:873372-test + 'else-clause-indentation-lp:874470-test + 'py-complete-lp:858621-test + 'incorrect-use-of-region-in-py-shift-left-lp:875951-test + 'indent-after-multiple-except-statements-lp:883815-test + 'wrongly-highlighted-as-keywords-lp:885144-test + 'glitch-when-indenting-lists-lp:886473-test + 'indentation-keyword-lp:885143-test + 'indentation-bug-inside-docstrings-lp:899455-test + 'another-indentation-bug-inside-docstrings-lp:900684-test + 'py-shebang-consider-ipython-lp:849293-test + 'py-shebang-ipython-env-lp:849293-test + 'indent-offset-not-guessed-when-loading-lp:902890-test + 'from-__future__-import-absolute_import-mishighlighted-lp:907084-test + ;; 'automatic-indentation-is-broken-lp:889643-test + 'chars-uU-preceding-triple-quoted-get-string-face-lp:909517-test + 'problem-with-py-separator-char-under-windows-lp:975539-test + 'tuple-unpacking-highlighted-incorrectly-lp:961496-test + 'new-problem-with-py-temp-directory-lp:965762-test + + 'wrong-type-argument-lp:901541-test + 'py-pychecker-run-missing-lp:910783-test + 'py-forward-into-nomenclature-lp:916818-test + 'py-forward-into-nomenclature-jumps-over-CamelCased-words-lp:919540-test + 'py-backward-into-nomenclature-caps-names-lp:919541-test + 'execute-buffer-ipython-fails-lp:928087-test + 'py-indent-comments-nil-ignored-lp:958721-test + 'broken-font-locking-lp:961231-test + 'regression-in-py-execute-region-lp:962227-test + + 'py-shell-invoking-python-lp:835151-test + 'py-shell-invoking-ipython-lp:835151-test + 'py-shell-invoking-python3-lp:835151-test + 'py-shell-invoking-python2-lp:835151-test + 'py-shell-invoking-python2.7-lp:835151-test + 'py-shell-invoking-jython-lp:835151-test + + 'py-mark-block-clause-misbehave-lp:949310-test + 'py-mark-clause-misbehave-lp:949310-test + 'py-mark-block-misbehave-lp:949310-test + + 'script-buffer-appears-instead-of-python-shell-buffer-lp:957561-test + 'UnicodeEncodeError-lp:550661-test + 'py-shell-complete-lp:328836-test)) + +(defmacro py-bug-tests-intern (testname &optional dedicated teststring use-find-file) + "`use-find-file' is used to make sure that the new buffer is +created local to the project that autocomplete is being tested +on." + `(let ((debug-on-error t) + (enable-local-variables :all) + py-load-pymacs-p + py-split-windows-on-execute-p + py-shell-switch-buffers-on-execute-p + py-start-run-py-shell + proc + py-fontify-shell-buffer-p + ) + (if ,use-find-file + (find-file (concat (py-normalize-directory py-temp-directory) + (replace-regexp-in-string "\\\\" "" (replace-regexp-in-string "-base$" "-test" (prin1-to-string ,testname))))) + (set-buffer (get-buffer-create (replace-regexp-in-string "\\\\" "" (replace-regexp-in-string "-base$" "-test" (prin1-to-string ,testname)))))) + ;; (with-temp-buffer + (switch-to-buffer (current-buffer)) + (delete-other-windows) + (erase-buffer) + (fundamental-mode) + (insert ,teststring) + (local-unset-key (kbd "RET")) + (python-mode) + (when (and (boundp 'company-mode) company-mode) (company-abort)) + (funcall ,testname) + (message "%s" (replace-regexp-in-string "\\\\" "" (concat (replace-regexp-in-string "-base$" "-test" (prin1-to-string ,testname)) " passed"))) + (unless (< 1 arg) + (set-buffer-modified-p 'nil) + (and (get-buffer-process (current-buffer)) + (set-process-query-on-exit-flag (get-buffer-process (current-buffer)) nil) + (kill-process (get-buffer-process (current-buffer)))) + (kill-buffer (current-buffer))))) + +;; py-if-name-main-permission-p +(defun py-if-name-main-permission-lp-326620-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def py_if_name_main_permission_test(): + if __name__ == \"__main__\" : + print(\"__name__ == '__main__' run\") + return True + + else: + print(\"__name__ == '__main__' supressed\") + return False + +py_if_name_main_permission_test() +")) + (py-bug-tests-intern 'py-if-name-main-permission-lp-326620-base arg teststring))) + +(defun py-if-name-main-permission-lp-326620-base () + (save-excursion + (let ((py-if-name-main-permission-p t) + (py-shell-name (py-choose-shell))) + (py-execute-buffer) + (set-buffer "*Python*") + ;; (switch-to-buffer (current-buffer)) + (goto-char (point-max)) + (forward-line -1) + (end-of-line) + (sit-for 0.2) + (assert (looking-back "run") nil "py-if-name-main-permission-lp-326620-test #1 failed"))) + (switch-to-buffer (current-buffer)) + (let (py-if-name-main-permission-p) + (py-execute-buffer) + (set-buffer "*Python*") + ;; (switch-to-buffer (current-buffer)) + (goto-char (point-max)) + (forward-line -1) + (end-of-line) + (sit-for 0.2) + (assert (looking-back "supressed") nil "py-if-name-main-permission-lp-326620-test #2 failed"))) + +(defun sexp-commands-lp:328778-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked. + +Reported by Montanaro on 2003-08-05 +\[ ... ] + You can kill balanced expressions on a + particular line but it's not possible to remove the + whole of an 'if' or 'while' block." + (interactive "p") + (let ((teststring "# Examples from http://diveintopython.org/ + +def main(argv): + grammar = \"kant.xml\" + try: + opts, args = getopt.getopt(argv, \"hg:d\", [\"help\", \"grammar=\"]) + except getopt.GetoptError: + usage() + sys.exit(2) + for opt, arg in opts: + if opt in (\"-h\", \"--help\"): + usage() + sys.exit() + elif opt == '-d': + global _debug + _debug = 1 + elif opt in (\"-g\", \"--grammar\"): + grammar = arg +")) + (py-bug-tests-intern 'sexp-commands-lp:328778 arg teststring))) + +(defun sexp-commands-lp:328778 () + (let ((size (buffer-size))) + (goto-char (point-min)) + (forward-line 15) + (py-kill-clause) + (assert (< (buffer-size) size) nil "sexp-commands-lp:328778-test failed") + (assert (eq (buffer-size) 526) nil "sexp-commands-lp:328778-test failed") + (kill-line 1) + (indent-according-to-mode) + (forward-line -4) + (py-kill-block) + (assert (eq (buffer-size) 324) nil "sexp-commands-lp:328778-test failed") + )) + +(defun nested-dictionaries-indent-lp:328791-test (&optional arg) + "With ARG greater 1 keep test buffer open. + +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked. " + (interactive "p") + (let ((teststring " + +# hanging +asdf = { + 'a':{ + 'b':3, + 'c':4 + } + } + +# closing +asdf = { + 'a':{ + 'b':3, + 'c':4 + } +} + +data = { + 'key': + { + 'objlist': [ + { + 'pk': 1, + 'name': 'first', + }, + { + 'pk': 2, + 'name': 'second', + } + ] + } +} + +")) + (py-bug-tests-intern 'nested-dictionaries-indent-lp:328791 arg teststring))) + +(defun nested-dictionaries-indent-lp:328791 () + (let ((py-indent-honors-multiline-listing t) + py-closing-list-dedents-bos) + (goto-char (point-min)) + (search-forward "'a':{") + (assert (eq 4 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #1 failed") + (search-forward "}") + (assert (eq 8 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #2 failed") + (search-forward "}") + (assert (eq 4 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #3 failed") + + ;; py-closing-list-dedents-bos + (setq py-closing-list-dedents-bos t) + (search-forward "'a':{") + (assert (eq 4 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #1 failed") + (search-forward "}") + (assert (eq 4 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #1 failed") + (search-forward "}") + (assert (eq 0 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #2 failed") + (search-forward "}" nil nil 2) + (assert (eq 12 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #2 failed") + (search-forward "]") + (assert (eq 8 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #2 failed") + (search-forward "}") + (assert (eq 4 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #2 failed") + (search-forward "}") + (assert (eq 0 (py-compute-indentation)) nil "nested-dictionaries-indent-lp:328791-test #2 failed"))) + +(defun mark-block-region-lp:328806-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "def f(): + \"\"\" + class blah blah + \"\"\" + if a: + ar_atpt_python_list_roh = ([ + 'python-expression', + + # def ar_thingatpt_write_lists (&optional datei): + 'python-partial-expression', + 'python-statement', + ]) +")) + (py-bug-tests-intern 'mark-block-region-lp:328806-base arg teststring))) + +(defun mark-block-region-lp:328806-base () + (forward-line -2) + (py-mark-block) + (assert (< (region-beginning) (region-end)) nil "mark-block-region-lp:328806-test failed!")) + +(defun flexible-indentation-lp:328842-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " +\(long, sequence, of_items, + that, needs, to_be, wrapped) = input_list + +packed_entry = (long, sequence, of_items, +that, needs, to_be, wrapped) + +\( whitespaced, long, sequence, of_items, + that, needs, to_be, wrapped) = input_list +")) + (py-bug-tests-intern 'flexible-indentation-lp:328842-base arg teststring))) + +(defun flexible-indentation-lp:328842-base () + (let ((py-indent-honors-multiline-listing t)) + (goto-char 33) + (assert (eq 1 (py-compute-indentation)) nil "flexible-indentation-lp:328842-test failed") + (goto-char 115) + (assert (eq 16 (py-compute-indentation)) nil "flexible-indentation-lp:328842-test failed") + (goto-char 202) + (assert (eq 2 (py-compute-indentation)) nil "flexible-indentation-lp:328842-test failed"))) + +(defun py-current-defun-lp:328846-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-current-defun-lp:328846-base arg teststring))) + +(defun py-current-defun-lp:328846-base () + (goto-char 331) + (assert (string= "f" (py-current-defun)) nil "py-current-defun-lp:328846-test failed")) + +(defun cls-pseudo-keyword-lp:328849-test (&optional arg) + (interactive "p") + (let ((teststring "class Foo(object): + def summat(cls, x): + ..... + summat = classmethod(summat) +")) + (py-bug-tests-intern 'cls-pseudo-keyword-lp:328849-base arg teststring))) + +(defun cls-pseudo-keyword-lp:328849-base () + (let ((font-lock-verbose nil)) + (font-lock-mode 1) + (font-lock-fontify-buffer) + (goto-char 36) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-pseudo-keyword-face) nil "cls-pseudo-keyword-lp:328849-test failed "))) + +(defun mark-decorators-lp:328851-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "@foo.bar +def baz(): + pass +")) + (py-bug-tests-intern 'mark-decorators-lp:328851-base arg teststring))) + +(defun mark-decorators-lp:328851-base () + (goto-char 10) + (py-mark-def t) + (assert (eq 28 (- (region-end)(region-beginning))) nil "mark-decorators-lp:328851-test failed")) + +(defun beg-end-of-defun-lp:303622-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " +class f(): + \"\"\" + class blah blah + \"\"\" + if a: + ar_atpt_python_list_roh = ([ + 'python-expression', + + # def ar_thingatpt_write_lists (&optional datei): + 'python-partial-expression', + 'python-statement', + ]) +")) + (py-bug-tests-intern 'beg-end-of-defun-lp:303622 arg teststring))) + +(defun beg-end-of-defun-lp:303622 () + (goto-char 13) + (py-end-of-def-or-class) + (sit-for 0.1) + (assert (eq 275 (point)) nil "beg-end-of-defun-lp:303622-test #1 failed!") + (beginning-of-defun) + (sit-for 0.1) + (assert (eq 2 (point)) nil "beg-end-of-defun-lp:303622-test #2 failed!")) + +(defun dq-in-tqs-string-lp:328813-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " +# Bug #328813 (sf1775975) +print(\"\"\" \"Hi!\" I'm a doc string\"\"\") +print(''' 'Hi!' I'm a doc string''') +print(\"\"\" ''' \"Hi!\" I'm a doc string ''' \"\"\") +print(''' \"\"\" \"Hi!\" I'm a doc string \"\"\" ''') +")) + (py-bug-tests-intern 'dq-in-tqs-string-lp:328813 arg teststring))) + +(defun dq-in-tqs-string-lp:328813 () + (let ((font-lock-verbose nil)) + (font-lock-mode 1) + (font-lock-fontify-buffer) + (goto-char 78) + (let ((erg (get-char-property (point) 'face))) + (insert "\"") + (font-lock-fontify-buffer) + (assert (eq erg (get-char-property (point) 'face)) nil "dq-in-tqs-string-lp:328813-test failed ") + (goto-char 122)))) + +(defun imenu-matches-in-docstring-lp:436285-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " +class foo(): + \"\"\" + class hello(object): + def __init__(self): + ... + \"\"\" + pass +")) + (py-bug-tests-intern 'imenu-matches-in-docstring-lp:436285-base arg teststring))) + +(defun imenu-matches-in-docstring-lp:436285-base () + (goto-char 40) + (assert (eq (py-beginning-of-def-or-class) 2) nil "imenu-matches-in-docstring-lp:436285-test failed")) + +(defun fill-paragraph-problems-lp:710373-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " + \"\"\" + triple-quoted string containing \"quotation\" marks. + triple-quoted string containing \"quotation\" marks. + triple-quoted string containing \"quotation\" marks. + triple-quoted string containing \"quotation\" marks. + triple-quoted string containing \"quotation\" marks. + \"\"\" +")) + (fill-paragraph-problems-lp:710373-test-intern arg teststring))) + +(defun fill-paragraph-problems-lp:710373-test-intern (arg teststring) + (let ((tmp-dir "/tmp/") + (fpp-exec-buffer "fill-paragraph-problems-lp:710373") + (diff-buffer "fpp-lp:710373-old")) + (set-buffer (get-buffer-create diff-buffer)) + (erase-buffer) + (fundamental-mode) + (insert teststring) + (write-file (concat tmp-dir diff-buffer)) + (if arg + (progn + (set-buffer (get-buffer-create fpp-exec-buffer)) + (switch-to-buffer (current-buffer)) + (erase-buffer) + (insert teststring) + (fundamental-mode) + (fill-paragraph-problems-lp:710373-test-base arg tmp-dir fpp-exec-buffer diff-buffer)) + (with-temp-buffer + (insert teststring) + (fill-paragraph-problems-lp:710373-test-base arg tmp-dir fpp-exec-buffer diff-buffer))))) + +(defun fill-paragraph-problems-lp:710373-test-base (arg tmp-dir fpp-exec-buffer diff-buffer) + (goto-char 48) + (py-fill-paragraph) + (write-file (concat tmp-dir fpp-exec-buffer)) + (diff (concat tmp-dir fpp-exec-buffer) (concat tmp-dir diff-buffer) "-u") + (if (featurep 'xemacs) + (progn + (set-buffer "*Diff Output*") + (switch-to-buffer (current-buffer))) + (set-buffer "*Diff*") + (sit-for 1) + (assert (numberp (progn (goto-char (point-min))(search-forward "no differences" nil t 1))) t) + (message "%s" "fill-paragraph-problems-lp:710373 passed")) + (set-buffer "fill-paragraph-problems-lp:710373") + (unless (< 1 arg) + (set-buffer-modified-p 'nil) + (kill-buffer (current-buffer)))) + +(defun tqs-lp:302834-lp:1018994-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + + \"\"\" + + '''I'asdfa''' +")) + + (py-bug-tests-intern 'triple-quoted-string-dq-lp:302834 arg teststring))) + +(defun triple-quoted-string-dq-lp:302834 () + (let ((font-lock-verbose nil)) + (font-lock-mode 1) + (font-lock-fontify-buffer) + (goto-char 78) + (let ((erg (get-char-property (point) 'face))) + (insert "\"") + (font-lock-fontify-buffer) + (sit-for 0.2) + (assert (eq erg (get-char-property (point) 'face)) "tqs-lp:302834-lp:1018994-test #1 failed.") + (goto-char 153) + (assert (eq erg (get-char-property (point) 'face)) "tqs-lp:302834-lp:1018994-test #2 failed.") + ))) + +(defun inbound-indentation-multiline-assignment-lp:629916-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "foo_long_long_long_long = ( + bar_long_long_long_long[ + (x_long_long_long_long == X) & + (y_long_long_long_long == Y)]) +")) + (py-bug-tests-intern 'inbound-indentation-multiline-assignment-lp:629916 arg teststring))) + +(defun inbound-indentation-multiline-assignment-lp:629916 () + (let ((py-indent-honors-multiline-listing t)) + (goto-char 33) + (assert (eq 4 (py-compute-indentation)) nil "inbound-indentation-multiline-assignment-lp:629916-test #1 failed") + (goto-char 62) + (assert (eq 8 (current-indentation)) nil "inbound-indentation-multiline-assignment-lp:629916-test #2 failed"))) + +(defun previous-statement-lp:637955-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\"")) + (py-bug-tests-intern 'previous-statement-lp:637955 arg teststring))) + +(defun previous-statement-lp:637955 () + (beginning-of-line) + (py-previous-statement) + (sit-for 0.1) + (assert (eq 31 (point)) nil "previous-statement-lp:637955-test failed.")) + +(defun nested-indents-lp:328775-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " +if x > 0: + for i in range(100): + print(i) + else: + print(\"All done\") +elif x < 0: + print(\"x is negative\") +")) + (py-bug-tests-intern 'nested-indents-lp:328775 arg teststring))) + +(defun nested-indents-lp:328775 () + (assert (eq 4 (py-compute-indentation)) nil "nested-indents-lp:328775-test #1 failed!") + (goto-char 41) + (assert (eq 8 (py-compute-indentation)) nil "nested-indents-lp:328775-test #2 failed!") + (goto-char 54) + (assert (eq 4 (py-compute-indentation)) nil "nested-indents-lp:328775-test #3 failed!")) + +(defun bullet-lists-in-comments-lp:328782-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring)) + (bullet-lists-in-comments-lp:328782-test-intern arg teststring))) + +(defun bullet-lists-in-comments-lp:328782-test-intern (&optional arg teststring) + (let ((font-lock-verbose nil)) + (set-buffer (get-buffer-create "bullet-lists-in-comments-lp:328782-test")) + (erase-buffer) + (insert " +## * If the filename is a directory and not a Maildir nor +## an MH Mailbox, it will be processed as a Mailbox --this bug named here: bullet-lists-in-comments-lp:328782.htm-- +## directory consisting of just .txt and .lorien files. +") + (when arg (switch-to-buffer (current-buffer))) + (python-mode) + (font-lock-mode 1) + (font-lock-fontify-buffer) + (goto-char 100) + (py-fill-paragraph) + (set-buffer "bullet-lists-in-comments-lp:328782-test") + (unless (< 1 arg) + (set-buffer-modified-p 'nil) + (kill-buffer (current-buffer))))) + +(defun imenu-newline-arglist-lp:328783-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "def editor(db, db_name, table_name, + #api + dbapi,dbapi_exceptions): + pass")) + (py-bug-tests-intern 'imenu-newline-arglist-lp:328783-base arg teststring))) + +(defun imenu-newline-arglist-lp:328783-base () + (goto-char 60) + (py-beginning-of-def-or-class) + (assert (eq (point) 1) nil "imenu-newline-arglist-lp:328783-test failed")) + +(defun hungry-delete-backwards-lp:328853-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'hungry-delete-backwards-lp:328853 arg teststring))) + +(defun hungry-delete-backwards-lp:328853 () + (goto-char 421) + (py-hungry-delete-backwards) + (assert (eq 409 (point)) nil "hungry-delete-backwards-lp:328853-test failed")) + +(defun hungry-delete-forward-lp:328853-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'hungry-delete-forward-lp:328853 arg teststring))) + +(defun hungry-delete-forward-lp:328853 () + (goto-char 409) + (py-hungry-delete-forward) + (assert (looking-at "#") nil "hungry-delete-backwards test failed")) + +(defun UnicodeEncodeError-lp:550661-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -\*- coding: utf-8 -\*- +print(u'\\xA9') +"))) + (py-bug-tests-intern 'UnicodeEncodeError-lp:550661-base 2 teststring))) + +(defun UnicodeEncodeError-lp:550661-base () + (goto-char 48) + (push-mark) + (end-of-line) + (py-execute-region-switch (line-beginning-position) (point)) + (sit-for 0.2) + (unless (looking-at "©") + (when (looking-back comint-prompt-regexp) + (goto-char (1- (match-beginning 0)))) + (sit-for 0.1)) + (assert (or (looking-back "©")(looking-at "©")) nil "UnicodeEncodeError-lp:550661-test failed")) + +(defun indentation-of-continuation-lines-lp:691185-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " def f(val): + # current behavior - indent to just after the first space + a_verry_loonng_variable_nammmee = \\ + val +")) + (py-bug-tests-intern 'indentation-of-continuation-lines-lp:691185 arg teststring))) + +(defun indentation-of-continuation-lines-lp:691185 () + (let ((py-continuation-offset 2)) + (goto-char 127) + (delete-horizontal-space) + (indent-to (py-compute-indentation)) + (assert (eq 10 (current-indentation)) nil "indentation-of-continuation-lines-lp:691185-test failed!"))) + +(defun goto-beginning-of-tqs-lp:735328-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "class Foo(object): +\"\"\" +This docstring isn't indented, test should pass anyway. +\"\"\" + +")) + (py-bug-tests-intern 'goto-beginning-of-tqs-lp:735328 arg teststring))) + +(defun goto-beginning-of-tqs-lp:735328 () + (goto-char 84) + (assert (eq 4 (py-compute-indentation)) nil "goto-beginning-of-tqs-lp:735328-test failed") + ) + +(defun class-treated-as-keyword-lp:709478-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "foo = [ + T.div( + T.tabl(*trows), + + CLASS='blok',) +] +")) + (py-bug-tests-intern 'class-treated-as-keyword-lp:709478 arg teststring))) + +(defun class-treated-as-keyword-lp:709478 () + (let ((font-lock-verbose nil)) + (font-lock-fontify-buffer) + (goto-char 63) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'font-lock-string-face) nil "class-treated-as-keyword-lp:709478d 1th test failed") + (goto-char 57) + ;; (assert (if (get-char-property (point) 'face)(eq (get-char-property (point) 'face) 'py-variable-name-face)t) nil "class-treated-as-keyword-lp:709478-test 2th failed"))) + (assert (eq (get-char-property (point) 'face) 'py-variable-name-face) nil "class-treated-as-keyword-lp:709478-test 2th failed"))) + +(defun fore-00007F-breaks-indentation-lp:328788-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "class a: + def __init__(self): + self.StyleSetSpec(self.STYLE_FIELD, \"fore:#00007F\" ) + self.StyleSetSpec(self.STYLE_FIELD, \"fore:#00007F\" ) +")) + (py-bug-tests-intern 'fore-00007F-breaks-indentation-lp:328788 arg teststring))) + +(defun fore-00007F-breaks-indentation-lp:328788 () + (switch-to-buffer (current-buffer)) + (goto-char 34) + (sit-for 0.1) + ;; (debug-on-entry 'py-compute-indentation) + (assert (eq 8 (py-compute-indentation)) nil "fore-00007F-breaks-indentation-lp:328788-test #1 failed") + (goto-char 121) + (assert (eq 8 (py-compute-indentation)) nil "fore-00007F-breaks-indentation-lp:328788-test #2 failed")) + +(defun exceptions-not-highlighted-lp:473525-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "excs = (SystemExit, Exception, KeyboardInterrupt)")) + (py-bug-tests-intern 'exceptions-not-highlighted-lp:473525 arg teststring))) + +(defun exceptions-not-highlighted-lp:473525 () + (let ((font-lock-verbose nil)) + (goto-char 39) + (font-lock-fontify-buffer) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-exception-name-face) nil "exceptions-not-highlighted-lp:473525-test failed"))) + +(defun syntaxerror-on-py-execute-region-lp:691542-test (&optional arg) + (interactive "p") + (let ((teststring "# -*- coding: utf-8 -*- +print(\"Poet Friedrich Hölderlin\"")) + (py-bug-tests-intern 'syntaxerror-on-py-execute-region-lp:691542-base arg teststring))) + +(defun syntaxerror-on-py-execute-region-lp:691542-base () + (let ((oldbuf (current-buffer)) + erg kill-buffer-query-functions py-switch-to-python) + (when (buffer-live-p (get-buffer (concat "*" py-which-bufname "*"))) + (when + (processp (get-process py-which-bufname)) + + (set-process-query-on-exit-flag (get-process py-which-bufname) nil)) + (kill-buffer (concat "*" py-which-bufname "*"))) + (py-execute-region (line-beginning-position) (line-end-position)) + (when (interactive-p) (switch-to-buffer (current-buffer))) + (set-buffer (get-buffer (concat "*" py-which-bufname "*"))) + (assert (or (search-forward "Hölderlin" nil t 1) + (search-backward "Hölderlin" nil t 1)) nil "syntaxerror-on-py-execute-region-lp:691542-test failed"))) + +(defun backslashed-continuation-line-indent-lp:742993-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring " +# py-continuation-offset: 2 +self.last_abc_attr = \\ +self.last_xyz_attr = \\ +self.last_abc_other = \\ +self.last_xyz_other = None + +# py-continuation-offset: 4 +self.last_abc_attr = \\ +self.last_xyz_attr = \\ +self.last_abc_other = \\ +self.last_xyz_other = None + +# py-continuation-offset: 6 +self.last_abc_attr = \\ +self.last_xyz_attr = \\ +self.last_abc_other = \\ +self.last_xyz_other = None +")) + (py-bug-tests-intern 'backslashed-continuation-line-indent-lp:742993 arg teststring))) + +(defun backslashed-continuation-line-indent-lp:742993 () + (let ((py-continuation-offset 2)) + (goto-char 54) + (assert (eq 2 (py-compute-indentation)) nil "backslashed-continuation-line-indent-lp:742993-test #1a failed") + (assert (eq (py-compute-indentation) py-continuation-offset) nil "backslashed-continuation-line-indent-lp:742993-test #1b failed") + + (setq py-continuation-offset 4) + (goto-char 180) + (assert (eq 4 (py-compute-indentation)) nil "backslashed-continuation-line-indent-lp:742993-test #2a failed") + (assert (eq (py-compute-indentation) py-continuation-offset) nil "backslashed-continuation-line-indent-lp:742993-test #2b failed") + + (setq py-continuation-offset 6) + (goto-char 306) + (assert (eq 6 (py-compute-indentation)) nil "backslashed-continuation-line-indent-lp:742993-test #3a failed") + (assert (eq (py-compute-indentation) py-continuation-offset) nil "backslashed-continuation-line-indent-lp:742993-test #3b failed") + )) + +(defun py-decorators-face-lp:744335-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "@foo.bar +def baz(): + pass +")) + (py-bug-tests-intern 'py-decorators-face-lp:744335 arg teststring))) + +(defun py-decorators-face-lp:744335 () + (let ((font-lock-verbose nil)) + (goto-char 7) + (font-lock-fontify-buffer) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-decorators-face) nil "py-decorators-face-lp:744335-test failed"))) + +(defun indent-after-return-lp:745208-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "class FOO\(): + if len(sys.argv)==1: + usage\() + sys.exit\() + + def build_extension\(self, ext): + + if ext.name == '_ctypes': + if not self.configure_ctypes\(ext): + return + + try: + build_ext.build_extension\(self, ext) + except \(CCompilerError, DistutilsError) as why: + self.announce\('WARNING: building of extension \"%s\" +failed: %s' % + \(ext.name, sys.exc_info()\[1])) + self.failed.append(ext.name) + return + # Workaround for Mac OS X: The Carbon-based modules cannot be + # reliably imported into a command-line Python + if 'Carbon' in ext.extra_link_args: + self.announce\( + 'WARNING: skipping import check for Carbon-based +\"%s\"' % + ext.name) + return +")) + (py-bug-tests-intern 'indent-after-return-lp:745208 arg teststring))) + +(defun indent-after-return-lp:745208 () + (assert (eq 8 (py-compute-indentation)) nil "indent-after-return-lp:745208-test failed")) + +(defun keep-assignments-column-lp:748198-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "bar = foo(a=1, + b=2, + c=3) +")) + (py-bug-tests-intern 'keep-assignments-column-lp:748198 arg teststring))) + +(defun keep-assignments-column-lp:748198 () + (goto-char 45) + (py-newline-and-indent) + (assert (eq 0 (current-column)) nil "py-vor test failed")) + +(defun indent-triplequoted-to-itself-lp:752252-test (&optional arg) + "With ARG greater 1 keep test buffer open. +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked." + (interactive "p") + (let ((teststring "def foo(): + \"\"\"The real foo thing.\n")) + (py-bug-tests-intern 'indent-triplequoted-to-itself-lp:752252-base arg teststring))) + +(defun indent-triplequoted-to-itself-lp:752252-base () + (sit-for 0.1) + ;; (message "(py-compute-indentation): %s" (py-compute-indentation)) + (assert (eq 4 (py-compute-indentation)) nil "indent-triplequoted-to-itself-lp:752252-test failed")) + +(defun multiline-listings-indent-lp:761946-test (&optional arg) + (interactive "p") + (let ((teststring "def foo(): + do_something_first( + a=1, + b=2, +")) + (py-bug-tests-intern 'multiline-listings-indent-lp:761946-base arg teststring))) + +(defun multiline-listings-indent-lp:761946-base () + (goto-char 49) + (assert (eq 8 (py-compute-indentation)) nil "multiline-listings-indent-lp:761946-test failed")) + +(defun new-page-char-causes-loop-lp:762498-test (&optional arg) + (interactive "p") + (let ((teststring "class Foo: + def baz(self): + + +")) + (py-bug-tests-intern 'new-page-char-causes-loop-lp:762498-base arg teststring))) + +(defun new-page-char-causes-loop-lp:762498-base () + (goto-char 31) + (assert (eq 8 (py-compute-indentation)) "new-page-char-causes-loop-lp:762498-test failed")) + +(defun nested-dicts-indent-lp:763756-test (&optional arg) + (interactive "p") + (let ((teststring "feature_operation_matrix = { + \"character\": { + \"kill\": \"{ctrl-k}\",{ + } + } + } +)) +")) + (py-bug-tests-intern 'nested-dicts-indent-lp:763756-base arg teststring))) + +(defun nested-dicts-indent-lp:763756-base () + (let ((py-indent-honors-multiline-listing nil)) + (goto-char 30) + (assert (eq 4 (py-compute-indentation)) nil "nested-dicts-indent-lp:763756-test failed") + (goto-char 49) + (assert (eq 8 (py-compute-indentation)) nil "nested-dicts-indent-lp:763756-test failed") + (forward-line 1) + (assert (eq 12 (py-compute-indentation)) nil "nested-dicts-indent-lp:763756-test failed"))) + +(defun bad-indent-after-except-lp:771289-test (&optional arg) + (interactive "p") + (let ((teststring "def foo(): + try: + baz() + except ValueError: +")) + (py-bug-tests-intern 'bad-indent-after-except-lp:771289-base arg teststring))) + +(defun bad-indent-after-except-lp:771289-base () + (assert (eq 8 (py-compute-indentation)) nil "bad-indent-after-except-lp:771289-test failed")) + +(defun indent-open-paren-not-last-lp:771291-test (&optional arg) + (interactive "p") + (let ((teststring " + +# Put point after the comma on the last line and hit return. You +# end up in column 8 (i.e. under the 'g' in 'thing') when you +# should end up in column 20 (under the 'w' in 'with_something'). +# Note that this is a different case than previously reported, +# where the open paren was the last thing on the line. When the +# open paren is *not* the last thing on the line, the next line's +# indentation should line up under the first non-whitespace +# character following the open paren. + +def foo(): + thing = call_it(with_something, +")) + (py-bug-tests-intern 'indent-open-paren-not-last-lp:771291-base arg teststring))) + +(defun indent-open-paren-not-last-lp:771291-base () + (assert (eq 20 (py-compute-indentation)) nil "indent-open-paren-not-last-lp:771291-test failed")) + +(defun wrong-indent-after-else-lp:772610-test (&optional arg) + (interactive "p") + (let ((teststring "if True: + pass +else: +")) + (py-bug-tests-intern 'wrong-indent-after-else-lp:772610-base arg teststring))) + +(defun wrong-indent-after-else-lp:772610-base () + (assert (eq 4 (py-compute-indentation)) nil "wrong-indent-after-else-lp:772610-test failed")) + +(defun except-indents-wrong-lp:784432-test (&optional arg) + (interactive "p") + (let ((teststring "try: + block1 +except: + block2")) + (py-bug-tests-intern 'except-indents-wrong-lp:784432-base arg teststring))) + +(defun except-indents-wrong-lp:784432-base () + (goto-char 17) + (assert (eq 0 (py-compute-indentation)) nil "except-indents-wrong-lp:784432-test #1 failed") + (goto-char 25) + (assert (eq 4 (py-compute-indentation)) nil "except-indents-wrong-lp:784432-test #2 failed")) + +(defun indent-explicitly-set-in-multiline-tqs-lp:784225-test (&optional arg) + (interactive "p") + (let ((teststring "def foo(): + with bar('x', \"\"\" + [hello] +" + )) + (py-bug-tests-intern 'indent-explicitly-set-in-multiline-tqs-lp:784225-base arg teststring))) + +(defun indent-explicitly-set-in-multiline-tqs-lp:784225-base () + (assert (eq 8 (py-compute-indentation)) nil "indent-explicitly-set-in-multiline-tqs-lp:784225-test failed")) + +(defun unbalanced-parentheses-lp:784645-test (&optional arg) + (interactive "p") + (let ((teststring "def foo(): + something() + + another( +")) + (py-bug-tests-intern 'unbalanced-parentheses-lp:784645-base arg teststring))) + +(defun unbalanced-parentheses-lp:784645-base () + (goto-char 28) + (assert (eq 4 (py-compute-indentation)) nil "unbalanced-parentheses-lp:784645-test failed")) + +(defun explicitly-indent-in-list-lp:785018-test (&optional arg) + (interactive "p") + (let ((teststring "def foo(): + with bar('x', + [hello] +" + )) + (py-bug-tests-intern 'explicitly-indent-in-list-lp:785018-base arg teststring))) + +(defun explicitly-indent-in-list-lp:785018-base () + (assert (eq 8 (py-compute-indentation)) nil "explicitly-dedented-in-list-lp:784225-test failed")) + +(defun explicit-backslashed-continuation-line-indent-lp:785091-test (&optional arg) + (interactive "p") + (let ((teststring " a_verry_loonng_variable_nammmee = \\ + val \\ +")) + (py-bug-tests-intern 'explicit-backslashed-continuation-line-indent-lp:785091-base arg teststring))) + +(defun explicit-backslashed-continuation-line-indent-lp:785091-base () + (assert (eq 40 (py-compute-indentation)) nil "explicit-backslashed-continuation-line-indent-lp:785091 test failed")) + +(defun indentation-error-lp:795773-test (&optional arg) + (interactive "p") + (let ((teststring "class MailTransportAgentAliases: + \"\"\"Utility for generating all the aliases of a mailing +list.\"\"\" + + implements(IMailTransportAgentAliases) + + def aliases(self, mlist): + \"\"\"See `IMailTransportAgentAliases`.\"\"\" + # Always return + yield mlist.posting_address + for destination in SUBDESTINATIONS: + yield '{0}-{1}@{2}'.format(mlist.list_name, + destination, + mlist.host_name) +")) + (py-bug-tests-intern 'indentation-error-lp:795773-base arg teststring))) + +(defun indentation-error-lp:795773-base () + (goto-char 385) + (assert (eq 39 (py-compute-indentation)) nil "indentation-error-lp:795773-test failed")) + +(defun class-highlighted-as-keywords-lp:798287-test (&optional arg) + (interactive "p") + (let ((teststring "class X: + pass + +# Everything is highlighted as a keyword. +")) + (py-bug-tests-intern 'class-highlighted-as-keywords-lp:798287-base arg teststring))) + +(defun class-highlighted-as-keywords-lp:798287-base () + (let ((font-lock-verbose nil)) + (goto-char 7) + (font-lock-fontify-buffer) + ;; (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-class-name-face) nil "class-highlighted-as-keywords-lp:798287-test failed"))) + +(defun indent-function-arglist-lp:800088-test (&optional arg) + (interactive "p") + (let ((teststring "def long_function_name( + var_one, var_two, var_three, + var_four): + print(var_one) +")) + (py-bug-tests-intern 'indent-function-arglist-lp:800088-base arg teststring))) + +(defun indent-function-arglist-lp:800088-base () + (goto-char 25) + (let ((py-indent-offset 4)) + (assert (eq 8 (py-compute-indentation)) nil "indent-function-arglist-lp:800088-test failed"))) + +(defun python-mode-hangs-lp:801780-test (&optional arg) + (interactive "p") + (let ((teststring "@jit.unroll_safe +def pushrevvalues(self, n, values_w): # n should be len(values_w) + make_sure_not_resized(values_w) + while True: + n -= 1 + if n < 0: + break + self.pushvalue(values_w[n]) +")) + (py-bug-tests-intern 'python-mode-hangs-lp:801780-base arg teststring))) + +(defun python-mode-hangs-lp:801780-base () + (assert (eq 18 (py-beginning-of-def-or-class)) nil "python-mode-hangs-lp:801780-test failed")) + +(defun stops-backslashed-line-lp:802504-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if bar == 1 or bar == 2 or bar == 3 or bar == 4 or bar == 5 or bar == 6 or bar == 7 \\ + or bar == 8 or bar == 9 or bar == 10 or bar == 11 or bar == 12 or bar == 13 \\ + or bar == 14 or bar == 15 or bar == 16 or bar == 17 or bar == 18: +"))) + (py-bug-tests-intern 'stops-backslashed-line-lp:802504-base arg teststring))) + +(defun stops-backslashed-line-lp:802504-base () + (goto-char 49) + (assert (eq 282 (py-end-of-statement)) nil "stops-backslashed-line-lp:802504-test failed")) + +(defun stops-backslashed-line-lp:802504-test2 (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if x>1 and x<100 and y>1 and y<200: + if bar == 1 or bar == 2 or bar == 3 or bar == 4 or bar == 5 or bar == 6 or bar == 7 \\ + or bar == 8 or bar == 9 or bar == 10 or bar == 11 or bar == 12 or bar == 13 or \\ +"))) + (py-bug-tests-intern 'stops-backslashed-line2-lp:802504-base arg teststring))) + +(defun stops-backslashed-line2-lp:802504-base () + (assert (eq 87 (py-beginning-of-statement)) nil "stops-backslashed-line-lp:802504-test failed")) + +(defun python-mode-slow-lp:803275-test (&optional arg) + (interactive "p") + (let ((teststring "# commands.py - command processing for mercurial +# +# Copyright 2005-2007 Matt Mackall +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + +from node import hex, bin, nullid, nullrev, short +from lock import release +from i18n import _, gettext +import os, re, difflib, time, tempfile, errno +import hg, scmutil, util, revlog, extensions, copies, error, bookmarks +import patch, help, url, encoding, templatekw, discovery +import archival, changegroup, cmdutil, hbisect +import sshserver, hgweb, hgweb.server, commandserver +import merge as mergemod +import minirst, revset, fileset +import dagparser, context, simplemerge +import random, setdiscovery, treediscovery, dagutil + +table = {} + +command = cmdutil.command(table) + +# common command options + +globalopts = [ + ('R', 'repository', '', + _('repository root directory or name of overlay bundle file'), + _('REPO')), + ('', 'cwd', '', + _('change working directory'), _('DIR')), + ('y', 'noninteractive', None, + _('do not prompt, assume \\'yes\\' for any required answers')), + ('q', 'quiet', None, _('suppress output')), + ('v', 'verbose', None, _('enable additional output')), + ('', 'config', [], + _('set/override config option (use \\'section.name=value\\')'), + _('CONFIG')), + ('', 'debug', None, _('enable debugging output')), + ('', 'debugger', None, _('start debugger')), + ('', 'encoding', encoding.encoding, _('set the charset encoding'), + _('ENCODE')), + ('', 'encodingmode', encoding.encodingmode, + _('set the charset encoding mode'), _('MODE')), + ('', 'traceback', None, _('always print a traceback on exception')), + ('', 'time', None, _('time how long the command takes')), + ('', 'profile', None, _('print command execution profile')), + ('', 'version', None, _('output version information and exit')), + ('h', 'help', None, _('display help and exit')), +] + +dryrunopts = [('n', 'dry-run', None, + _('do not perform actions, just print output'))] + +remoteopts = [ + ('e', 'ssh', '', + _('specify ssh command to use'), _('CMD')), + ('', 'remotecmd', '', + _('specify hg command to run on the remote side'), _('CMD')), + ('', 'insecure', None, + _('do not verify server certificate (ignoring web.cacerts config)')), +] + +walkopts = [ + ('I', 'include', [], + _('include names matching the given patterns'), _('PATTERN')), + ('X', 'exclude', [], + _('exclude names matching the given patterns'), _('PATTERN')), +] + +commitopts = [ + ('m', 'message', '', + _('use text as commit message'), _('TEXT')), + ('l', 'logfile', '', + _('read commit message from file'), _('FILE')), +] + +commitopts2 = [ + ('d', 'date', '', + _('record the specified date as commit date'), _('DATE')), + ('u', 'user', '', + _('record the specified user as committer'), _('USER')), +] + +templateopts = [ + ('', 'style', '', + _('display using template map file'), _('STYLE')), + ('', 'template', '', + _('display with template'), _('TEMPLATE')), +] + +logopts = [ + ('p', 'patch', None, _('show patch')), + ('g', 'git', None, _('use git extended diff format')), + ('l', 'limit', '', + _('limit number of changes displayed'), _('NUM')), + ('M', 'no-merges', None, _('do not show merges')), + ('', 'stat', None, _('output diffstat-style summary of changes')), +] + templateopts + +diffopts = [ + ('a', 'text', None, _('treat all files as text')), + ('g', 'git', None, _('use git extended diff format')), + ('', 'nodates', None, _('omit dates from diff headers')) +] + +diffopts2 = [ + ('p', 'show-function', None, _('show which function each change is in')), + ('', 'reverse', None, _('produce a diff that undoes the changes')), + ('w', 'ignore-all-space', None, + _('ignore white space when comparing lines')), + ('b', 'ignore-space-change', None, + _('ignore changes in the amount of white space')), + ('B', 'ignore-blank-lines', None, + _('ignore changes whose lines are all blank')), + ('U', 'unified', '', + _('number of lines of context to show'), _('NUM')), + ('', 'stat', None, _('output diffstat-style summary of changes')), +] + +similarityopts = [ + ('s', 'similarity', '', + _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY')) +] + +subrepoopts = [ + ('S', 'subrepos', None, + _('recurse into subrepositories')) +] + +# Commands start here, listed alphabetically + +@command('^add', + walkopts + subrepoopts + dryrunopts, + _('[OPTION]... [FILE]...')) +def add(ui, repo, \*pats, \*\*opts): + \"\"\"add the specified files on the next commit + + Schedule files to be version controlled and added to the + repository. + + The files will be added to the repository at the next commit. To + undo an add before that, see :hg:`forget`. + + If no names are given, add all files to the repository. + + .. container:: verbose + + An example showing how new (unknown) files are added + automatically by :hg:`add`:: + + \$ ls + foo.c + \$ hg status + ? foo.c + \$ hg add + adding foo.c + \$ hg status + A foo.c + + Returns 0 if all files are successfully added. + \"\"\" + + m = scmutil.match(repo[None], pats, opts) + rejected = cmdutil.add(ui, repo, m, opts.get('dry_run'), + opts.get('subrepos'), prefix=\"\") + return rejected and 1 or 0 +")) + (py-bug-tests-intern 'python-mode-slow-lp:803275-base arg teststring))) + +(defun python-mode-slow-lp:803275-base () + (goto-char 1) + (sit-for 0.1) + (assert (eq 5430 (py-end-of-def-or-class)) nil "python-mode-slow-lp:803275-test failed")) + +(defun master-file-not-honored-lp:794850-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " + # -*- coding: utf-8 -*- + +# Local Variables: +# py-master-file: \"/usr/tmp/my-master.py\" +# End: + +print(\"master-file is executed\") +"))) + (py-bug-tests-intern 'master-file-not-honored-lp:794850-base arg teststring))) + +(defun master-file-not-honored-lp:794850-base () + (let ((oldbuf (current-buffer))) + (save-excursion + (set-buffer (get-buffer-create "test-master.py")) + (erase-buffer) + (insert "#! /usr/bin/env python + # -*- coding: utf-8 -*- + +print(\"Hello, I'm your master!\") +") + (write-file "/var/tmp/my-master.py")) + (set-buffer oldbuf) + (unwind-protect + (py-execute-buffer) + (when (file-readable-p "/var/tmp/my-master.py") (delete-file "/var/tmp/my-master.py"))))) + +(defun py-variable-name-face-lp:798538-test (&optional arg) + (interactive "p") + (let ((teststring "class Foo(object): + def summat(cls, x): + ..... + summat = classmethod(summat) +")) + (py-bug-tests-intern 'py-variable-name-face-lp:798538-base arg teststring))) + +(defun py-variable-name-face-lp:798538-base () + (let ((font-lock-verbose nil)) + (font-lock-mode 1) + (font-lock-fontify-buffer) + (goto-char 64) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-variable-name-face) nil "py-variable-name-face-lp:798538-test failed "))) + +(defun colon-causes-error-lp:818665-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " + # -*- coding: utf-8 -*- + +print(\"Hello!\") +"))) + (py-bug-tests-intern 'colon-causes-error-lp:818665-base arg teststring))) + +(defun colon-causes-error-lp:818665-base () + (insert ":") + (forward-char -1) + (assert (looking-at ":") nil "colon-causes-error-lp:818665-test failed")) + +(defun if-indentation-lp:818720-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " + # -*- coding: utf-8 -*- + +class X(): + def __init__( self ): + self.lookup = {} + + def y( self, p ): + p = p.foo() + if p in self.lookup: + return self.lookup[ foo ] + else: + return None +"))) + (py-bug-tests-intern 'if-indentation-lp:818720-base arg teststring))) + +(defun if-indentation-lp:818720-base () + (goto-char 196) + (assert (eq 12 (py-compute-indentation)) nil "if-indentation-lp:818720-test failed")) + +(defun closing-parenthesis-indent-lp:821820-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if foo: + bar.append( + ht( + T.a('Sorted Foo', href='#Blub', ), + ' -- foo bar baz--', + self.Tasdf( afsd ), + self.Tasdf( asdf ), + ) + ) +"))) + (py-bug-tests-intern 'closing-parenthesis-indent-lp:821820-base arg teststring))) + +(defun closing-parenthesis-indent-lp:821820-base () + (let ((py-closing-list-dedents-bos t)) + (forward-line -1) + (assert (eq 4 (py-compute-indentation)) nil "closing-parenthesis-indent-lp:821820-test failed"))) + +(defun py-indent-line-lp:822532-test (&optional arg) + (interactive "p") + (let ((teststring " +if x > 0: + for i in range(100): + print(i) + else: + print(\"All done\") +elif x < 0: + print(\"x is negative\") +")) + (py-bug-tests-intern 'py-indent-line-lp:822532-base arg teststring))) + +(defun py-indent-line-lp:822532-base () + (goto-char 54) + (assert (eq 4 (py-compute-indentation)) nil "py-indent-line-lp:822532-test failed")) + +(defun indent-honor-arglist-whitespaces-lp:822540-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +abc( ghi, + jkl +"))) + (py-bug-tests-intern 'indent-honor-arglist-whitespaces-lp:822540-base arg teststring))) + +(defun indent-honor-arglist-whitespaces-lp:822540-base () + (forward-line -1) + (assert (eq 5 (py-compute-indentation)) nil "indent-honor-arglist-whitespaces-lp:822540-test failed")) + +(defun comments-indent-honor-setting-lp:824427-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -\*- coding: utf-8 -\*- + +if __name__ == '__main__': + from foo import \* + foo([\"baz\"]) # list of foo's development directories + +# limitations: +# +# Some comments on limitations: +# asdf +"))) + (py-bug-tests-intern 'comments-indent-honor-setting-lp:824427-base arg teststring))) + +(defun comments-indent-honor-setting-lp:824427-base () + (goto-char 206) + (assert (eq 0 (py-compute-indentation)) nil "comments-indent-honor-setting-lp:824427-test failed")) + +(defun infinite-loop-after-tqs-lp:826044-test (&optional arg) + (interactive "p") + (let ((teststring "\"\"\" +hey +\"\"\" +")) + (py-bug-tests-intern 'infinite-loop-after-tqs-lp:826044-base arg teststring))) + +(defun infinite-loop-after-tqs-lp:826044-base () + (assert (eq 0 (py-newline-and-indent)) nil "infinite-loop-after-tqs-lp:826044-test failed")) + +(defun closing-list-lp:826144-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if foo: + bar.append( + ht( + T.a('Sorted Foo', href='#Blub', ), + ' -- foo bar baz--', + self.Tasdf( afsd ), + self.Tasdf( asdf ), + ) + ) +"))) + (py-bug-tests-intern 'closing-list-lp:826144-base arg teststring))) + +(defun closing-list-lp:826144-base () + (let (py-closing-list-dedents-bos) + (goto-char (point-min)) + (re-search-forward ") *$" nil t 1) + (assert (eq 12 (py-compute-indentation)) nil "closing-list-lp:826144-test #1 failed") + (re-search-forward ") *$" nil t 1) + (assert (eq 8 (py-compute-indentation)) nil "closing-list-lp:826144-test #2 failed") + (setq py-closing-list-dedents-bos t) + (goto-char (point-min)) + (re-search-forward ") *$" nil t 1) + (assert (eq 8 (py-compute-indentation)) nil "closing-list-lp:826144-test #1 failed") + (re-search-forward ") *$" nil t 1) + (assert (eq 4 (py-compute-indentation)) nil "closing-list-lp:826144-test #2 failed"))) + +(defun py-electric-comment-add-space-lp:828398-test (&optional arg) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'py-electric-comment-add-space-lp:828398-base arg teststring))) + +(defun py-electric-comment-add-space-lp:828398-base () + (let ((py-electric-comment-add-space-p nil)) + (py-electric-comment 1) + (assert (looking-back "#") nil "py-electric-comment-add-space-lp:828398-test failed"))) + +(defun py-electric-comment-add-space-t-lp:828398-test (&optional arg) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'py-electric-comment-add-space-t-lp:828398-base arg teststring))) + +(defun py-electric-comment-add-space-t-lp:828398-base () + (let ((py-electric-comment-add-space-p t)) + (py-electric-comment 1) + (assert (looking-back " ") nil "py-electric-comment-add-space-lp:828398-test failed"))) + +(defun execute-indented-code-lp:828314-test (&optional arg) + (interactive "p") + (let ((teststring "if __name__ == \"__main__\": + print(\"hello, I'm the execute-indented-code-lp:828314-test\") +")) + (py-bug-tests-intern 'execute-indented-code-lp:828314-base 2 teststring))) + +(defun execute-indented-code-lp:828314-base () + (let ((debug-on-error t)) + (goto-char 28) + (assert (py-execute-line) nil "execute-indented-code-lp:828314-test failed"))) + +(defun wrong-indentation-of-function-arguments-lp:840891-test (&optional arg) + (interactive "p") + (let ((teststring "abdc = foo(a=1, + b=2, + c=3) +")) + (py-bug-tests-intern 'wrong-indentation-of-function-arguments-lp:840891-base arg teststring))) + +(defun wrong-indentation-of-function-arguments-lp:840891-base () + (goto-char 38) + (assert (eq 11 (py-compute-indentation)) nil "wrong-indentation-of-function-arguments-lp:840891-test failed")) + +(defun py-hungry-delete-backwards-needs-cc-lp:850595-test (&optional arg) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'py-hungry-delete-backwards-needs-cc-lp:850595-base arg teststring))) + +(defun py-hungry-delete-backwards-needs-cc-lp:850595-base () + (assert (functionp 'c-hungry-delete-backwards) nil "py-hungry-delete-backwards-needs-cc-lp:850595-test failed")) + +(defun wrong-guess-for-py-indent-offset-lp:852052-test (&optional arg) + (interactive "p") + (let ((teststring "# The indent offset shouldn't be guessed from backslash +# continuations. I have + +from long.pkg.name import long, list, of, \\ + class_and_function, and, function, names + +# (note there are five spaces before \"class\", to match with the +# start of the pkg name.) + +# Since the indent of backlash-continued lines has no meaning for +# code, it should not be considered. +")) + (py-bug-tests-intern 'wrong-guess-for-py-indent-offset-lp:852052-base arg teststring))) + +(defun wrong-guess-for-py-indent-offset-lp:852052-base () + (goto-char 126) + (assert (eq 4 (py-guess-indent-offset)) nil "wrong-guess-for-py-indent-offset-lp:852052-test failed")) + +(defun indent-match-import-pkg-lp:852500-test (&optional arg) + (interactive "p") + (let (py-smart-indentation + (teststring "from long.pkg.name import long, list, of, \\ + class_and_function, names + +# (note there are five spaces before \"class\", to match with the +# start of the pkg name.) +")) + (py-bug-tests-intern 'indent-match-import-pkg-lp:852500-base arg teststring))) + +(defun indent-match-import-pkg-lp:852500-base () + (goto-char 45) + (assert (eq 5 (py-compute-indentation)) nil "indent-match-import-pkg-lp:852500-test failed")) + +(defun py-shift-line-when-no-region-lp:855565-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if foo: + print"))) + (py-bug-tests-intern 'py-shift-line-when-no-region-lp:855565-base arg teststring))) + +(defun py-shift-line-when-no-region-lp:855565-base () + (goto-char 58) + (assert (eq 8 (py-shift-right 1)) nil "py-shift-line-when-no-region-lp:855565-test failed")) + +(defun highlighting-in-multiline-function-call-arguments-lp:856833-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -\*- coding: utf-8 -\*- + +newObj = SomeClassWithManyManyArgs (param0 = val0, + param1 = val1, + param2 = val2, param3 = val3) +"))) + (py-bug-tests-intern 'highlighting-in-multiline-function-call-arguments-lp:856833-base arg teststring))) + +(defun highlighting-in-multiline-function-call-arguments-lp:856833-base () + (font-lock-fontify-buffer) + (goto-char 80) + ;; (goto-char 106) + (assert (eq (get-char-property (point) 'face) nil) nil "highlighting-in-multiline-function-call-arguments-lp:856833 test failed ")) + +(defun py-shift-preserve-active-region-lp:857837-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -\*- coding: utf-8 -\*- + +print('hello') +print('world') +"))) + (py-bug-tests-intern 'py-shift-preserve-active-region-lp:857837-base arg teststring))) + +(defun py-shift-preserve-active-region-lp:857837-base () + (goto-char 49) + (assert nil "py-shift-preserve-active-region-lp:857837-test failed")) + +(defun variable-highlighted-on-LHS-of-eq-lp:858304-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if someVar == 5: + doSomething() +"))) + (py-bug-tests-intern 'variable-highlighted-on-LHS-of-eq-lp:858304-base arg teststring))) + +(defun variable-highlighted-on-LHS-of-eq-lp:858304-base () + (goto-char 55) + (assert (eq (get-char-property (point) 'face) nil) nil "variable-highlighted-on-LHS-of-eq-lp:858304-test failed")) + +(defun indent-guessing-lp:858040-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +some_longer_call(arguments, + arguments) +"))) + (py-bug-tests-intern 'indent-guessing-lp:858040-base arg teststring))) + +(defun indent-guessing-lp:858040-base () + (goto-char 40) + (assert (eq 4 py-indent-offset) nil "indent-guessing-lp:858040-test failed")) + +(defun indentation-of-from-import-continuation-lines-lp:858041-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +from nicos import session +from nicos import status, loggers +from nicos.utils import DeviceMeta, Param, Override, Value, getVersions, \\ +usermethod, tupleof, floatrange, any, none_or + +"))) + (py-bug-tests-intern 'indentation-of-from-import-continuation-lines-lp:858041-base arg teststring))) + +(defun indentation-of-from-import-continuation-lines-lp:858041-base () + (goto-char 184) + (assert (eq 5 (py-compute-indentation)) nil "indentation-of-from-import-continuation-lines-lp:858041-test failed")) + +(defun indentation-after-one-line-suites-lp:858044-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if foo: return + +"))) + (py-bug-tests-intern 'indentation-after-one-line-suites-lp:858044-base arg teststring))) + +(defun indentation-after-one-line-suites-lp:858044-base () + (goto-char 64) + (assert (eq 0 (py-compute-indentation)) nil "indentation-after-one-line-suites-lp:858044-test failed")) + +(defun py-compute-indentation-wrong-at-eol-lp:858043-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if maxdepth == 0 or depth < maxdepth: + item += build_toc(sectionnode, depth+1) +"))) + (py-bug-tests-intern 'py-compute-indentation-wrong-at-eol-lp:858043-base arg teststring))) + +(defun py-compute-indentation-wrong-at-eol-lp:858043-base () + (setq py-smart-indentation nil) + (setq py-indent-offset 4) + (goto-char 132) + (assert (eq 4 (py-compute-indentation)) nil "py-compute-indentation-wrong-at-eol-lp:858043-test failed")) + +(defun comment-indentation-level-lp:869854-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def foo(): + def bar(): + x = 1 +# asdf + +"))) + (py-bug-tests-intern 'comment-indentation-level-lp:869854-base arg teststring))) + +(defun comment-indentation-level-lp:869854-base () + (goto-char 104) + (assert (eq 0 (py-compute-indentation)) nil "comment-indentation-level-lp:869854-test failed")) + +(defun indentation-wrong-after-multi-line-parameter-list-lp:871698-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def foo(bar, baz): + # indenation as it should be + +def foo(bar, + baz): +# this is the next indentation line (none) + +class Foo: + def bar(biz, + baz): + # indentation here after newline + +"))) + (py-bug-tests-intern 'indentation-wrong-after-multi-line-parameter-list-lp:871698-base arg teststring))) + +(defun indentation-wrong-after-multi-line-parameter-list-lp:871698-base () + (goto-char 68) + (assert (eq 4 (py-compute-indentation)) nil "indentation-wrong-after-multi-line-parameter-list-lp:871698-test #1 failed") + (goto-char 115) + (assert (eq 8 (py-compute-indentation)) nil "indentation-wrong-after-multi-line-parameter-list-lp:871698-test #2 failed") + (goto-char 201) + (assert (eq 12 (py-compute-indentation)) nil "indentation-wrong-after-multi-line-parameter-list-lp:871698-test #3 failed") + (goto-char 223) + (assert (eq 8 (py-compute-indentation)) nil "indentation-wrong-after-multi-line-parameter-list-lp:871698-test #4 failed") + ) + +(defun no-indent-after-continue-lp:872676-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def foo(): + for i in range(10): + if i == 7: + continue + if i == 9 + +"))) + (py-bug-tests-intern 'no-indent-after-continue-lp:872676-base arg teststring))) + +(defun no-indent-after-continue-lp:872676-base () + (goto-char 141) + (assert (eq 8 (py-compute-indentation)) nil "no-indent-after-continue-lp:872676-test failed")) + +(defun indent-after-inline-comment-lp:873372-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +foo = True # the next line is indented incorrectly + # to here +"))) + (py-bug-tests-intern 'indent-after-inline-comment-lp:873372.txt-base arg teststring))) + +(defun indent-after-inline-comment-lp:873372.txt-base () + (let ((py-indent-honors-inline-comment t)) + (goto-char 111) + (assert (eq 11 (py-compute-indentation)) nil "indent-after-inline-comment-lp:873372-test #1 failed")) + (let (py-indent-honors-inline-comment) + (goto-char 111) + (assert (eq 0 (py-compute-indentation)) nil "indent-after-inline-comment-lp:873372-test #2 failed"))) + +(defun else-clause-indentation-lp:874470-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def foo(): + for i in range(10): + if i == 7: + continue + do_something(i) + else +"))) + (py-bug-tests-intern 'else-clause-indentation-lp:874470-base arg teststring))) + +(defun else-clause-indentation-lp:874470-base () + (goto-char 156) + (assert (eq 4 (py-compute-indentation)) nil "else-clause-indentation-lp:874470-test failed")) + +(defun incorrect-use-of-region-in-py-shift-left-lp:875951-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def foo(): + for i in range(10): + for j in range(10): + print(i, j) + print('next') + +"))) + (py-bug-tests-intern 'incorrect-use-of-region-in-py-shift-left-lp:875951-base arg teststring))) + +(defun incorrect-use-of-region-in-py-shift-left-lp:875951-base () + (push-mark 84) + (goto-char 135) + (py-shift-left 1 84 135) + (assert (eq 8 (current-indentation)) nil "incorrect-use-of-region-in-py-shift-left-lp:875951-test failed")) + +(defun py-complete-lp:858621-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +pri +"))) + (py-bug-tests-intern 'py-complete-lp:858621-base 2 teststring))) + +(defun py-complete-lp:858621-base () + (goto-char 52) + (ignore-errors (py-shell-complete)) + (sit-for 0.1) + (assert (eq 54 (point)) nil "py-complete-lp:858621-test failed")) + +(defun indentation-after-line-with-keyword-lp:883073-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +with_foo = False + # indents here +"))) + (py-bug-tests-intern 'indentation-after-line-with-keyword-lp:883073-base arg teststring))) + +(defun indentation-after-line-with-keyword-lp:883073-base () + (goto-char 66) + (assert (eq 0 (py-compute-indentation)) nil "indentation-after-line-with-keyword-lp:883073-test failed")) + +(defun indent-after-multiple-except-statements-lp:883815-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def foo(): + try: + x = 1 + except SystemError: + f = 1 +except KeyError: + p = 1 +"))) + (py-bug-tests-intern 'indent-after-multiple-except-statements-lp:883815-base arg teststring))) + +(defun indent-after-multiple-except-statements-lp:883815-base () + (goto-char 121) + (assert (eq 4 (py-compute-indentation)) nil "indent-after-multiple-except-statements-lp:883815-test failed")) + +(defun wrongly-highlighted-as-keywords-lp:885144-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +date_range = 4 +date_range_max = 3 +latest_sum = 5 +"))) + (py-bug-tests-intern 'wrongly-highlighted-as-keywords-lp:885144-base arg teststring))) + +(defun wrongly-highlighted-as-keywords-lp:885144-base () + (font-lock-fontify-buffer) + (goto-char 55) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-variable-name-face) nil "wrongly-highlighted-as-keywords-lp:885144-test failed")) + +(defun glitch-when-indenting-lists-lp:886473-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +def foo(bar, + baz): + pass +"))) + (py-bug-tests-intern 'glitch-when-indenting-lists-lp:886473-base arg teststring))) + +(defun glitch-when-indenting-lists-lp:886473-base () + (goto-char 61) + (assert (eq 8 (py-compute-indentation)) nil "glitch-when-indenting-lists-lp:886473-test failed")) + +(defun keywords-in-identifiers-highlighted-incorrectly-lp:888338-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +def possibly_break(): + pass +"))) + (py-bug-tests-intern 'keywords-in-identifiers-highlighted-incorrectly-lp:888338-base arg teststring))) + +(defun keywords-in-identifiers-highlighted-incorrectly-lp:888338-base () + (font-lock-fontify-buffer) + (sit-for 0.1) + (goto-char 55) + (assert (eq (get-char-property (point) 'face) 'font-lock-function-name-face) nil "keywords-in-identifiers-highlighted-incorrectly-lp:888338-test failed")) + +(defun indentation-keyword-lp:885143-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +import sys +"))) + (py-bug-tests-intern 'indentation-keyword-lp:885143-base arg teststring))) + +(defun indentation-keyword-lp:885143-base () + (goto-char 48) + (assert (eq 0 (py-compute-indentation)) nil "indentation-keyword-lp:885143-test failed")) + +(defun py-shell-complete-lp:328836-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +"))) + (py-bug-tests-intern 'py-shell-complete-lp:328836-base 2 teststring))) + +(defun py-shell-complete-lp:328836-base () + (python-dedicated) + (goto-char (point-max)) + (insert "pri") + (py-shell-complete) + (assert (looking-back "print") nil "py-shell-complete-lp:328836-test failed")) + +(defun indentation-bug-inside-docstrings-lp:899455-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def foo(): + \"\"\"This is my docstring. + + There are many others like it, but this one is mine. My docstring is my + best friend. It is my life. I must master it as I must master my life. + Without me, my docstring is useless. Without my docstring, I am useless. + I must write my docstring true. I must write clearer than my enemy, who + is trying to confuse me. I must enlighten him before he enlightens me. I + will. Before Guido I swear this creed: my docstring and myself are + defenders of my codebase, we are the masters of our enemy, we are the + saviors of my life. So be it, until there is no enemy, but peace. Amen. + + foo: str or None + If None then baz. + + \"\"\" + +"))) + (py-bug-tests-intern 'indentation-bug-inside-docstrings-lp:899455-base arg teststring))) + +(defun indentation-bug-inside-docstrings-lp:899455-base () + (goto-char 742) + (sit-for 0.2) + (assert (eq 8 (py-compute-indentation)) nil "indentation-bug-inside-docstrings-lp:899455-test failed")) + +(defun another-indentation-bug-inside-docstrings-lp:900684-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +def is_x_day(date): + \"\"\"Return True if given date is the X-day. + + \"\"\" +"))) + (py-bug-tests-intern 'another-indentation-bug-inside-docstrings-lp:900684-base arg teststring))) + +(defun another-indentation-bug-inside-docstrings-lp:900684-base () + (goto-char 116) + (sit-for 0.1) + (assert (eq 4 (py-compute-indentation)) nil "another-indentation-bug-inside-docstrings-lp:900684-test failed")) + +(defun indent-offset-not-guessed-when-loading-lp:902890-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +#! /usr/bin/python +# -*- coding: utf-8 -*- +def main(): + if len(sys.argv)==1: + usage() + sys.exit() +"))) + (py-bug-tests-intern 'indent-offset-not-guessed-when-loading-lp:902890-base arg teststring))) + +(defun indent-offset-not-guessed-when-loading-lp:902890-base () + "This doesn't check precisely the feature requested. " + (assert (eq 2 (py-guess-indent-offset)) nil "indent-offset-not-guessed-when-loading-lp:902890-test failed")) + +(defun from-__future__-import-absolute_import-mishighlighted-lp:907084-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +from __future__ import absolute_import +"))) + (py-bug-tests-intern 'from-__future__-import-absolute_import-mishighlighted-lp:907084-base arg teststring))) + +(defun from-__future__-import-absolute_import-mishighlighted-lp:907084-base () + (font-lock-fontify-buffer) + (goto-char 82) + (assert (not (eq (get-char-property (point) 'face) 'font-lock-keyword-face)) nil "from-__future__-import-absolute_import-mishighlighted-lp:907084-test failed")) + +(defun automatic-indentation-is-broken-lp:889643-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +"))) + (py-bug-tests-intern 'automatic-indentation-is-broken-lp:889643-base arg teststring))) + +(defun automatic-indentation-is-broken-lp:889643-base () + ;; (if (string-match "components" (find-lisp-object-file-name 'python-mode 'python-mode)) + ;; (assert (eq (key-binding (kbd "RET")) 'py-newline-and-indent) nil "automatic-indentation-is-broken-lp:889643-test failed") + (assert (eq (key-binding (kbd "RET")) 'py-newline-and-indent) nil "automatic-indentation-is-broken-lp:889643-test failed") + ) + +(defun chars-uU-preceding-triple-quoted-get-string-face-lp:909517-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +u\"hi\" and u\"\"\"d\"\"\" +"))) + (py-bug-tests-intern 'chars-uU-preceding-triple-quoted-get-string-face-lp:909517-base arg teststring))) + +(defun chars-uU-preceding-triple-quoted-get-string-face-lp:909517-base () + (goto-char 58) + (assert (eq nil (get-char-property (point) 'face)) nil "chars-uU-preceding-triple-quoted-get-string-face-lp:909517-test failed")) + +(defun wrong-type-argument-lp:901541-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +# source: argparse.py +# Author: Steven J. Bethard . + +\"\"\"Command-line parsing library + +This module is an optparse-inspired command-line parsing library that: + + - handles both optional and positional arguments + - produces highly informative usage messages + - supports parsers that dispatch to sub-parsers +\"\"\" +"))) + (py-bug-tests-intern 'wrong-type-argument-lp:901541-base arg teststring))) + +(defun wrong-type-argument-lp:901541-base () + (goto-char 385) + (sit-for 0.1) + ;; (message "%s" "wrong-type-argument-lp:901541-test") + ;; (message "(py-compute-indentation): should 4: %s" (py-compute-indentation)) + (assert (eq 4 (py-compute-indentation)) nil "wrong-type-argument-lp:901541-test failed")) + +(defun py-pychecker-run-missing-lp:910783-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +"))) + (py-bug-tests-intern 'py-pychecker-run-missing-lp:910783-base arg teststring))) + +(defun py-pychecker-run-missing-lp:910783-base () + (assert (commandp 'py-pychecker-run) nil "py-pychecker-run-missing-lp:910783-test failed")) + +(defun py-forward-into-nomenclature-lp:916818-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +def doSomething(blah) +print(\"\"\"Es müsste \"müßte\" heißen.\"\"\") +"))) + (py-bug-tests-intern 'py-forward-into-nomenclature-lp:916818-base arg teststring))) + +(defun py-forward-into-nomenclature-lp:916818-base () + (goto-char 48) + (assert (eq 51 (py-forward-into-nomenclature)) nil "py-forward-into-nomenclature-lp:916818-test #1 failed") + (assert (eq 54 (py-forward-into-nomenclature)) nil "py-forward-into-nomenclature-lp:916818-test #2 failed") + (assert (eq 63 (py-forward-into-nomenclature)) nil "py-forward-into-nomenclature-lp:916818-test #3 failed") + (assert (eq 68 (py-forward-into-nomenclature)) nil "py-forward-into-nomenclature-lp:916818-test #4 failed") + (goto-char 88) + (assert (eq 95 (py-forward-into-nomenclature)) nil "py-forward-into-nomenclature-lp:916818-test #5 failed")) + +(defun tab-completion-in-Ipython-buffers-lp:916869-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +"))) + (py-bug-tests-intern 'tab-completion-in-Ipython-buffers-lp:916869-base arg teststring))) + +(defun tab-completion-in-Ipython-buffers-lp:916869-base () + (ipython-dedicated) + (switch-to-buffer (current-buffer)) + (goto-char (point-max)) + (sit-for 0.1) + (insert "pri") + (ipython-complete) + (sit-for 0.1) + (assert (looking-back "print") nil "tab-completion-in-Ipython-buffers-lp:916869-test failed")) + +(defun py-forward-into-nomenclature-jumps-over-CamelCased-words-lp:919540-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +def SomeFunction(arg): + pass +"))) + (py-bug-tests-intern 'py-forward-into-nomenclature-jumps-over-CamelCased-words-lp:919540-base arg teststring))) + +(defun py-forward-into-nomenclature-jumps-over-CamelCased-words-lp:919540-base () + (goto-char 52) + (assert (eq 56 (py-forward-into-nomenclature)) nil "py-forward-into-nomenclature-jumps-over-CamelCased-words-lp:919540-test failed")) + +(defun py-backward-into-nomenclature-caps-names-lp:919541-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +return SOME_Constant + blah +"))) + (py-bug-tests-intern 'py-backward-into-nomenclature-caps-names-lp:919541-base arg teststring))) + +(defun py-backward-into-nomenclature-caps-names-lp:919541-base () + (goto-char 64) + (assert (eq 60 (py-backward-into-nomenclature)) nil "py-backward-into-nomenclature-caps-names-lp:919541-test failed")) + +(defun py-ipython-complete-lp:927136-test (&optional arg) + (interactive "p") + ;; (py-shell nil nil "ipython" 'noswitch) + (let ((teststring (concat py-ipython-test-shebang " +# -*- coding: utf-8 -*- +ex +"))) + (py-bug-tests-intern 'py-ipython-complete-lp:927136-base arg teststring))) + +(defun py-ipython-complete-lp:927136-base () + (goto-char (point-min)) + (search-forward "ex") + (ipython-complete) + (sit-for 0.1) + (assert (buffer-live-p (get-buffer "*IPython Completions*")) nil "py-ipython-complete-lp:927136-test #2 lp:1026705 failed") + ) + +(defun execute-buffer-ipython-fails-lp:928087-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-ipython-test-shebang " +# -*- coding: utf-8 -*- +print(4 + 5) +print(u'\\xA9') +"))) + (py-bug-tests-intern 'execute-buffer-ipython-fails-lp:928087-base arg teststring))) + +(defun execute-buffer-ipython-fails-lp:928087-base () + (let (py-split-windows-on-execute-p + py-shell-switch-buffers-on-execute-p) + (assert (py-execute-buffer) nil "execute-buffer-ipython-fails-lp:928087-test failed"))) + +(defun fourth-level-blocks-indent-incorrectly-lp:939577-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +for x in y: + for z in l: + for r in t: + pass # <--- indents here. Pressing dedents eight spaces (i.e. you can go to column 0 in two presess) +"))) + (py-bug-tests-intern 'fourth-level-blocks-indent-incorrectly-lp:939577-base arg teststring))) + +(defun fourth-level-blocks-indent-incorrectly-lp:939577-base () + (goto-char 88) + (assert (eq 4 (py-guess-indent-offset)) nil "fourth-level-blocks-indent-incorrectly-lp:939577-test failed") + (goto-char 225) + (assert (eq 4 (py-guess-indent-offset)) nil "fourth-level-blocks-indent-incorrectly-lp:939577-test failed") + ) + +(defun py-mark-expression-marks-too-much-lp:941140-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -\*- + somevar = \"some string\" + # some code + +# when point is on the first quote, calling py-mark-expression marks the next several lines, no matter what they are. + +# This only seems to happen when point is in the first quote of a string literal which is the last thing on a line. + + somevar = some_string.some_property() + # point at first quote works + + somevar = \"a\" + \"b\" + # works at quote before a, fails at quote before b + +I am using version 6.0.4 + +"))) + (py-bug-tests-intern 'py-mark-expression-marks-too-much-lp:941140-base arg teststring))) + +(defun py-mark-expression-marks-too-much-lp:941140-base () + (goto-char 60) + + (assert (string-match "some" (py-expression)) nil "py-mark-expression-marks-too-much-lp:941140-test failed") + (goto-char 417) + (assert (string-match "a" (py-expression)) nil "py-mark-expression-marks-too-much-lp:941140-test failed")) + +;;; Py-shell tests +(defun py-shell-invoking-python-lp:835151-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"py-shell-name: python\")")) + (py-bug-tests-intern 'py-shell-invoking-python-lp:835151-base arg teststring))) + +(defun py-shell-invoking-python-lp:835151-base () + (setq py-shell-name "python") + (assert (stringp (py-execute-buffer)) nil "py-shell-invoking-python-lp:835151-test failed")) + +(defun py-shell-invoking-ipython-lp:835151-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"py-shell-name: ipython\")")) + (py-bug-tests-intern 'py-shell-invoking-ipython-lp:835151-base arg teststring))) + +(defun py-shell-invoking-ipython-lp:835151-base () + (setq py-shell-name "ipython") + (assert (stringp (py-execute-buffer "ipython")) nil "py-shell-invoking-ipython-lp:835151-test failed")) + +(defun py-shell-invoking-python3-lp:835151-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"py-shell-name: python3\")")) + (py-bug-tests-intern 'py-shell-invoking-python3-lp:835151-base arg teststring))) + +(defun py-shell-invoking-python3-lp:835151-base () + (setq py-shell-name "python3") + (assert (py-execute-buffer) nil "py-shell-invoking-python3-lp:835151-test failed")) + +(defun py-shell-invoking-python2-lp:835151-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"py-shell-name: python2\")")) + (py-bug-tests-intern 'py-shell-invoking-python2-lp:835151-base arg teststring))) + +(defun py-shell-invoking-python2-lp:835151-base () + (setq py-shell-name "python2") + (assert (py-execute-buffer) nil "py-shell-invoking-python2-lp:835151-test failed")) + +(defun py-shell-invoking-python2.7-lp:835151-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"py-shell-name: python2.7\")")) + (py-bug-tests-intern 'py-shell-invoking-python2.7-lp:835151-base arg teststring))) + +(defun py-shell-invoking-python2.7-lp:835151-base () + (setq py-shell-name "python2.7") + (assert (py-execute-buffer) nil "py-shell-invoking-python2.7-lp:835151-test failed")) + +(defun py-shell-invoking-jython-lp:835151-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"py-shell-name: jython\")")) + (py-bug-tests-intern 'py-shell-invoking-jython-lp:835151-base arg teststring))) + +(defun py-shell-invoking-jython-lp:835151-base () + (let ((py-shell-name "jython") + (sit-for 0.1)) + (assert (py-execute-buffer) nil "py-shell-invoking-jython-lp:835151-test failed"))) + +(defun py-shell-invoking-python3.2-lp:835151-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"py-shell-name: python3.2\")")) + (py-bug-tests-intern 'py-shell-invoking-python3.2-lp:835151-base arg teststring))) + +(defun py-shell-invoking-python3.2-lp:835151-base () + (setq py-shell-name "python3.2") + (assert (py-execute-buffer) nil "py-shell-invoking-python3.2-lp:835151-test failed")) + +(defun py-mark-block-clause-misbehave-lp:949310-test (&optional arg) + (interactive "p") + (let ((teststring " if foo: + try: + pass +")) + (py-bug-tests-intern 'py-mark-block-clause-misbehave-lp:949310-base arg teststring))) + +(defun py-mark-block-clause-misbehave-lp:949310-base () + (goto-char 15) + (assert (eq 14 (car (py-mark-block-or-clause))) nil "py-mark-block-clause-misbehave-lp:949310-test failed")) + +(defun py-mark-clause-misbehave-lp:949310-test (&optional arg) + (interactive "p") + (let ((teststring " if foo: + try: + pass +")) + (py-bug-tests-intern 'py-mark-clause-misbehave-lp:949310-base arg teststring))) + +(defun py-mark-clause-misbehave-lp:949310-base () + (goto-char 15) + (assert (eq 14 (car (py-mark-block-or-clause))) nil "py-mark-clause-misbehave-lp:949310-test failed")) + +(defun py-mark-block-misbehave-lp:949310-test (&optional arg) + (interactive "p") + (let ((teststring " if foo: + try: + pass +")) + (py-bug-tests-intern 'py-mark-block-misbehave-lp:949310-base arg teststring))) + +(defun py-mark-block-misbehave-lp:949310-base () + (goto-char 15) + (assert (eq 14 (car (py-mark-block-or-clause))) nil "py-mark-block-misbehave-lp:949310-test failed")) + +(defun py-indent-comments-nil-ignored-lp:958721-test (&optional arg) + (interactive "p") + (let (py-indent-comments + (teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +if x > 0: + for i in range(100): + # print(i) +"))) + (py-bug-tests-intern 'py-indent-comments-nil-ignored-lp:958721-base arg teststring))) + +(defun py-indent-comments-nil-ignored-lp:958721-base () + (goto-char 83) + (assert (eq 0 (py-compute-indentation)) nil "py-indent-comments-nil-ignored-lp:958721-test failed")) + +(defun broken-font-locking-lp:961231-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +def baz(): + foo = None + bar = False + baz = True + foo, bar, baz = baz() + return foo, bar, baz + +# None, False, and True get colored with font-lock-constant-face instead of py-pseudo-keyword-face + +# On the second to last line, \"foo\" \"bar\" and \"baz\" all get colored with font-lock-variable-name-face whereas +# I think they should get default face, just as they would if no comma or equal sign appeared on the line. + +def baz(mydict): + mydict['hello'] = 'baz' + + # 'mydict' gets colored with font-lock-variable-name-face but it should be default face. + +def baz(self): + self.baz = 'hello' + + # 'self' gets colored with font-lock-keyword-face instead of py-pseudo-keyword-face + +def baz(self): + return set(range(100)) + +# 'set' and 'range' get rendered in font-lock-builtin-face when they should get rendered in py-builtins-face + +print myobj.range() + +# the latter range should get default face + +"))) + (py-bug-tests-intern 'broken-font-locking-lp:961231-base arg teststring))) + +(defun broken-font-locking-lp:961231-base () + (font-lock-fontify-buffer) + (sit-for 0.1) + (goto-char 87) + (assert (eq (get-char-property (point) 'face) 'py-pseudo-keyword-face) nil "broken-font-locking-lp:961231-test #1 failed") + (goto-char 488) + (assert (eq (get-char-property (point) 'face) 'nil) nil "broken-font-locking-lp:961231-test #2 failed") + (goto-char 637) + (assert (eq (get-char-property (point) 'face) 'py-pseudo-keyword-face) nil "broken-font-locking-lp:961231-test #3 failed") + (goto-char 775) + (assert (eq (get-char-property (point) 'face) 'nil) nil "broken-font-locking-lp:961231-test #4 failed") + ;; (goto-char 911) + ;; (assert (eq (get-char-property (point) 'face) 'default) nil "broken-font-locking-lp:961231-test #4 failed") + + ) + +(defun regression-in-py-execute-region-lp:962227-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +def foo(): + def bar(): + return True + return bar + +# In the past it was possible to highlight the middle two lines and run py-execute-region. This would have +# the effect of defining bar() at global scope, but that's okay since it was explicitly asked for. Now +# however you get this error in the Python buffer: + +# >>> Traceback (most recent call last): +# File \"\", line 1, in +# File \"/tmp/Python4249aED.py\", line 8 +# return True +# ^ +# IndentationError: expected an indented block + +# which perhaps makes sense, but isn't helpful. What python-mode used to do was, if the block to be executed +# was indented, it would still a \"if True:\" line indented to column zero in front of the region to be +# executed. This is essentially a no-op that just makes the indented region valid syntactically. + +"))) + (py-bug-tests-intern 'regression-in-py-execute-region-lp:962227-base arg teststring))) + +(defun regression-in-py-execute-region-lp:962227-base () + (goto-char 59) + (push-mark) + (goto-char 93) + (assert (py-execute-region 59 93) nil "regression-in-py-execute-region-lp:962227-test failed")) + +(defun auto-indent-behaves-strangely-with-slices-lp:961684.txt-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +# In the final line of the following, I want the line not to be indented at +# all (the loop in the preceding lines is complete). But if you type a : +# after the 1 to form potential.difference(set(S[1]:)), this activates the +# automatic indentation and incorrectly indents the line under the +# preceding line in the for loop. +potential = set([]) +for j in X: + potential = potential.union(visible[j]) +potential = potential.difference(set(S[1])) + +# py-electric-colon-active-p is t. + +"))) + (py-bug-tests-intern 'auto-indent-behaves-strangely-with-slices-lp:961684.txt-base arg teststring))) + +(defun auto-indent-behaves-strangely-with-slices-lp:961684.txt-base () + (goto-char 40) + (assert (eq 0 (py-compute-indentation)) nil "auto-indent-behaves-strangely-with-slices-lp:961684.txt-test failed")) + +(defun tuple-unpacking-highlighted-incorrectly-lp:961496-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +foo, bar = toothpick +"))) + (py-bug-tests-intern 'tuple-unpacking-highlighted-incorrectly-lp:961496-base arg teststring))) + +(defun tuple-unpacking-highlighted-incorrectly-lp:961496-base () + (font-lock-fontify-buffer) + (sit-for 0.1) + (goto-char 50) + (assert (eq (get-char-property (point) 'face) 'py-variable-name-face) nil "tuple-unpacking-highlighted-incorrectly-lp:961496-test failed")) + +(defun script-buffer-appears-instead-of-python-shell-buffer-lp:957561-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +print(\"I'm the script-buffer-appears-instead-of-python-shell-buffer-lp:957561-test\") +"))) + (py-bug-tests-intern 'script-buffer-appears-instead-of-python-shell-buffer-lp:957561-base arg teststring))) + +(defun script-buffer-appears-instead-of-python-shell-buffer-lp:957561-base () + (let (py-shell-switch-buffers-on-execute-p + (py-split-windows-on-execute-p t)) + (delete-other-windows) + (ipython) + (sit-for 0.1) + (assert (and (py-execute-buffer-ipython) (set-buffer "script-buffer-appears-instead-of-python-shell-buffer-lp:957561-test") (not (window-full-height-p))) nil "script-buffer-appears-instead-of-python-shell-buffer-lp:957561-test failed"))) + +(defun new-problem-with-py-temp-directory-lp:965762-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +"))) + (py-bug-tests-intern 'new-problem-with-py-temp-directory-lp:965762-base arg teststring))) + +(defun new-problem-with-py-temp-directory-lp:965762-base () + (assert (stringp py-temp-directory) nil "new-problem-with-py-temp-directory-lp:965762-test failed")) + +(defun problem-with-py-separator-char-under-windows-lp:975539-test (&optional arg) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'problem-with-py-separator-char-under-windows-lp:975539-base arg teststring))) + +(defun problem-with-py-separator-char-under-windows-lp:975539-base () + (assert (string= (char-to-string py-separator-char) (py-separator-char)) nil "problem-with-py-separator-char-under-windows-lp:975539-test failed")) + +(defun another-broken-font-locking-lp:961231-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +# So while in this case, range() refers to the built-in function: + +print(range(10)) + +# in this case, it's just a method on some object: + +print(myobj.range(10)) + +# The two 'range's have no relationship at all. +# That's why I suggest that the former be colored with py-builtins-face but the latter by default face. + +"))) + (py-bug-tests-intern 'another-broken-font-locking-lp:961231-base arg teststring))) + +(defun another-broken-font-locking-lp:961231-base () + (font-lock-fontify-buffer) + (goto-char 124) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-builtins-face) nil "another-broken-font-locking-lp:961231-test failed") + (goto-char 197) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) nil) nil "another-broken-font-locking-lp:961231-test failed")) + +(defun temp-file-stored-in-python-script-directory-lp:958987-test (&optional arg) + (interactive "p") + (let ((teststring " +# -*- coding: utf-8 -*- +Richard Stanton (a-stanton) wrote on 2012-03-20: #5 + +> > 1) The directory is not being applied correctly. +> > +> +> need a recipe for it, a new report would help, as it's related only + +Actually, I think this is the original problem I was reporting. Any python script will do in my experience, +but the problem only occurs if the script file does \*not\* contain a shebang line. For example, the +following file works fine: + +-------- + +#!/usr/bin/python +print \"Hi, Richard\" + +--------- + +In this case, the temp file is created in the appropriate temp directory. + +However, if I use the same file without the shebang line, + +-------- + +print \"Hi, Richard\" + +--------- + +now the problem occurs. + +print \"Hi, Richard\" + +Richard Stanton (a-stanton) wrote 1 hour ago: #10 + +The problem is still there in certain situations, I'm afraid, with r918 on my Mac. Here are three +experiments. In numbers 1 and 2, things work as they're supposed to. In number 3, they don't: + +1) Script file = + +#!/usr/bin/ipython +print \"Hi, Richard\" + +In this case, the temp file is correctly stored in the temp directory as (for example) +/var/folders/zf/bgjm4tvs3wv_6q7_6z3b2nx00000gn/T/ipython61090CmR.py. The ipython buffer is called +\*IPython\*. + +2) Script file = + +print \"Hi, Richard\" + +py-shell-name = \"ipython\" + +In this case, the temp file is again correctly stored in the temp directory as (for example) +/var/folders/zf/bgjm4tvs3wv_6q7_6z3b2nx00000gn/T/ipython61090CmR.py. The ipython buffer is again named +\*IPython\* + +3) Script file = + +print \"Hi, Richard\" + +py-shell-name = \"/Library/Frameworks/EPD64.framework/Versions/7.2/bin/ipython\" + +In this case, the temp file is saved in the \*wrong\* location as +/Library/Frameworks/EPD64.framework/Versions/7.2/bin/ipython61090PwX.py. + +In this case, the ipython buffer is called \*ND 0.12\* + +")) + (py-bug-tests-intern 'temp-file-stored-in-python-script-directory-lp:958987-base arg teststring))) + +(defun temp-file-stored-in-python-script-directory-lp:958987-base () + (goto-char 40) + (assert nil "temp-file-stored-in-python-script-directory-lp:958987-test failed")) + +(defun temp-buffer-affected-by-py-shell-name-lp:958987-test (&optional arg) + (interactive "p") + (let* ((py-shell-name (concat (expand-file-name py-shell-name-testpath) "/ipython")) + (teststring (concat "#! " py-shell-name " +# -*- coding: utf-8 -*- +print(\"I'm the temp-buffer-affected-by-py-shell-name-lp:958987-test\") +"))) + (py-bug-tests-intern 'temp-buffer-affected-by-py-shell-name-lp:958987-base arg teststring))) + +(defun temp-buffer-affected-by-py-shell-name-lp:958987-base () + (message "%s" py-shell-name) + (assert (py-execute-buffer) nil "temp-buffer-affected-by-py-shell-name-lp:958987-test failed")) + +(defun toggle-force-local-shell-lp:988091-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-epd-shebang " +# -\*- coding: utf-8 -\*- +pri +impo +\"\"\" Am 25.04.2012 01:32, schrieb Yaroslav Halchenko: + +\[ ... ] + +another convenience might be to have an option 'follow' the desired shell -- i.e. if someone explicitly +asks for a buffer to execute it in ipython, that sets py-shell-name to ipython. +\"\"\" + +"))) + (if (and (boundp 'py-epd-shebang) + (stringp py-epd-shebang)) + (py-bug-tests-intern 'toggle-force-local-shell-lp:988091-base arg teststring) + (error "Please edit `py-epd-shebang' with your local EPD before running this test.")))) + +(defun toggle-force-local-shell-lp:988091-base () + (let ((old py-shell-name)) + (py-force-local-shell-on) + (goto-char 92) + (save-excursion (py-shell-complete)) + (message "%s" completion-at-point-functions) + (assert (looking-at "print") nil "toggle-force-local-shell-lp:988091-test #1 failed") + (force-py-shell-name-p-off) + (goto-char 99) + (save-excursion (py-shell-complete)) + (message "%s" completion-at-point-functions) + (assert (looking-at "import") nil "toggle-force-local-shell-lp:988091-test #1 failed") + )) + +(defun py-describe-symbol-fails-on-modules-lp:919719-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import os +os.chmod +")) + (py-bug-tests-intern 'py-describe-symbol-fails-on-modules-lp:919719-base arg teststring))) + +(defun py-describe-symbol-fails-on-modules-lp:919719-base () + (goto-char 61) + (py-help-at-point) + (sit-for 0.1) + (set-buffer "*Python-Help*") + (goto-char (point-min)) + (assert (looking-at "Help on built-in function chmod in os:") nil "py-describe-symbol-fails-on-modules-lp:919719-test failed")) + +(defun indent-region-lp:997958-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +with file(\"foo\" + zeit + \".ending\", 'w') as datei: +for i in range(anzahl): +bar.dosomething() +datei.write(str(baz[i]) + \"\\n\") +")) + (py-bug-tests-intern 'indent-region-lp:997958-base arg teststring))) + +(defun indent-region-lp:997958-base () + (py-indent-region 48 172) + (goto-char 99) + (back-to-indentation) + (assert (eq 4 (current-column)) nil "indent-region-lp:997958-test #1 failed") + (goto-char 127) + (back-to-indentation) + (assert (eq 8 (current-column)) nil "indent-region-lp:997958-test #2 failed")) + +(defun pycomplete-same-folder-def-lp:889052-test (&optional arg) + (interactive "p") + (save-excursion + (set-buffer (get-buffer-create "somedef.py")) + (switch-to-buffer (current-buffer)) + (erase-buffer) + (insert "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +def someDef(): + print(\"I'm someDef\") +") + (write-file (concat (py-normalize-directory py-temp-directory) "somedef.py"))) + + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +from somedef import * +someDe +")) + (py-bug-tests-intern 'pycomplete-same-folder-def-lp:889052-base arg teststring t))) + +(defun pycomplete-same-folder-def-lp:889052-base () + (write-file (concat (py-normalize-directory py-temp-directory) "samefolder.py")) + (goto-char 76) + (py-complete) + (beginning-of-line) + (assert (looking-at "someDef") nil "pycomplete-same-folder-def-lp:889052-test failed")) + +(defun pycomplete-same-folder-class-lp:889052-test (&optional arg) + (interactive "p") + (save-excursion + (set-buffer (get-buffer-create "somedef.py")) + (switch-to-buffer (current-buffer)) + (erase-buffer) + (insert "#! /usr/bin/env python +# -*- coding: utf-8 -*- +class Blah(): + def someDef(): + print(\"I'm someDef\") +") + ;; (write-file (concat (py-normalize-directory py-temp-directory) "classblah.py"))) + ;; as completion is already in $PYTHONPATH + (write-file (concat (expand-file-name (py-normalize-directory py-install-directory)) "completion" "/" "classblah.py")) + (set-buffer-modified-p 'nil) + (kill-buffer (current-buffer))) + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +from classblah import * +CLASS_INS = Blah() +CLASS_INS.someDe +")) + (py-bug-tests-intern 'pycomplete-same-folder-class-lp:889052-base arg teststring))) + +(defun pycomplete-same-folder-class-lp:889052-base () + (let ( +(testfile1 (concat (expand-file-name (py-normalize-directory py-install-directory)) "completion" "/" "classblah.py")) + (testfile2 (concat (expand-file-name (py-normalize-directory py-install-directory)) "completion" "/" "somedef.py")) + py-no-completion-calls-dabbrev-expand-p + py-indent-no-completion-p) + (write-file testfile2) + (goto-char 107) + (unwind-protect + (py-shell-complete) + (beginning-of-line)) + (when (file-readable-p testfile1) (delete-file testfile1)) + (when (file-readable-p testfile2) (delete-file testfile2))) + (assert (looking-at "CLASS_INS.someDef") "pycomplete-same-folder-class-lp:889052-test failed")) + +(defun shebang-interpreter-not-detected-lp:1001327-test (&optional arg) + (interactive "p") + (let ((teststring "#!/usr/bin/python +")) + (py-bug-tests-intern 'shebang-interpreter-not-detected-lp:1001327-base arg teststring))) + +(defun shebang-interpreter-not-detected-lp:1001327-base () + (assert (string= "/usr/bin/python" (py-choose-shell)) nil "shebang-interpreter-not-detected-lp:1001327-test failed")) + +(defun no-completion-at-all-lp:1001328-test (&optional arg) + (interactive "p") + (let ((teststring "#!/usr/bin/python +basdklfjasdf = 3 +basd +")) + (py-bug-tests-intern 'no-completion-at-all-lp:1001328-base arg teststring))) + +(defun no-completion-at-all-lp:1001328-base () + (goto-char 40) + (py-shell-complete) + (beginning-of-line) + (sit-for 0.1) + (unless (looking-at "basdklfjasdf") + + (py-shell-complete)) + (sit-for 0.1) + (assert (looking-at "basdklfjasdf") nil "no-completion-at-all-lp:1001328-test failed")) + +(defun not-that-useful-completion-lp:1003580-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import numpy +def test_bu(): + numpy. +")) + (py-bug-tests-intern 'not-that-useful-completion-lp:1003580-base arg teststring))) + +(defun not-that-useful-completion-lp:1003580-base () + (goto-char 86) + (py-shell-complete nil t) + (assert (string-match "^numpy." (car py-shell-complete-debug)) nil "not-that-useful-completion-lp:1003580-test failed")) + +(defun completion-fails-in-python-script-r989-lp:1004613-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env ipython +# -*- coding: utf-8 -*- +ex +")) + (py-bug-tests-intern 'completion-fails-in-python-script-r989-lp:1004613-base arg teststring))) + +(defun completion-fails-in-python-script-r989-lp:1004613-base () + (when (buffer-live-p (get-buffer py-python-completions)) + (kill-buffer py-python-completions)) + (goto-char 51) + (ipython-complete nil nil nil nil nil nil t) + (set-buffer "*IPython Completions*") + (assert (search-forward "except") nil "completion-fails-in-python-script-r989-lp:1004613-test failed")) + +(defun spurious-trailing-whitespace-lp-1008679-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(): X +")) + (py-bug-tests-intern 'spurious-trailing-whitespace-lp-1008679-base arg teststring))) + +(defun spurious-trailing-whitespace-lp-1008679-base () + (let ((py-trailing-whitespace-smart-delete-p t)) + (goto-char 66) + (py-newline-and-indent) + (forward-line -1) + (end-of-line) + (assert (eq (point) 58) nil "spurious-trailing-whitespace-lp-1008679-test failed"))) + +(defun empty-triple-quote-lp:1009318-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +\"\"\"\"\"\" +'''''' +")) + (py-bug-tests-intern 'empty-triple-quote-lp:1009318-base arg teststring))) + +(defun empty-triple-quote-lp:1009318-base () + (goto-char 54) + (assert (not (nth 4 (syntax-ppss))) nil "empty-triple-quote-lp:1009318-test #1 failed") + (goto-char 61) + (assert (not (nth 4 (syntax-ppss))) nil "empty-triple-quote-lp:1009318-test #2 failed")) + +(defun completion-at-gentoo-lp-1008842-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import re +re.s +")) + (py-bug-tests-intern 'completion-at-gentoo-lp-1008842-base arg teststring))) + +(defun completion-at-gentoo-lp-1008842-base () + (goto-char 62) + (py-shell-complete) + (sit-for 0.1) + (assert (buffer-live-p (get-buffer py-python-completions)) nil "completion-at-gentoo-lp-1008842-test failed")) + +(defun converts-tabs-to-spaces-in-indent-tabs-mode-t-lp-1019128-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +setup( + name = \"fail2ban\", +")) + (py-bug-tests-intern 'converts-tabs-to-spaces-in-indent-tabs-mode-t-lp-1019128-base arg teststring))) + +(defun converts-tabs-to-spaces-in-indent-tabs-mode-t-lp-1019128-base () + (let ((indent-tabs-mode t)) + (goto-char 74) + (py-newline-and-indent) + (beginning-of-line)) + (assert (looking-at "\t") nil "converts-tabs-to-spaces-in-indent-tabs-mode-t-lp-1019128-test failed")) + +(defun return-statement-indented-incorrectly-lp-1019601-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(): + while True: + bar() + baz() + return 1 +")) + (py-bug-tests-intern 'return-statement-indented-incorrectly-lp-1019601-base arg teststring))) + +(defun return-statement-indented-incorrectly-lp-1019601-base () + (goto-char 99) + (assert (eq 4 (py-compute-indentation)) nil "return-statement-indented-incorrectly-lp-1019601-test failed")) + +(defun pycomplete-imports-not-found-error-when-no-symbol-lp:1019791-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +from PyQt4.QtGui import QMainWindow +")) + (py-bug-tests-intern 'pycomplete-imports-not-found-error-when-no-symbol-lp:1019791-base arg teststring))) + +(defun pycomplete-imports-not-found-error-when-no-symbol-lp:1019791-base () + (assert (py-find-imports) nil "pycomplete-imports-not-found-error-when-no-symbol-lp:1019791-test failed")) + +(defun py-narrow-to-defun-lp-1020531-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def usage(): + print \"\"\"Fehler: %s +Es muß die aufzurufende Ziehungszahl als Argument angegeben werden: +'python roulette.py 1, 'python roulette.py 2', ... 'python roulette.py n'. +\"\"\" % ( + os.path.basename(sys.argv[0])) + +def main(): + if len(sys.argv) == 1: + usage() + sys.exit() + + class asdf(object): + zeit = time.strftime('%Y%m%d--%H-%M-%S') + + def utf8_exists(filename): + return os.path.exists(filename.encode('utf-8')) + +if __name__ == \"__main__\": + main() + +")) + (py-bug-tests-intern 'py-narrow-to-defun-lp-1020531-base arg teststring))) + +(defun py-narrow-to-defun-lp-1020531-base () + (goto-char 334) + (py-narrow-to-defun) + (assert (eq 521 (point-max)) nil "py-narrow-to-defun-lp-1020531-test failed")) + +(defun py-find-imports-lp-1023236-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +############################################################################# +# +# Import test +# +############################################################################# + +import urllib +import os, sys +from hashlib import md5 + +from construct import Container +from twisted.internet import reactor, defer +from twisted.internet.protocol import ClientFactory +from twisted.python import log, failure, filepath + +from mock import mock1, mock2, \\ + mock3, mock4 +print \"ignored\" + +print \"ignored\" + +def something(): + pass + +")) + (py-bug-tests-intern 'py-find-imports-lp-1023236-base arg teststring))) + +(defun py-find-imports-lp-1023236-base () + (goto-char 334) + (assert (equal (py-find-imports) "import urllib;import os, sys;from hashlib import md5;from construct import Container;from twisted.internet import reactor, defer;from twisted.internet.protocol import ClientFactory;from twisted.python import log, failure, filepath;from mock import mock1, mock2, mock3, mock4;") nil "py-find-imports-lp-1023236-test failed")) + +(defun py-guess-indent-offset-dont-detect-indent-of-2-lp-1027389-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +for something: + for other: + if hello: + while x: + statement1 +")) + (py-bug-tests-intern 'py-guess-indent-offset-dont-detect-indent-of-2-lp-1027389-base arg teststring))) + +(defun py-guess-indent-offset-dont-detect-indent-of-2-lp-1027389-base () + (goto-char 109) + (assert (eq 2 (py-guess-indent-offset)) nil "py-guess-indent-offset-dont-detect-indent-of-2-lp-1027389-test failed")) + +(defun complaint-about-non-ASCII-character-lp-1042949-test (&optional arg) + (interactive "p") + (let ((teststring "# -*- coding: utf-8 -*- + +# 11–14 +")) + (py-bug-tests-intern 'complaint-about-non-ASCII-character-lp-1042949-base arg teststring))) + +(defun complaint-about-non-ASCII-character-lp-1042949-base () + (sit-for 0.1) + (assert (py-execute-buffer) nil "complaint-about-non-ASCII-character-lp-1042949-test failed")) + +(defun dont-indent-code-unnecessarily-lp-1048778-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(a): + if a == 1: + return 1 + elif a == 2: + if a < 7: + return 3 + elif a == 3 +")) + (py-bug-tests-intern 'dont-indent-code-unnecessarily-lp-1048778-base arg teststring))) + +(defun dont-indent-code-unnecessarily-lp-1048778-base () + (goto-char 163) + (py-electric-colon 1) + (assert (eq 4 (current-indentation)) nil "dont-indent-code-unnecessarily-lp-1048778-test failed")) + +(defun IndentationError-expected-an-indented-block-when-execute-lp-1055569-test (&optional arg) + (interactive "p") + (let ((teststring "if __name__ == '__main__': + print('IndentationError-expected-an-indented-block-when-execute-lp-1055569-test') +")) + (py-bug-tests-intern 'IndentationError-expected-an-indented-block-when-execute-lp-1055569-base 1 teststring))) + +(defun IndentationError-expected-an-indented-block-when-execute-lp-1055569-base () + (assert + (string= "IndentationError-expected-an-indented-block-when-execute-lp-1055569-test" (py-execute-buffer)) + ;; (progn (py-execute-buffer) t) + nil "IndentationError-expected-an-indented-block-when-execute-lp-1055569-test failed")) + +(defun stalls-emacs-probably-due-to-syntax-highlighting-lp-1058261-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +class Parallel(Logger): + ''' Helper class for readable parallel mapping. + + Parameters + ----------- + n_jobs: int + The number of jobs to use for the computation. If -1 all CPUs + are used. If 1 is given, no parallel computing code is used + at all, which is useful for debuging. For n_jobs below -1, + (n_cpus + 1 - n_jobs) are used. Thus for n_jobs = -2, all + CPUs but one are used. + verbose: int, optional + The verbosity level: if non zero, progress messages are + printed. Above 50, the output is sent to stdout. + The frequency of the messages increases with the verbosity level. + If it more than 10, all iterations are reported. + pre_dispatch: {'all', integer, or expression, as in '3\*n_jobs'} + The amount of jobs to be pre-dispatched. Default is 'all', + but it may be memory consuming, for instance if each job + involves a lot of a data. + + Notes + ----- + + This object uses the multiprocessing module to compute in + parallel the application of a function to many different + arguments. The main functionality it brings in addition to + using the raw multiprocessing API are (see examples for details): + + \* More readable code, in particular since it avoids + constructing list of arguments. + + \* Easier debuging: + - informative tracebacks even when the error happens on + the client side + - using 'n_jobs=1' enables to turn off parallel computing + for debuging without changing the codepath + - early capture of pickling errors + + \* An optional progress meter. + + \* Interruption of multiprocesses jobs with 'Ctrl-C' + + Examples + -------- + + A simple example: + + >>> from math import sqrt + >>> from joblib import Parallel, delayed + >>> Parallel(n_jobs=1)(delayed(sqrt)(i\*\*2) for i in range(10)) + [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] + + Reshaping the output when the function has several return + values: + + >>> from math import modf + >>> from joblib import Parallel, delayed + >>> r = Parallel(n_jobs=1)(delayed(modf)(i/2.) for i in range(10)) + >>> res, i = zip(\*r) + >>> res + (0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5) + >>> i + (0.0, 0.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0) + + The progress meter: the higher the value of `verbose`, the more + messages:: + + >>> from time import sleep + >>> from joblib import Parallel, delayed + >>> r = Parallel(n_jobs=2, verbose=5)(delayed(sleep)(.1) for _ in range(10)) #doctest: +SKIP + [Parallel(n_jobs=2)]: Done 1 out of 10 | elapsed: 0.1s remaining: 0.9s + [Parallel(n_jobs=2)]: Done 3 out of 10 | elapsed: 0.2s remaining: 0.5s + [Parallel(n_jobs=2)]: Done 6 out of 10 | elapsed: 0.3s remaining: 0.2s + [Parallel(n_jobs=2)]: Done 9 out of 10 | elapsed: 0.5s remaining: 0.1s + [Parallel(n_jobs=2)]: Done 10 out of 10 | elapsed: 0.5s finished + + Traceback example, note how the line of the error is indicated + as well as the values of the parameter passed to the function that + triggered the exception, even though the traceback happens in the + child process:: + + >>> from string import atoi + >>> from joblib import Parallel, delayed + >>> Parallel(n_jobs=2)(delayed(atoi)(n) for n in ('1', '300', 30)) #doctest: +SKIP + #... + --------------------------------------------------------------------------- + Sub-process traceback: + --------------------------------------------------------------------------- + TypeError Fri Jul 2 20:32:05 2010 + PID: 4151 Python 2.6.5: /usr/bin/python + ........................................................................... + /usr/lib/python2.6/string.pyc in atoi(s=30, base=10) + 398 is chosen from the leading characters of s, 0 for octal, 0x or + 399 0X for hexadecimal. If base is 16, a preceding 0x or 0X is + 400 accepted. + 401 + 402 \"\"\" + --> 403 return _int(s, base) + 404 + 405 + 406 # Convert string to long integer + 407 def atol(s, base=10): + + TypeError: int() can't convert non-string with explicit base + ___________________________________________________________________________ + + Using pre_dispatch in a producer/consumer situation, where the + data is generated on the fly. Note how the producer is first + called a 3 times before the parallel loop is initiated, and then + called to generate new data on the fly. In this case the total + number of iterations cannot be reported in the progress messages:: + + >>> from math import sqrt + >>> from joblib import Parallel, delayed + + >>> def producer(): + ... for i in range(6): + ... print 'Produced %s' % i + ... yield i + + >>> out = Parallel(n_jobs=2, verbose=100, pre_dispatch='1.5\*n_jobs')( + ... delayed(sqrt)(i) for i in producer()) #doctest: +SKIP + Produced 0 + Produced 1 + Produced 2 + [Parallel(n_jobs=2)]: Done 1 jobs | elapsed: 0.0s + Produced 3 + [Parallel(n_jobs=2)]: Done 2 jobs | elapsed: 0.0s + Produced 4 + [Parallel(n_jobs=2)]: Done 3 jobs | elapsed: 0.0s + Produced 5 + [Parallel(n_jobs=2)]: Done 4 jobs | elapsed: 0.0s + [Parallel(n_jobs=2)]: Done 5 out of 6 | elapsed: 0.0s remaining: 0.0s + [Parallel(n_jobs=2)]: Done 6 out of 6 | elapsed: 0.0s finished + ''' + def __init__(self, n_jobs=1, verbose=0, pre_dispatch='all'): + self.verbose = verbose + self.n_jobs = n_jobs + self.pre_dispatch = pre_dispatch + self._pool = None + # Not starting the pool in the __init__ is a design decision, to be + # able to close it ASAP, and not burden the user with closing it. + self._output = None + self._jobs = list() + + def dispatch(self, func, args, kwargs): + \"\"\" Queue the function for computing, with or without multiprocessing + \"\"\" + if self._pool is None: + job = ImmediateApply(func, args, kwargs) + index = len(self._jobs) + if not _verbosity_filter(index, self.verbose): + self._print('Done %3i jobs | elapsed: %s', + (index + 1, + short_format_time(time.time() - self._start_time) + )) + self._jobs.append(job) + self.n_dispatched += 1 + else: + self._lock.acquire() + # If job.get() catches an exception, it closes the queue: + try: + job = self._pool.apply_async(SafeFunction(func), args, + kwargs, callback=CallBack(self.n_dispatched, self)) + self._jobs.append(job) + self.n_dispatched += 1 + except AssertionError: + print '[Parallel] Pool seems closed' + finally: + self._lock.release() + + def dispatch_next(self): + \"\"\" Dispatch more data for parallel processing + \"\"\" + self._dispatch_amount += 1 + while self._dispatch_amount: + try: + # XXX: possible race condition shuffling the order of + # dispatchs in the next two lines. + func, args, kwargs = self._iterable.next() + self.dispatch(func, args, kwargs) + self._dispatch_amount -= 1 + except ValueError: + \"\"\" Race condition in accessing a generator, we skip, + the dispatch will be done later. + \"\"\" + except StopIteration: + self._iterable = None + return + + def _print(self, msg, msg_args): + \"\"\" Display the message on stout or stderr depending on verbosity + \"\"\" + # XXX: Not using the logger framework: need to + # learn to use logger better. + if not self.verbose: + return + if self.verbose < 50: + writer = sys.stderr.write + else: + writer = sys.stdout.write + msg = msg % msg_args + writer('[%s]: %s\\n' % (self, msg)) + + def print_progress(self, index): + \"\"\"Display the process of the parallel execution only a fraction + of time, controled by self.verbose. + \"\"\" + if not self.verbose: + return + elapsed_time = time.time() - self._start_time + + # This is heuristic code to print only 'verbose' times a messages + # The challenge is that we may not know the queue length + if self._iterable: + if _verbosity_filter(index, self.verbose): + return + self._print('Done %3i jobs | elapsed: %s', + (index + 1, + short_format_time(elapsed_time), + )) + else: + # We are finished dispatching + queue_length = self.n_dispatched + # We always display the first loop + if not index == 0: + # Display depending on the number of remaining items + # A message as soon as we finish dispatching, cursor is 0 + cursor = (queue_length - index + 1 + - self._pre_dispatch_amount) + frequency = (queue_length // self.verbose) + 1 + is_last_item = (index + 1 == queue_length) + if (is_last_item or cursor % frequency): + return + remaining_time = (elapsed_time / (index + 1) \* + (self.n_dispatched - index - 1.)) + self._print('Done %3i out of %3i | elapsed: %s remaining: %s', + (index + 1, + queue_length, + short_format_time(elapsed_time), + short_format_time(remaining_time), + )) + + def retrieve(self): + self._output = list() + while self._jobs: + # We need to be careful: the job queue can be filling up as + # we empty it + if hasattr(self, '_lock'): + self._lock.acquire() + job = self._jobs.pop(0) + if hasattr(self, '_lock'): + self._lock.release() + try: + self._output.append(job.get()) + except tuple(self.exceptions), exception: + if isinstance(exception, + (KeyboardInterrupt, WorkerInterrupt)): + # We have captured a user interruption, clean up + # everything + if hasattr(self, '_pool'): + self._pool.close() + self._pool.terminate() + raise exception + elif isinstance(exception, TransportableException): + # Capture exception to add information on the local stack + # in addition to the distant stack + this_report = format_outer_frames(context=10, + stack_start=1) + report = \"\"\"Multiprocessing exception: +%s +--------------------------------------------------------------------------- +Sub-process traceback: +--------------------------------------------------------------------------- +%s\"\"\" % ( + this_report, + exception.message, + ) + # Convert this to a JoblibException + exception_type = _mk_exception(exception.etype)[0] + raise exception_type(report) + raise exception + + def __call__(self, iterable): + if self._jobs: + raise ValueError('This Parallel instance is already running') + n_jobs = self.n_jobs + if n_jobs < 0 and multiprocessing is not None: + n_jobs = max(multiprocessing.cpu_count() + 1 + n_jobs, 1) + + # The list of exceptions that we will capture + self.exceptions = [TransportableException] + if n_jobs is None or multiprocessing is None or n_jobs == 1: + n_jobs = 1 + self._pool = None + else: + if multiprocessing.current_process()._daemonic: + # Daemonic processes cannot have children + n_jobs = 1 + self._pool = None + warnings.warn( + 'Parallel loops cannot be nested, setting n_jobs=1', + stacklevel=2) + else: + self._pool = multiprocessing.Pool(n_jobs) + self._lock = threading.Lock() + # We are using multiprocessing, we also want to capture + # KeyboardInterrupts + self.exceptions.extend([KeyboardInterrupt, WorkerInterrupt]) + + if self.pre_dispatch == 'all' or n_jobs == 1: + self._iterable = None + self._pre_dispatch_amount = 0 + else: + self._iterable = iterable + self._dispatch_amount = 0 + pre_dispatch = self.pre_dispatch + if hasattr(pre_dispatch, 'endswith'): + pre_dispatch = eval(pre_dispatch) + self._pre_dispatch_amount = pre_dispatch = int(pre_dispatch) + iterable = itertools.islice(iterable, pre_dispatch) + + self._start_time = time.time() + self.n_dispatched = 0 + try: + for function, args, kwargs in iterable: + self.dispatch(function, args, kwargs) + + self.retrieve() + # Make sure that we get a last message telling us we are done + elapsed_time = time.time() - self._start_time + self._print('Done %3i out of %3i | elapsed: %s finished', + (len(self._output), + len(self._output), + short_format_time(elapsed_time) + )) + + finally: + if n_jobs > 1: + self._pool.close() + self._pool.join() + self._jobs = list() + output = self._output + self._output = None + return output + + def __repr__(self): + return '%s(n_jobs=%s)' % (self.__class__.__name__, self.n_jobs) + +")) + (py-bug-tests-intern 'stalls-emacs-probably-due-to-syntax-highlighting-lp-1058261-base arg teststring))) + +(defun stalls-emacs-probably-due-to-syntax-highlighting-lp-1058261-base () + (switch-to-buffer (current-buffer)) + (goto-char 6184) + (while (not (bobp)) + (forward-line -1) + (end-of-line) + ;; (when (interactive-p) (sit-for 0.1)) + (beginning-of-line)) + (assert (bobp) nil "stalls-emacs-probably-due-to-syntax-highlighting-lp-1058261-test failed")) + +(defun pyindex-mishandles-class-definitions-lp-1018164-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import sys +import io +import subprocess +import re +import copy +import pickle +import textwrap +import datetime +import util +import cldef +import datatypes +from themes.thutil import lisp, fontNames, Color, emacsPosition + +############################################################################### +version = 3 + +############################################################################### +# used to raise a type error if a call is made with incorrect arguments +def _emptyParametersCheck(): pass + +############################################################################### +class Font(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + __cldef.slots(\"__fontStr\") + __cldef.fields(\"weight slant width height pointSize size face\") + __cldef.field(\"mapKey\", initfunc=lambda f:(f.size,f.weight,f.slant)) + __cldef.field(\"sortKey\", initfunc=lambda f:(f.width,f.height)) + + ########################################################################### + __parseFontStrRE = __cldef.constant(re.compile( + r'-outline-Courier New-(?Pbold|normal)'\\ + r'-(?Pi|r)-normal-normal' \\ + r'-(?P\\d+)-(?P\\d+)-\\d+-\\d+-c-(?P\\d+)-iso10646-1')) + + ########################################################################### + def __init__(self, fontStr): + self.__fontStr = fontStr + match = self.__parseFontStrRE.match(fontStr) + self.weight = match.group('weight') + self.slant = 'italic' if match.group('slant') == 'i' else 'regular' + self.width = int(match.group('width'))//10 + self.height = int(match.group('height')) + self.pointSize = (int(match.group('size')) + 5)//10 + self.size = \"%sx%s\" % (self.__width, self.__height) + self.face = \"Courier New\" + + ########################################################################### + def __str__(self): return self.__fontStr + + ########################################################################### + def qt(self): + if 'QtGui' not in globals(): + global QtGui + from PyQt4 import QtGui + font = QtGui.QFont(self.face, self.pointSize) + font.setItalic(self.slant == 'italic') + font.setBold(self.weight == 'bold') + return font + +############################################################################### +class FontAttrs(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + mapKey = property(lambda self: (self.size, self.weight, self.slant)) + + ########################################################################### + class FontAttrs(__cldef.FieldClass): + access, fields = 'rw', \"fontSize fontWeight fontSlant\" + def sethook(obj, fieldName, value): + value = str(value) + if value in obj.fontOptions(fieldName): + return value + raise ValueError(\"%s invalid value for %s\"%(value, fieldName)) + + ########################################################################### + attrNames = __cldef.constant(frozenset(FontAttrs.fields.split())) + + ########################################################################### + class FontAttrAbbrevs(__cldef.FieldClass): + access, fields = 'rw', tuple(\"size weight slant\".split()) + def fget(obj): pass + def gethook(obj,name,\*p): + return getattr(obj, 'font'+name.capitalize()) + def fset(obj,val): pass + def sethook(obj,name,val,\*p): + setattr(obj, 'font'+name.capitalize(), val) + + ########################################################################### + def __init__(self, size='8x13', weight='bold', slant='regular'): + self.__initAttrs(\*\*locals()) + + ########################################################################### + def font(): + # font options contain the valid values for each font attr + _fontOptions = {'weight':('normal','bold'), + 'slant':('regular','italic')} + + # Get the list of font names from thutil and create the font lookup + # dict. It is assumed that the weight and slant are not specified, + # so will fill in the \"typical\" options here. + _fontMap = dict() + for fontStr in fontNames(): + for weight in ('normal', 'bold'): + for slant in ('r', 'i'): + font = Font(fontStr.replace(\"\*-\*\", weight+'-'+slant)) + _fontMap[font.mapKey] = font + + # getFont: use the fontAttrSize, fontWeight and fontSize attrs + # to lookup the font in _fontMap + def getFont(self): return _fontMap[self.mapKey] + + # scan all the values of _fontMap an garther all fontSize options + _fontSizes = set(f.size for f in _fontMap.values()) + def fontSizeSortKey(size): + return tuple(int(i) for i in size.split('x')) + _fontOptions['size'] = tuple(sorted(_fontSizes, key=fontSizeSortKey)) + + #provide a function to query the fontoptions + def fontOptions(attrName): + attrName = attrName.lower() + if attrName.startswith('font'): + attrName = attrName[len('font'):] + return _fontOptions[attrName] + + return property(fget=getFont), staticmethod(fontOptions) + font, fontOptions = font() + +############################################################################### +class ColorAttrs(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + attrNames = \"foregroundColor backgroundColor cursorColor\".split() + attrNames = __cldef.constant(tuple(attrNames)) + __cldef.fields(attrNames.val, 'rw', sethook=Color) + + ########################################################################### + def __init__(self, backgroundColor=\"grey13\", foregroundColor='navajowhite', + cursorColor=None): + self.backgroundColor = backgroundColor + self.foregroundColor = foregroundColor + self.cursorColor = self.getColor_i(cursorColor,\"light green\", \"black\") + + ########################################################################### + def getColor_i(self, val, forDark, forLight): + if val is None: + val = forDark if self.backgroundColor.isDark() else forLight + return Color(val) + +############################################################################### +class Face(object, metaclass=cldef.metaClass): + ########################################################################### + __cldef = cldef.metaClass.wrapclass(privAttrAccess=True) + unspecified = __cldef.constant(None) + __cldef.fields('name theme') + __cldef.fields('inherit', access='rw', + sethook=lambda obj,val: obj.setInheritHook_i(val)) + + ########################################################################### + class FontAttrs(__cldef.FieldClass): + access, fields = 'rw', (\"bold\",\"italic\",\"underline\",\"raised\") + sethook = lambda val: val if val is None else bool(val) + gethook = lambda obj,attr,val: obj.getAttrHook_i(attr, val) + + ########################################################################### + class ColorAttrs(__cldef.FieldClass): + access, fields = 'rw', (\"foreground\", \"background\") + sethook = lambda val: val if val is None else Color(val) + gethook = lambda obj,attr,val: obj.getAttrHook_i(attr, val) + + ########################################################################### + fontAttrs, colorAttrs, faceAttrs = __cldef.constants( + frozenset(FontAttrs.fields), + frozenset(ColorAttrs.fields), + frozenset(FontAttrs.fields + ColorAttrs.fields + ('inherit',))) + + ########################################################################### + def __init__(self, name, theme, \*\*opts): + self.name, self.theme = name, theme + for attr in self.faceAttrs: + self.__setPrivAttr(attr,None) + for attr,val in opts.items(): + setattr(self, attr, val) + + ########################################################################### + def __str__(self): + return self.setFaceSexpr() + + ########################################################################### + def copy(self): + copy = self.__class__(self.name, self.theme) + for attr in self.faceAttrs: + copy.__setPrivAttr(attr, self.__getPrivAttr(attr)) + return copy + + ########################################################################### + def __eq__(self, peer): + if not isinstance(peer, Face): + return NotImplemented + getSelf, getPeer = self.__getPrivAttr, peer.__getPrivAttr + return (self.name == peer.name and + self.faceAttrs == peer.faceAttrs and + all(getSelf(a) == getPeer(a) for a in self.faceAttrs)) + + ########################################################################### + def __neq__(self, peer): + return not(self == peer) + + ########################################################################### + def reset(self, peer): + for attr in self.faceAttrs: + self.__setPrivAttr(attr, peer.__getPrivAttr(attr)) + + ########################################################################### + def isSet(self, attr): + return self.__getPrivAttr(attr) is not None + + ########################################################################### + def getPeer(self, peerName): + if peerName in (None, 'default'): + return self.theme.defaultFace + return self.theme.facesAttrs[peerName] + + ########################################################################### + def inheritOrder(self): + return (self.name, ) + self.getPeer(self.inherit).inheritOrder() + + ########################################################################### + def derivesFrom(self, peer): + return self.theme == peer.theme and peer.name in self.inheritOrder() + + ########################################################################### + def getSource(self, attr): + return self if self.isSet(attr) else \\ + self.getPeer(self.inherit).getSource(attr) + + ########################################################################### + def getAttrHook_i(self, attr, val): + return val if val is not None \\ + else getattr(self.getPeer(self.inherit), attr) + + ########################################################################### + def setInheritHook_i(self, val): + if val in (None, 'default'): + return None + if isinstance(val, str): + theme = self.theme + if not(hasattr(theme, 'faceAttrs')) or val in theme.faceAttrs: + return val + raise ValueError(\"Invalid inherit value=%s\" % val) + + ########################################################################### + def getLispValue(self, attr, mapBool=('nil','t')): + val = self.__getPrivAttr(attr) + if val is None: + return \"'unspecified\" + if isinstance(val, bool): + return mapBool[int(val)] + if isinstance(val, str): + return \"'%s\" % val + if isinstance(val, Color): + return '\"%s\"' % (val,) + raise ValueError(\"getLispValue(%s): Invalid attr val=%s\" % (attr,val)) + + ########################################################################### + def setFaceSexpr(self, parms=\"\"): + isSet, lispVal = self.isSet, self.getLispValue + # add inhert attr + if isSet('inherit'): + parms += ' :inherit %s' % lispVal('inherit') + + # add foreground, background color attrs if attr is set + for attr in filter(isSet, self.colorAttrs): + parms += ' :%s %s' % (attr, lispVal(attr)) + + # add bold attr + if isSet('bold'): + parms += ' :weight %s' % lispVal('bold', (\"'normal\", \"'bold\")) + + # add italic attr + if isSet('italic'): + parms += ' :slant %s' % lispVal('italic', (\"'normal\", \"'italic\")) + + # add underline attr + if isSet('underline'): + parms += ' :underline %s' % lispVal('underline') + + # add raised attr + if isSet('raised'): + val = lispVal('raised') + if val == 't': + val = '(:line-width 2 :color \"%s\" :style released-button)' % \\ + self.foreground.blend(self.background) + parms += ' :box %s' % val + + # make func call to set face in emacs + return \"(themes-set-face '%s %s)\" % (self.name, parms) + +############################################################################### +class DefaultFace(Face, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + inherit, underline, raised = __cldef.constants(None, False, False) + ########################################################################### + def __init__(self, theme): + self.__super.__init__(\"default\", theme) + + ########################################################################### + bold = property(lambda self: self.theme.font.weight == 'bold') + italic = property(lambda self: self.theme.font.slant == 'italic') + foreground = property(lambda self: self.theme.foregroundColor) + background = property(lambda self: self.theme.backgroundColor) + + ########################################################################### + def setFaceSexpr(self): + return '(themes-set-defaults \"%s\" \"%s\" \"%s\")' % \\ + (self.foreground, self.background, self.theme.font) + + ########################################################################### + def isSet(self, attr): + return True + + ########################################################################### + def inheritOrder(self): + return (self.name,) + +############################################################################### +class FacesAttrs(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + __cldef.slots(\"__faceMap __faces\") + __cldef.field(\"theme\") + + ########################################################################### + def __init__(self, theme, facesAttrs=None): + self.theme, self.__faceMap, self.__faces = theme, {}, [] + if facesAttrs is None: + facesAttrs = self.loadFacesFromEmacs_i() + for faceAttrs in facesAttrs: + face = Face(theme=theme, \*\*faceAttrs) + if self.__faceMap.setdefault(face.name, face) is not face: + raise KeyError(\"Face name %r is not unique\" % face.name) + self.__faces.append(face) + for face in self.__faces: + if face.inherit is not None: + assert face.inherit in self.__faceMap + + ########################################################################### + def copy(self): + copy = self.__class__.__new__(self.__class__) + copy.theme = self.theme + copy.__faces = [f.copy() for f in self.__faces] + copy.__faceMap = dict((f.name,f) for f in copy.__faces) + return copy + + ########################################################################### + def reset(self, peer): + self.__faces = [f.copy() for f in peer.__faces] + self.__faceMap = dict((f.name,f) for f in self.__faces) + + ########################################################################### + def __len__(self): + return len(self.__faceMap) + + ########################################################################### + def __iter__(self): + return iter(self.__faces) + + ########################################################################### + def __eq__(self, peer): + if not isinstance(peer, FacesAttrs): + return NotImplemented + return self.__faceMap == peer.__faceMap + + ########################################################################### + def __neq__(self, peer): + return not(self == peer) + + ########################################################################### + def get(self, name, default=None): + return self.__faceMap.get(name,default) + + ########################################################################### + def __getitem__(self, name): + return self.__faceMap[name] + + ########################################################################### + def __contains__(self, name): + return name in self.__faceMap + + ########################################################################### + def loadFacesFromEmacs_i(self): + facesSexpr = textwrap.dedent(\"\"\"\\ + (progn (add-to-list 'load-path \"%(elDir)s\") + (add-to-list 'load-path \"%(elDir)s/python\") + (add-to-list 'load-path \"%(elDir)s/imported\") + (require 'themes) + (write-region (themes-python-faces-attrs %(thColors)s) + nil \"%(outFile)s\") + (kill-emacs))\"\"\") + facesSexpr = ' '.join(facesSexpr.split()) + thColors = self.theme.foregroundColor, self.theme.backgroundColor + outFile = (util.dirPath('\$TEMP')/'themeFaces.py').uniquify() + facesSexpr %= {'elDir': util.Path('~/emacs').emacsName, + 'thColors': '\"%s\" \"%s\"' % thColors, + 'outFile': outFile.emacsName} + try: + subprocess.check_call(['emacs.exe', '--no-init-file', + '--iconic', '--eval', facesSexpr], + shell=True) + return eval(outFile.text().replace('\\r\\n', '\\n')) + finally: + if outFile.isfile(): + outFile.remove() + +############################################################################### +class ThemeChoice(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + __cldef.slots(\"__args\") + + ########################################################################## + def __namedTests(): + _darkThreshold = 3 \* 255 \* 0.6 + def isThemeBackgroundDark(theme): + return sum(theme.colorAttrs.backgroundColor) < _darkThreshold + def isThemeBold(theme): + return theme.fontAttrs.weight == 'bold' + return dict(isThemeBackgroundDark = isThemeBackgroundDark, + isThemeFontBold = isThemeBold) + __namedTests = __cldef.constant(__namedTests()) + + ########################################################################### + def __init__(self, theme, themeTest, onTrueValue, onFalseValue): + self.__args= (theme, themeTest, onTrueValue, onFalseValue) + + ########################################################################### + def __call__(self): + theme, themeTest, onTrueValue, onFalseValue = self.__args + if isinstance(themeTest, str): + themeTest = self.__namedTests[themeTest] + if themeTest(theme): + return onTrueValue + return onFalseValue + +############################################################################### +class ThemeAccessor(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + __cldef.slots(\"__args\") + + ########################################################################### + def __init__(self, theme, path): + self.__args = (theme, path.split(\".\")) + + ########################################################################### + def __call__(self): + obj, path = self.__args + for attr in path: + obj = getattr(obj, attr) + return obj + +############################################################################### +class EmacsFrameTheme(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + __cldef.fields(\"name colorAttrs fontAttrs defaultFace facesAttrs \" + \"canDelete\") + foregroundColor = property(lambda self: self.colorAttrs.foregroundColor) + backgroundColor = property(lambda self: self.colorAttrs.backgroundColor) + font = property(lambda self: self.fontAttrs.font) + + ########################################################################### + def __str__(self): + return util.nomen(self, \"%s:%s\" % (self.name, hex(id(self)))) + + ########################################################################### + def __init__(self, name, \*\*themeOpts): + self.name = name + self.colorAttrs = ColorAttrs() + self.fontAttrs = FontAttrs() + self.defaultFace = DefaultFace(self) + facesAttrs = themeOpts.pop('facesAttrs', None) + self.facesAttrs = FacesAttrs(self, facesAttrs=facesAttrs) + self.canDelete = themeOpts.pop('canDelete', True) + self.update(themeOpts) + + ########################################################################### + def update(self, \*args, \*\*opts): + if len(args) > 1: + raise TypeError(\"Can be at most one positional argument\") + opts = dict((args[0] if args else ()), \*\*opts) + for attrs in (self.colorAttrs, self.fontAttrs): + for attrName in attrs.attrNames: + val = opts.pop(attrName, None) + if val is not None: + setattr(attrs, attrName, val) + _emptyParametersCheck(\*\*opts) + + ########################################################################### + @classmethod + def loadTheme(cls, themeFile, canDelete=True): + themeFile = util.Path(themeFile, lambda f: f.isfile() and f.ext=='.el') + themeSexpr = textwrap.dedent(\"\"\"\\ + (progn (add-to-list 'load-path \"%(elDir)s\") + (add-to-list 'load-path \"%(elDir)s/python\") + (add-to-list 'load-path \"%(elDir)s/imported\") + (require 'themes) + (load \"%(themeFile)s\") + (write-region (themes-python-theme-attrs) nil \"%(outFile)s\") + (kill-emacs))\"\"\") + themeSexpr = ' '.join(themeSexpr.split()) + outFile = (util.dirPath('\$TEMP')/'themeAttrs.py').uniquify() + themeSexpr %= {'elDir': util.Path('~/emacs').emacsName, + 'themeFile': themeFile.stripext().emacsName, + 'outFile': outFile.emacsName} + try: + subprocess.check_call(['emacs.exe', '--no-init-file', + '--iconic', '--eval', themeSexpr], + shell=True) + themeOpts, facesAttrs = eval(outFile.text().replace('\\r\\n','\\n')) + # convert the font string spec returned by emacs to fontAttrs + # argumets expected by __init__ + font = Font(themeOpts.pop('font')) + themeOpts.update(fontSize=font.size, fontWeight=font.weight, + fontSlant=font.slant, canDelete=canDelete) + themeName = themeFile.namebase + return cls(themeName, facesAttrs=facesAttrs, \*\*themeOpts) + finally: + if outFile.isfile(): + outFile.remove() + + ########################################################################### + def copy(self, newThemeName, \*\*newThemeOpts): + newTheme = copy.deepcopy(self) + newTheme.__name = newThemeName + newTheme.update(newThemeOpts) + return newTheme + + ########################################################################### + def __eq__(self, peer): + if not isinstance(peer, EmacsFrameTheme): + return NotImplemented + return (self.name == peer.name and + self.foregroundColor == peer.foregroundColor and + self.backgroundColor == peer.backgroundColor and + self.font == peer.font and + self.facesAttrs == peer.facesAttrs) + + ########################################################################### + def __neq__(self, peer): + return not(self == peer) + + ########################################################################### + @property + def sexpr(self): + cursor = Face('cursor', self, background=self.colorAttrs.cursorColor) + faces = [self.defaultFace, cursor] + list(self.facesAttrs) + return \"(progn\\n %s)\" % \"\\n \".join(f.setFaceSexpr() for f in faces) + + ########################################################################### + __applyFormat = \"%(sexpr)s\\n(themes-save-cache-file (quote %(sexpr)s))\" + + ########################################################################### + def applyTheme(self): + lisp(self.__applyFormat % dict(sexpr=self.sexpr)) + + ########################################################################### + def accessor(self, \*p, \*\*kw): + return ThemeAccessor(self, \*p, \*\*kw) + + ########################################################################### + def choice(self, \*p, \*\*kw): + return ThemeChoice(self, \*p, \*\*kw) + +############################################################################### +def cacheFilePath(path): + return util.Path(path, lambda f: not(f.isdir())) + +############################################################################### +class EmacsFrameThemes(object, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + __cldef.slots(\"__themes\") + __cldef.field('cacheFile', 'ri', sethook=cacheFilePath) + __cldef.field(\"saveEnabled\", 'rw', initval=True, sethook=bool) + __cldef.field(\"current\", 'rw', + fset=lambda obj,theme: obj.setCurrentTheme(theme)) + + ########################################################################### + def __new__(cls, themeMgr=None): + if themeMgr is None: + # pickle internals called __new__ SURPRISE! + return object.__new__(cls) + if themeMgr.cacheFile.isfile(): + # load themes from cache file + return cls.loadCache_i(themeMgr.cacheFile) + themes = object.__new__(cls) + elispFiles = themeMgr.archive.files('\*.el') + if elispFiles: + # load themes from a collection (archive) of elisp files created + # this module and emacs can use to initialize themes + themes.loadArchive_i(elispFiles, themeMgr.cacheFile) + else: + # create themes using a few 'canned' themes + themes.bootstrap_i(themeMgr.cacheFile) + return themes + + ########################################################################### + @classmethod + def loadCache_i(cls, cacheFile): + try: + with cacheFile.open('rb') as cacheFP: + themes = pickle.load(cacheFP) + except: + # If file has windows newlines '\\r\\n', read it as text which + # converting newlines, encode to bytes and retry loading + themes = pickle.loads(cacheFile.text().encode()) + assert isinstance(themes, cls) + themes.__cacheFile = cacheFilePath(cacheFile) + return themes + + ########################################################################### + def loadArchive_i(self, elispFiles, cacheFile): + self.__themes = [] + self.cacheFile, self.saveEnabled = cacheFile, False + elispFiles = dict((f.namebase, f) for f in elispFiles) + # load archive files in (standard themes) order. if no arcive file + # is named after a standard theme, create it using provided args + for thName,thOpts in ((d['name'],d) for d in self.standardThemes()): + elispFile = elispFiles.pop(thName, None) + if elispFile is not None: + self.addTheme(EmacsFrameTheme.loadTheme( + elispFile, thOpts['canDelete'])) + else: + self.addTheme(EmacsFrameTheme(\*\*thOpts)) + # load any remaining archive files + for elispFile in sorted(elispFiles.values()): + self.addTheme(EmacsFrameTheme.loadTheme(elispFile)) + self.current = self.__themes[0] + self.saveEnabled = True + self.save() + + ########################################################################### + @staticmethod + def standardThemes(): + return [dict(name='dark_frames', canDelete=False), + dict(name='red_frames', canDelete=False, + backgroundColor=\"RGB:55/0/0\"), + dict(name=\"green_frames\", canDelete=False, + backgroundColor=\"RGB:16/25/25\"), + dict(name=\"blue_frames\", canDelete=False, + backgroundColor=\"RGB:0B/0B/2D\"), + dict(name=\"light_frames\", canDelete=False, + foregroundColor='black', + backgroundColor='white')] + + ########################################################################### + def bootstrap_i(self, cacheFile): + self.__themes = [] + self.cacheFile, self.saveEnabled = cacheFile, False + # create dark theme as current theme + self.current = EmacsFrameTheme(\"dark_frames\", canDelete=False) + # create red theme + self.addTheme(EmacsFrameTheme(\"red_frames\", canDelete=False, + backgroundColor=\"RGB:55/0/0\")) + # create green theme + self.addTheme(EmacsFrameTheme(\"green_frames\", canDelete=False, + backgroundColor=\"RGB:16/25/25\")) + # create blue theme + self.addTheme(EmacsFrameTheme(\"blue_frames\", canDelete=False, + backgroundColor=\"RGB:0B/0B/2D\")) + # create light theme from default + self.addTheme(EmacsFrameTheme(\"light_frames\", canDelete=False, + foregroundColor='black', + backgroundColor='white')) + self.saveEnabled = True + self.save() + + ########################################################################### + def reset(self, prototype, copy=True): + assert type(self) is type(prototype) + if copy: + prototype = copy.deepcopy(prototype) + for attr in self.__slots__: + setattr(self, attr, getattr(prototype, attr)) + self.save() + + ########################################################################### + def save(self): + if self.saveEnabled: + with self.cacheFile.open('wb') as cacheFile: + pickle.dump(self, cacheFile) + + ########################################################################### + def addTheme(self, theme): + if theme.name in self: + raise KeyError(\"theme.name(%s) is not unique\" % theme.name) + self.__themes.append(theme) + self.save() + + ########################################################################### + def getTheme(self, name, exact=True, default=None): + if exact: + for theme in self.__themes: + if theme.name == name: + return theme + else: + name = name.strip().lower() + for theme in self.__themes: + if name in theme.name.lower(): + return theme + return default + + ########################################################################### + def setCurrentTheme(self, theme): + if isinstance(theme,str): + theme = self.getTheme(theme) + if isinstance(theme, EmacsFrameTheme): + self.__current = theme + if theme not in self: + self.addTheme(theme) + else: + raise ValueError(\"%s invalid theme\" % theme) + + ########################################################################### + def removeTheme(self, theme, force=False): + # arg can be either a theme instance or a str naming the theme + if isinstance(theme,str): + theme = self.getTheme(theme) + if not force: + if len(self.__themes) == 1: + raise ValueError(\"Can't remove last theme\") + if not theme.canDelete: + raise ValueError(\"Theme %s can't be removed\" % theme.name) + # remove the theme from both the themes list + self.__themes.remove(theme) + # adjust current attr if theme deleted was current one + if theme == self.__current: + try: + self.__current = self.__themes[0] + except IndexError: + del self.__current + self.save() + + ########################################################################### + def swapThemes(self, theme1, theme2): + if isinstance(theme1, str): + theme1 = self.getTheme(theme1) + if isinstance(theme2, str): + theme2 = self.getTheme(theme2) + index1 = self.__themes.index(theme1) + index2 = self.__themes.index(theme2) + self.__themes[index2] = theme1 + self.__themes[index1] = theme2 + + ########################################################################### + def __iter__(self): + return iter(self.__themes) + + ########################################################################### + def __len__(self): + return len(self.__themes) + + ########################################################################### + def __contains__(self, item): + if isinstance(item, str): + return item in (theme.name for theme in self.__themes) + return item in self.__themes + +############################################################################### +class EmacsFrameThemeManager(datatypes.Singleton, metaclass=cldef.metaClass): + __cldef = cldef.metaClass.wrapclass() + __cldef.fields('themesDir cacheFile archive') + __cldef.field('themes', 'r', initfunc=lambda obj: EmacsFrameThemes(obj)) + currentTheme = property(lambda self: self.themes.current) + + ########################################################################### + def newSingleton_i(self, themesDir=None): + self.__super.newSingleton_i() + if themesDir is None: + themesDir = '\$APPDATA/_emacsthemes_v%d' % version + self.themesDir = util.dirPath(themesDir) + archive = self.themesDir/'archive' + if not archive.exists(): + archive.mkdir() + self.archive = util.dirPath(archive) + self.cacheFile = self.themesDir/'cache.pkl' + + ########################################################################### + def applyNamedTheme(self, themeName, exact=True): + themeName = themeName.replace(\"-\",\"_\") + self.__themes.current = self.__themes.getTheme(themeName, exact) + self.currentTheme.applyTheme() + + ########################################################################### + def setFrameTheme(self, themeName, \*\*themeOpts): + self.__themes.current = themeName + self.currentTheme.update(themeOpts) + self.currentTheme.applyTheme() + + ########################################################################### + def gui(self): + global EmacsFrameThemesApp + try: + guiRun = EmacsFrameThemesApp.run + except NameError: + from themes.thgui import EmacsFrameThemesApp + guiRun = EmacsFrameThemesApp.run + guiRun(self, tuple(i+50 for i in emacsPosition())) + + ########################################################################### + def archiveThemes(self): + textFormat = textwrap.dedent(\"\"\"\\ + ;;; %s :: %s -\*-Emacs-Lisp-\*- + ;;; -- Used by themes.el for persistance of current frame theme + ;;; settings across emacs invocations + %s + \"\"\") + for theme in self.themes: + archiveFile = self.archive/(theme.name + '.el') + timeStr = datetime.datetime.now().strftime(\"%a %b %d %H:%M:%S %Y\") + archiveFile.write_text( + textFormat % (archiveFile.name, timeStr, theme.sexpr)) +")) + (py-bug-tests-intern 'pyindex-mishandles-class-definitions-lp-1018164-base arg teststring))) + +(defun pyindex-mishandles-class-definitions-lp-1018164-base () + (goto-char 25548) + (assert (eq 26242 (py-end-of-def-or-class)) nil "pyindex-mishandles-class-definitions-lp-1018164-test failed")) + +(defun exception-in-except-clause-highlighted-as-keyword-lp-909205-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +try: + blah +except ormexc.NoResultFound: + pass +")) + (py-bug-tests-intern 'exception-in-except-clause-highlighted-as-keyword-lp-909205-base arg teststring))) + +(defun exception-in-except-clause-highlighted-as-keyword-lp-909205-base () + (font-lock-fontify-buffer) + (goto-char 65) + ;; (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'font-lock-keyword-face) nil "exception-in-except-clause-highlighted-as-keyword-lp-909205-test #1 failed") + (goto-char 77) + (assert (eq (get-char-property (point) 'face) 'py-exception-name-face) nil "exception-in-except-clause-highlighted-as-keyword-lp-909205-test #2 failed") + ) + +(defun inconvenient-window-splitting-behavior-python-lp-1018996-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import re +import sys +import os +re. +os. +")) + (py-bug-tests-intern 'inconvenient-window-splitting-behavior-python-lp-1018996-base arg teststring))) + +(defun inconvenient-window-splitting-behavior-python-lp-1018996-base () + (goto-char 82) + (py-shell-complete nil t) + (assert (string-match "^re." (car py-shell-complete-debug)) nil "inconvenient-window-splitting-behavior-python-lp-1018996-test #1 failed") + (goto-char 86) + (py-shell-complete nil t) + (assert (string-match "^os." (car py-shell-complete-debug)) nil "inconvenient-window-splitting-behavior-python-lp-1018996-test #2 failed")) + +(defun inconvenient-window-splitting-behavior-ipython-lp-1018996-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env ipython +# -*- coding: utf-8 -*- +import re +import sys +import os +re. +os. +")) + (py-bug-tests-intern 'inconvenient-window-splitting-behavior-ipython-lp-1018996-base arg teststring))) + +(defun inconvenient-window-splitting-behavior-ipython-lp-1018996-base () + (goto-char 83) + (py-shell-complete nil t) + (assert (string-match "^re." (car py-shell-complete-debug)) nil "inconvenient-window-splitting-behavior-ipython-lp-1018996-test #1 failed") + (goto-char 87) + (py-shell-complete nil t) + (assert (string-match "^os." (car py-shell-complete-debug)) nil "inconvenient-window-splitting-behavior-ipython-lp-1018996-test #2 failed")) + +(defun impossible-to-execute-a-buffer-with-from-future-imports-lp-1063884-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import with_statement +print(\"I'm the \\\"impossible-to-execute-a-buffer-with-from-future-imports-lp-1063884-test\\\"\") +")) + (py-bug-tests-intern 'impossible-to-execute-a-buffer-with-from-future-imports-lp-1063884-base arg teststring))) + +(defun impossible-to-execute-a-buffer-with-from-future-imports-lp-1063884-base () + (sit-for 0.1) + (assert (py-execute-buffer) nil "impossible-to-execute-a-buffer-with-from-future-imports-lp-1063884-test failed")) + +(defun several-new-bugs-with-paragraph-filling-lp-1066489-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +class IBanManager(Interface): + \"\"\"The global manager of email address bans.\"\"\" + + def ban(email): + \"\"\"Ban an email address from subscribing to a mailing list. + + The `IBanManager` is created by adapting an `IMailingList` or ``None``. + For global bans, use ``None``. + + When an email address is banned, it will not be allowed to subscribe + to a the named mailing list. This does not affect any email address + already subscribed to the mailing list. + + It is also possible to add a 'ban pattern' whereby all email addresses + matching a Python regular expression can be banned. This is + accomplished by using a `^` as the first character in `email`. + + When an email address is already banned for the given mailing list (or + globally), then this method does nothing. However, it is possible to + extend a ban for a specific mailing list into a global ban; both bans + would be in place and they can be removed individually. + + :param email: The text email address being banned or, if the string + starts with a caret (^), the email address pattern to ban. + :type email: str + :param mailing_list: The fqdn name of the mailing list to which the + ban applies. If None, then the ban is global. + :type mailing_list: string + \"\"\" +")) + (py-bug-tests-intern 'several-new-bugs-with-paragraph-filling-lp-1066489-base arg teststring))) + +(defun several-new-bugs-with-paragraph-filling-lp-1066489-base () + (let (py-paragraph-fill-docstring-p) + (goto-char 932) + (py-fill-paragraph) + (assert (re-search-forward "^ +:type email") nil "several-new-bugs-with-paragraph-filling-lp-1066489-test failed"))) + +(defun incorrect-indentation-of-one-line-functions-lp-1067633-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(): + pass +")) + (py-bug-tests-intern 'incorrect-indentation-of-one-line-functions-lp-1067633-base arg teststring))) + +(defun incorrect-indentation-of-one-line-functions-lp-1067633-base () + (goto-char 67) + (assert (eq 4 (py-compute-indentation)) nil "incorrect-indentation-of-one-line-functions-lp-1067633-test failed")) + +(defun does-not-dedent-regions-lp-1072869-test (&optional arg) + (interactive "p") + (let ((teststring " print(\"HELLO\")")) + (py-bug-tests-intern 'does-not-dedent-regions-lp-1072869-base arg teststring))) + +(defun does-not-dedent-regions-lp-1072869-base () + (assert (py-execute-buffer-ipython) nil "does-not-dedent-regions-lp-1072869-test #1 failed") + (assert (py-execute-buffer-python) nil "does-not-dedent-regions-lp-1072869-test #2 failed") + ) + +(defun inconvenient-py-switch-buffers-on-execute-lp-1073-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +print \"HELLO!\" +")) + (py-bug-tests-intern 'inconvenient-py-switch-buffers-on-execute-lp-1073-base arg teststring))) + +;; doesn't word, patches welcome +(defun inconvenient-py-switch-buffers-on-execute-lp-1073-base () + (let ((py-switch-buffers-on-execute-p t) + erg) + (py-execute-buffer-python) + (message "current: %s" (buffer-name (current-buffer))) + (setq erg (string-match "Python" (buffer-name (current-buffer)))) + ;; (assert erg nil "inconvenient-py-switch-buffers-on-execute-lp-1073-test failed") + (switch-to-buffer (current-buffer)) + )) + +(defun fails-to-indent-abs-wrong-type-argument-lp-1075673-test (&optional arg) + (interactive "p") + (let ((teststring "#!/usr/bin/env python +# emacs: -\*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -\*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +# +# See COPYING file distributed along with the PyMVPA package for the +# copyright and license terms. +# +### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ## +\"\"\"Python distutils setup for PyMVPA\"\"\" + +from numpy.distutils.core import setup, Extension +import os +import sys +from glob import glob + +if sys.version_info[:2] < (2, 5): +")) + (py-bug-tests-intern 'fails-to-indent-abs-wrong-type-argument-lp-1075673-base arg teststring))) + +(defun fails-to-indent-abs-wrong-type-argument-lp-1075673-base () + (assert (eq 4 (py-compute-indentation)) nil "fails-to-indent-abs-wrong-type-argument-lp-1075673-test failed")) + +(defun incorrect-indentation-of-comments-in-a-multiline-list-lp-1077063-test (&optional arg) + (interactive "p") + (let ((teststring "#!/usr/bin/python +#emacs: -\*- mode: python; py-indent-offset: 4; tab-width: 4; indent-tabs-mode: nil -\*- +#ex: set sts=4 ts=4 sw=4 noet: + +class X: + XX = [ + \"asdfasdF\", + \"asdfasdf\", + # lakjsdflkjasdf + \"lkajsdlkfj\" + ] + +# There is no way to indent #comment line with TAB, nor subsequent list entry to the level of previous +# entries + +")) + (py-bug-tests-intern 'incorrect-indentation-of-comments-in-a-multiline-list-lp-1077063-base arg teststring))) + +(defun incorrect-indentation-of-comments-in-a-multiline-list-lp-1077063-base () + (goto-char 202) + (assert (eq 8 (py-compute-indentation)) nil "incorrect-indentation-of-comments-in-a-multiline-list-lp-1077063-test failed")) + +(defun fill-paragraph-in-a-comment-does-not-stop-at-empty-comment-lines-lp-1077139-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# in older version of python-mode (5.1.0) fill-paragraph (Alt-q) e.g. on first line of + +# line1: alskdjfl aksdjlfkas dklfj aslkdjf aklsdj flkasjd fklasjd lfkasj dlkfj asdklfj aslkdfj +# +# line2 + +# would fill only portion of line1: + +# line1: alskdjfl aksdjlfkas dklfj aslkdjf aklsdj flkasjd fklasjd +# lfkasj dlkfj asdklfj aslkdfj +# +# line2 + +# while current version disregards such stop paragraph separation... unless it is at the beginning of the +# buffer!! ;), so adding an empty line before the first comment line of this test example, results in: + +# line1: alskdjfl aksdjlfkas dklfj aslkdjf aklsdj flkasjd fklasjd +# lfkasj dlkfj asdklfj aslkdfj line2 + +")) + (py-bug-tests-intern 'fill-paragraph-in-a-comment-does-not-stop-at-empty-comment-lines-lp-1077139-base arg teststring))) + +(defun fill-paragraph-in-a-comment-does-not-stop-at-empty-comment-lines-lp-1077139-base () + (let ((empty-comment-line-separates-paragraph-p t)) + (goto-char 152) + (fill-paragraph) + (goto-char 233) + (beginning-of-line) + (assert (looking-at paragraph-separate) nil "fill-paragraph-in-a-comment-does-not-stop-at-empty-comment-lines-lp-1077139-test failed"))) + +(defun spuriously-indents-whole-line-while-making-some-portion-inline-comment-lp-1080973-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# originally it actually added indentation level in my case so code became + +# @sweepargs(clf=[kNN(5)]) #clfswh['multiclass']) +# def test_auc(self, clf): +# pass + +# but on example to reproduce +class A(object): + def prev(): + pass + + @decorator(1) lkajsd + def buga(): + pass + +# attempt to insert # before lkajsd actually dedented it and made it + +class A(object): + def prev(): + pass + +@decorator(1) #lkajsd + def buga(): + pass + +# imho making inline comment should not alter whole line indentation + +")) + (py-bug-tests-intern 'spuriously-indents-whole-line-while-making-some-portion-inline-comment-lp-1080973-base arg teststring))) + +(defun spuriously-indents-whole-line-while-making-some-portion-inline-comment-lp-1080973-base () + (goto-char 312) + (assert (eq 4 (py-compute-indentation)) nil "spuriously-indents-whole-line-while-making-some-portion-inline-comment-lp-1080973-test #1 failed") + (goto-char 349) + (assert (eq 4 (py-compute-indentation)) nil "spuriously-indents-whole-line-while-making-some-portion-inline-comment-lp-1080973-test #2 failed") + ) + +(defun imenu-add-menubar-index-fails-lp-1084503-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +")) + (py-bug-tests-intern 'imenu-add-menubar-index-fails-lp-1084503-base arg teststring))) + +(defun imenu-add-menubar-index-fails-lp-1084503-base () + (assert (imenu-add-menubar-index) nil "imenu-add-menubar-index-fails-lp-1084503-test failed")) + +(defun fill-paragraph-in-comments-results-in-mess-lp-1084769-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def update(): + # We need to get a reliable checksum for the dictionary in + # newpkg_list. Dictionary order is unpredictable, so to get a + # reproducible checksum, we get the items of the dict, sort on the + # keys, then get the json representation of this sorted list, encode + # this to bytes assuming utf-8, and hash + # the resulting bytes. +")) + (py-bug-tests-intern 'fill-paragraph-in-comments-results-in-mess-lp-1084769-base arg teststring))) + +(defun fill-paragraph-in-comments-results-in-mess-lp-1084769-base () + (goto-char 266) + (fill-paragraph) + (beginning-of-line) + (assert (looking-at " ") nil "fill-paragraph-in-comments-results-in-mess-lp-1084769-test failed")) + +(defun py-execute-buffer-python3-looks-broken-lp-1085386-test (&optional arg) + (interactive "p") + (let ((teststring "i = 0 +i+=1 +print(i) +")) + (py-bug-tests-intern 'py-execute-buffer-python3-looks-broken-lp-1085386-base arg teststring))) + +(defun py-execute-buffer-python3-looks-broken-lp-1085386-base () + (let ((py-use-current-dir-when-execute-p t)) + (assert (py-execute-buffer-python3) nil "py-execute-buffer-python3-looks-broken-lp-1085386-test failed"))) + +(defun wrong-indent-after-asignment-lp-1087404-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +a = 1 +# After pressing enter column 1 as expected +b = [1] + +# Now after pressing enter indents to column 4 + +")) + (py-bug-tests-intern 'wrong-indent-after-asignment-lp-1087404-base arg teststring))) + +(defun wrong-indent-after-asignment-lp-1087404-base () + (goto-char 106) + (assert (eq 0 (py-compute-indentation)) nil "wrong-indent-after-asignment-lp-1087404-test failed")) + +(defun wrong-indentation-after-return-or-pass-keyword-lp-1087499-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +class Foo(self): + def bar(self): + return self.baz + +class Baz(self): + def bar(self): + pass + +")) + (py-bug-tests-intern 'wrong-indentation-after-return-or-pass-keyword-lp-1087499-base arg teststring))) + +(defun wrong-indentation-after-return-or-pass-keyword-lp-1087499-base () + (goto-char 108) + (assert (eq 4 (py-compute-indentation)) nil "wrong-indentation-after-return-or-pass-keyword-lp-1087499-test failed") + (goto-char 158) + (assert (py-compute-indentation) nil "wrong-indentation-after-return-or-pass-keyword-lp-1087499-test failed")) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n1-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import os +import urllib +os.chdir(\"NOT-EXISTING\") +f = urllib.urlopen(\"NOT-EXISTING.html\") +for lines in f: + print(lines) +")) + (py-bug-tests-intern 'temporary-files-remain-when-python-raises-exception-lp-1083973-n1-base arg teststring))) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n1-base () + (let ((python-mode-v5-behavior-p t)) + (py-execute-buffer) + (assert (eobp) nil "temporary-files-remain-when-python-raises-exception-lp-1083973-n1-test failed"))) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n2-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import os +import urllib +f = urllib.urlopen(\"NOT-EXISTING.html\") +for lines in f: + print(lines) +")) + (py-bug-tests-intern 'temporary-files-remain-when-python-raises-exception-lp-1083973-n2-base arg teststring))) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n2-base () + (let ((python-mode-v5-behavior-p t)) + (py-execute-buffer) + (assert (eq 72 (point)) nil "temporary-files-remain-when-python-raises-exception-lp-1083973-n2-test failed"))) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n3-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import os +import urllib +f = urllib.urlopen(\"NOT-EXISTING.html\") +for lines in f: + print(lines) +")) + (py-bug-tests-intern 'temporary-files-remain-when-python-raises-exception-lp-1083973-n3-base arg teststring))) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n3-base () + (py-execute-buffer) + (assert (eq 163 (point)) nil "temporary-files-remain-when-python-raises-exception-lp-1083973-n3-test failed")) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n4-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +import os +import urllib +f = urllib.urlopen(\"NOT-EXISTING.html\") +for lines in f: + print(lines) +")) + (py-bug-tests-intern 'temporary-files-remain-when-python-raises-exception-lp-1083973-n4-base arg teststring))) + +(defun temporary-files-remain-when-python-raises-exception-lp-1083973-n4-base () + (py-execute-buffer) + (switch-to-buffer (current-buffer)) + (sit-for 0.1) + (message "Bin hier %s" (buffer-name (current-buffer))) + (assert (eq 163 (point)) nil "temporary-files-remain-when-python-raises-exception-lp-1083973-n4-test failed")) + +(defun comments-start-a-new-line-lp-1092847-n1-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# I am using python-mode.el in Emacs to edit some Python code and it has the most annoying feature where it +# auto-indents a comment and then starts a new line. For example, if I have this: + +def x(): + y = 1 + + +And then add in one # at the root indentation level: + +def x(): + y = 1 + + # + + +# It automatically indents, inserts the #, and inserts a carriage return after the #. It's driving me crazy. +# I want my comments to stay exactly where I put them! Any suggestions? + +# I've looked through the elisp code for the mode and can't find anything yet nor can I find anything +# elsewhere online. All I can find is that comments won't be used for future indentation (py-honor-comment- +# indentation) but nothing related to the comment itself. Nor the strange carriage return. + +")) + (py-bug-tests-intern 'comments-start-a-new-line-lp-1092847-n1-base arg teststring))) + +(defun comments-start-a-new-line-lp-1092847-n1-base () + (let ((py-electric-comment-p t)) + (goto-char 258) + (py-electric-comment 1) + (back-to-indentation) + (assert (eq 4 (current-column)) nil "comments-start-a-new-line-lp-1092847-n1-test failed"))) + +(defun comments-start-a-new-line-lp-1092847-n2-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# I am using python-mode.el in Emacs to edit some Python code and it has the most annoying feature where it +# auto-indents a comment and then starts a new line. For example, if I have this: + +def x(): + y = 1 + + +And then add in one # at the root indentation level: + +def x(): + y = 1 + + # + + +# It automatically indents, inserts the #, and inserts a carriage return after the #. It's driving me crazy. +# I want my comments to stay exactly where I put them! Any suggestions? + +# I've looked through the elisp code for the mode and can't find anything yet nor can I find anything +# elsewhere online. All I can find is that comments won't be used for future indentation (py-honor-comment- +# indentation) but nothing related to the comment itself. Nor the strange carriage return. + +")) + (py-bug-tests-intern 'comments-start-a-new-line-lp-1092847-n2-base arg teststring))) + +(defun comments-start-a-new-line-lp-1092847-n2-base () + (let ((py-electric-comment-p nil)) + (goto-char 258) + (py-electric-comment 1) + (back-to-indentation) + (assert (eq 0 (current-column)) nil "comments-start-a-new-line-lp-1092847-n2-test failed"))) + +(defun filename-completion-fails-in-ipython-lp-1027265-n1-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +a = open('/ho') +")) + (py-bug-tests-intern 'filename-completion-fails-in-ipython-lp-1027265-n1-base arg teststring))) + +(defun filename-completion-fails-in-ipython-lp-1027265-n1-base () + (goto-char 61) + (completion-at-point) + (assert (eq 63 (point)) nil "filename-completion-fails-in-ipython-lp-1027265-n1-test failed")) + +(defun filename-completion-fails-in-ipython-lp-1027265-n2-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env ipython +# -*- coding: utf-8 -*- +a = open('/ho') +")) + (py-bug-tests-intern 'filename-completion-fails-in-ipython-lp-1027265-n2-base arg teststring))) + +(defun filename-completion-fails-in-ipython-lp-1027265-n2-base () + (goto-char 62) + (completion-at-point) + (assert (eq 65 (point)) nil "filename-completion-fails-in-ipython-lp-1027265-n2-test failed")) + +(defun enter-key-does-not-indent-properly-after-return-statement-lp-1098793-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(): + while something(): + bar() + baz() + return 1 + +# Once the cursor is placed after \"return 1\" and I hit enter, on the next line, the cursor is placed under +# the \"r\" in return statement, instead of moving indentation to the outer block. +# +# \"ENTER\" key is bound to (py-newline-and-indent) +# +# Some version information: +# +# emacs-version +# \"GNU Emacs 24.2.1 (i686-pc-cygwin) of 2012-08-27 on fiona\" +# py-version +# \"6.1.0\" + +")) + (py-bug-tests-intern 'enter-key-does-not-indent-properly-after-return-statement-lp-1098793-base arg teststring))) + +(defun enter-key-does-not-indent-properly-after-return-statement-lp-1098793-base () + (goto-char 119) + (assert (eq 0 (py-compute-indentation)) nil "enter-key-does-not-indent-properly-after-return-statement-lp-1098793-test failed")) + +(defun py-up-test-python-el-111-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -\*- coding: utf-8 -\*- +# up-list: Scan error: \"Unbalanced parentheses\" +# Hi, when I press C-M-u in python buffer I get: +# +# up-list: Scan error: \"Unbalanced parentheses\" + +# My expected behavior is something like this: +# +# Scenario: Going higher level by C-M-u +# When I insert: + +# def f(): +# if True: +# [i for i in range(3)] + +# And I am looking at \"3)]\" +# And I press C-M-u +# Then I should looking at \"(3)]\" +# And I press C-M-u +# Then I should looking at \"[i for i\" +# And I press C-M-u +# Then I should looking at \"if True\" +# And I press C-M-u +# Then I should looking at \"def f\" +# +# related: #106 + +def f(): + if True: + print(\"[i for i in range(3)]: %s \" % ([i for i in range(3)])) + +")) + (py-bug-tests-intern 'py-up-test-python-el-111-base arg teststring))) + +(defun py-up-test-python-el-111-base () + (goto-char 757) + (assert (eq 756 (py-up)) nil "py-up-test-python-el-111-test #1 failed") + (assert (eq 739 (py-up)) nil "py-up-test-python-el-111-test #2 failed") + (assert (eq 738 (py-up)) nil "py-up-test-python-el-111-test #3 failed") + (assert (eq 706 (py-up)) nil "py-up-test-python-el-111-test #4 failed") + (assert (eq 701 (py-up)) nil "py-up-test-python-el-111-test #5 failed") + (assert (eq 684 (py-up)) nil "py-up-test-python-el-111-test #6 failed") + (assert (eq 671 (py-up)) nil "py-up-test-python-el-111-test #7 failed") + (goto-char 726) + (assert (eq 707 (py-up)) nil "py-up-test-python-el-111-test #8 failed") + (assert (eq 706 (py-up)) nil "py-up-test-python-el-111-test #9 failed") + ) + +(defun py-down-python-el-112-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# Scenario: Going lover level by C-M-d +# When I insert: + +class C(object): + def m(self): + if True: + return [i for i in range(3)] + else: + return [] + + # And I am looking at \"class C\" + # And I press C-M-d + # Then I should looking at \"def m\" + # And I press C-M-d + # Then I should looking at \"if True\" + # And I press C-M-d + # Then I should looking at \"i for i\" + # And I press C-M-d + # Then I should looking at \"3\" + +# Current version of C-M-d jumps to inside of (object) +# because it is just a plain down-list. I think it's +# better to have python-specific one for symmetry. + +")) + (py-bug-tests-intern 'py-down-python-el-112-base arg teststring))) + +(defun py-down-python-el-112-base () + (goto-char 109) + (assert (eq 130 (py-down)) nil "py-down-test-python-el-112-test #1 failed") + (assert (eq 151 (py-down)) nil "py-down-test-python-el-112-test #2 failed") + (assert (eq 172 (py-down)) nil "py-down-test-python-el-112-test #3 failed") + (assert (eq 179 (py-down)) nil "py-down-test-python-el-112-test #4 failed") + (assert (eq 196 (py-down)) nil "py-down-test-python-el-112-test #5 failed") +) + +(defun py-underscore-word-syntax-p-customization-has-no-effect-lp-1100947-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +_ +")) + (py-bug-tests-intern 'py-underscore-word-syntax-p-customization-has-no-effect-lp-1100947-base arg teststring))) + +(defun py-underscore-word-syntax-p-customization-has-no-effect-lp-1100947-base () + (goto-char 48) + (py-underscore-word-syntax-p-on) + (assert (eq 119 (char-syntax (char-after))) nil "py-underscore-word-syntax-p-customization-has-no-effect-lp-1100947-test #1 failed") + (py-underscore-word-syntax-p-off) + (assert (eq 95 (char-syntax (char-after))) nil "py-underscore-word-syntax-p-customization-has-no-effect-lp-1100947-test #2 failed") + (py-underscore-word-syntax-p-on) + (assert (eq 119 (char-syntax (char-after))) nil "py-underscore-word-syntax-p-customization-has-no-effect-lp-1100947-test #3 failed") +) + +(defun py-newline-and-indent-leaves-eol-whitespace-lp-1100892-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -\*- coding: utf-8 -\*- +# py-newline-and-indent leaves extra whitespace at eol if used inside an existing construct. It should +# instead clean up all trailing whitespace. I believe this is a regression. + +def foo(): + x = some_long_call(supercalifragilistic=6, expialidocious=7) + +# Now, put point on the 'e' of expialidocious and hit RET + +# You will see that there's an extra space left after the \"6, \". All trailing whitespace should instead be +# removed. + +")) + (py-bug-tests-intern 'py-newline-and-indent-leaves-eol-whitespace-lp-1100892-base arg teststring))) + +(defun py-newline-and-indent-leaves-eol-whitespace-lp-1100892-base () + (let ((py-newline-delete-trailing-whitespace-p t)) + (goto-char 286) + (py-newline-and-indent) + (sit-for 0.1) + (skip-chars-backward " \t\r\n\f") + (assert (eq (char-after) 10) nil "py-newline-and-indent-leaves-eol-whitespace-lp-1100892-test failed"))) + +(defun module-docstring-when-following-comment-lp-1102011-test (&optional arg) + (interactive "p") + (let ((teststring "# -*- coding: utf-8 -*- +# ***************************************************************************** +# +# Copyright (c) 2009-2012 by the contributors (see AUTHORS) +# +# 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 2 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, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Module authors: +# Georg Brandl +# +# ***************************************************************************** +\"\"\"Some docstring.\"\"\" + +__version__ = \"\$Revision\$\" + +")) + (py-bug-tests-intern 'module-docstring-when-following-comment-lp-1102011-base arg teststring))) + +(defun module-docstring-when-following-comment-lp-1102011-base () + (let ((py-use-font-lock-doc-face-p t)) + (goto-char 1024) + (python-mode) + (font-lock-fontify-buffer) + (sit-for 1) + (assert (eq (face-at-point) 'font-lock-doc-face) nil "module-docstring-when-following-comment-lp-1102011-test failed"))) + +(defun ipython-complete-lp-1102226-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env ipython +# -*- coding: utf-8 -*- +import re +re. +")) + (py-bug-tests-intern 'ipython-complete-lp-1102226-base arg teststring))) + +(defun ipython-complete-lp-1102226-base () + (and (featurep 'company)(company-mode -1)) + (goto-char 62) + (ipython-complete) + ;; (set-buffer "*IPython Completions*") + ;; (switch-to-buffer (current-buffer)) + (assert (bufferp (get-buffer "*IPython Completions*")) nil "ipython-complete-lp-1102226-test failed")) + +(defun more-docstring-filling-woes-lp-1102296-pep-257-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# (I selected \"PEP-257-NN\" as the docstring fill style.) +# Given the following code: + +class Test(object): + \"\"\" + Builds target formats from the reST sources. + \"\"\" + + def method1(self): + \"\"\"Return the template bridge configured.\"\"\" + pass + + def method2(self): + \"\"\"Load necessary templates and perform initialization. The default implementation does nothing. + \"\"\" + pass + +# There are three misbehaviors here: +# \* should have removed the whitespace at the beginning and end of the class docstring +# \* in method1, the \"pass\" should remain on its own line +# \* in method2, the closing triple-quote should get its own line, and the \"pass\" too + +")) + (py-bug-tests-intern 'more-docstring-filling-woes-lp-1102296-pep-257-base arg teststring))) + +(defun more-docstring-filling-woes-lp-1102296-pep-257-base () + (let ((py-docstring-style 'pep-257)) + (goto-char 178) + (assert (fill-paragraph) nil "more-docstring-filling-woes-lp-1102296-pep-257-test #1 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-test #1 done") + (goto-char 259) + (fill-paragraph) + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-pep-257-test #2 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-test #2 done") + (goto-char 357) + (fill-paragraph) + (goto-char 436) + (sit-for 0.1) + (assert (empty-line-p) nil "more-docstring-filling-woes-lp-1102296-pep-257-test #3a failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-test #3a done") + (forward-line 2) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-pep-257-test #3c failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-test #3c done"))) + +(defun more-docstring-filling-woes-lp-1102296-onetwo-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# (I selected \"PEP-257-NN\" as the docstring fill style.) +# Given the following code: + +class Test(object): + \"\"\" + Builds target formats from the reST sources. + \"\"\" + + def method1(self): + \"\"\"Return the template bridge configured.\"\"\" + pass + + def method2(self): + \"\"\"Load necessary templates and perform initialization. The default implementation does nothing. + \"\"\" + pass + +# There are three misbehaviors here: +# \* should have removed the whitespace at the beginning and end of the class docstring +# \* in method1, the \"pass\" should remain on its own line +# \* in method2, the closing triple-quote should get its own line, and the \"pass\" too + +")) + (py-bug-tests-intern 'more-docstring-filling-woes-lp-1102296-onetwo-base arg teststring))) + +(defun more-docstring-filling-woes-lp-1102296-onetwo-base () + (let ((py-docstring-style 'onetwo)) + (goto-char 178) + (assert (fill-paragraph) nil "more-docstring-filling-woes-lp-1102296-onetwo-test #1 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-onetwo-test #1 done") + (goto-char 259) + (fill-paragraph) + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-onetwo-test #2 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-onetwo-test #2 done") + (goto-char 357) + (fill-paragraph) + (beginning-of-line) + (sit-for 1) + ;; (message "%d" (skip-chars-forward " ")) + (assert (eq (skip-chars-forward " ") 8) nil "more-docstring-filling-woes-lp-1102296-onetwo-test #3a failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-onetwo-test #3a done") + (save-excursion + (goto-char 357) + (forward-line 2) + (assert (empty-line-p) nil "more-docstring-filling-woes-lp-1102296-onetwo-test #3b failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-onetwo-test #3b done")) + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-onetwo-test #3c failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-onetwo-test #3c done"))) + +(defun more-docstring-filling-woes-lp-1102296-django-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# (I selected \"PEP-257-NN\" as the docstring fill style.) +# Given the following code: + +class Test(object): + \"\"\" + Builds target formats from the reST sources. + \"\"\" + + def method1(self): + \"\"\"Return the template bridge configured.\"\"\" + pass + + def method2(self): + \"\"\"Load necessary templates and perform initialization. The default implementation does nothing. + \"\"\" + pass + +# There are three misbehaviors here: +# \* should have removed the whitespace at the beginning and end of the class docstring +# \* in method1, the \"pass\" should remain on its own line +# \* in method2, the closing triple-quote should get its own line, and the \"pass\" too + +")) + (py-bug-tests-intern 'more-docstring-filling-woes-lp-1102296-django-base arg teststring))) + +(defun more-docstring-filling-woes-lp-1102296-django-base () + (let ((py-docstring-style 'django)) + (goto-char 178) + (assert (fill-paragraph) nil "more-docstring-filling-woes-lp-1102296-django-test #1 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-django-test #1 done") + (goto-char 259) + (fill-paragraph) + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-django-test #2 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-django-test #2 done") + (goto-char 380) + (fill-paragraph) + (beginning-of-line) + (sit-for 0.1) + (assert (looking-at " \"\"\"") nil "more-docstring-filling-woes-lp-1102296-django-test #3a failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-django-test #3a done") + (save-excursion + (goto-char 357) + (forward-line 1) + (assert (empty-line-p) nil "more-docstring-filling-woes-lp-1102296-django-test #3b failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-django-test #3b done")) + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-django-test #3c failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-django-test #3c done"))) + +(defun more-docstring-filling-woes-lp-1102296-symmetric-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# (I selected \"PEP-257-NN\" as the docstring fill style.) +# Given the following code: + +class Test(object): + \"\"\" + Builds target formats from the reST sources. + \"\"\" + + def method1(self): + \"\"\"Return the template bridge configured.\"\"\" + pass + + def method2(self): + \"\"\"Load necessary templates and perform initialization. The default implementation does nothing. + \"\"\" + pass + +# There are three misbehaviors here: +# \* should have removed the whitespace at the beginning and end of the class docstring +# \* in method1, the \"pass\" should remain on its own line +# \* in method2, the closing triple-quote should get its own line, and the \"pass\" too + +")) + (py-bug-tests-intern 'more-docstring-filling-woes-lp-1102296-symmetric-base arg teststring))) + +(defun more-docstring-filling-woes-lp-1102296-symmetric-base () + (let ((py-docstring-style 'symmetric)) + (goto-char 178) + (assert (fill-paragraph) nil "more-docstring-filling-woes-lp-1102296-symmetric-test #1 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-symmetric-test #1 done") + (goto-char 259) + (fill-paragraph) + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-symmetric-test #2 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-symmetric-test #2 done") + (goto-char 380) + (fill-paragraph) + (beginning-of-line) + (sit-for 0.1) + (assert (looking-at " \"\"\"") nil "more-docstring-filling-woes-lp-1102296-symmetric-test #3a failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-symmetric-test #3a done") + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-symmetric-test #3c failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-symmetric-test #3c done"))) + +(defun line-after-colon-with-inline-comment-lp-1109946-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def f(): + if a: + b + if c: # inline comment + + # |<---- cursor will not indent properly with > +")) + (py-bug-tests-intern 'line-after-colon-with-inline-comment-lp-1109946-base arg teststring))) + +(defun line-after-colon-with-inline-comment-lp-1109946-base () + (let ((py-indent-honors-inline-comment t)) + (goto-char 104) + (assert (eq 10 (py-compute-indentation)) nil "line-after-colon-with-inline-comment-lp-1109946-test failed"))) + +(defun cascading-indent-lp-1101962-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(): + pgdt = [] + pdwd = [] + cItemLik = [ ht(\"Item\", T.hr(), T.span(\"Like\", style= + \"background-color: rgb( 229, 200, 136 )\")), + lambda item: ht( item['!'], T.br(), like( item )) + ] +")) + (py-bug-tests-intern 'cascading-indent-lp-1101962-base arg teststring))) + +(defun cascading-indent-lp-1101962-base () + (goto-char 87) + (assert (eq 4 (py-compute-indentation)) nil "cascading-indent-lp-1101962-test failed")) + +(defun python-mode-very-slow-lp-1107037-test (&optional arg) + (interactive "p") + (let ((teststring "# Since the last few commits, python-mode is unbearably slow on nontrivial files. Even +# just moving around in the file makes Emacs use 100% CPU for a few seconds. +# +# If this is due to the fix for lp:1102011, I would rather live with the highlight bug :) +# Georg Brandl (gbrandl) wrote 11 hours ago: #2 +# +# Try the file below. I have narrowed the problem to the fix for lp:1102011 -- the regex +# \*must\* have pathological behavior (which wouldn't surprise me, such backtracking +# problems are very hard to fix). In general, for that many lines between module start +# and docstring, I think it is quite fine for python-mode not to color the docstring as +# such. I think the number of permitted comment lines should be restricted to 2, in order +# to accomodate a shebang line and a coding declaration. +# -\*- coding: utf-8 -\*- +# \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* +# +# Copyright (c) 2009-2012 by the contributors (see AUTHORS) +# +# 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 2 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, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Module authors: +# Georg Brandl +# +# \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* + +\"\"\"Some docstring.\"\"\" + +__version__ = \"$Revision: 1.76 $\" + +")) + (py-bug-tests-intern 'python-mode-very-slow-lp-1107037-base arg teststring))) + +(defun python-mode-very-slow-lp-1107037-base () + (let ((py-use-font-lock-doc-face-p t)) + (goto-char 1825) + (python-mode) + (font-lock-fontify-buffer) + (sit-for 1) + (assert (eq (face-at-point) 'font-lock-doc-face) nil "python-mode-very-slow-lp-1107037-test failed"))) + +(defun add-custom-switch-for-ffap-hooks-lp-1117119-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +/usr/lib/pyt +")) + (py-bug-tests-intern 'add-custom-switch-for-ffap-hooks-lp-1117119-base arg teststring))) + +(defun add-custom-switch-for-ffap-hooks-lp-1117119-base () + (let ((py-ffap-p t) + (python-ffap t)) + (goto-char 60) + (assert (member 'py-set-ffap-form python-mode-hook) nil "add-custom-switch-for-ffap-hooks-lp-1117119-test #1 failed") + )) + +(defun more-docstring-filling-woes-lp-1102296-nil-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# (I selected \"PEP-257-NN\" as the docstring fill style.) +# Given the following code: + +class Test(object): + \"\"\" + Builds target formats from the reST sources. + \"\"\" + + def method1(self): + \"\"\"Return the template bridge configured.\"\"\" + pass + + def method2(self): + \"\"\"Load necessary templates and perform initialization. The default implementation does nothing. + \"\"\" + pass + +# There are three misbehaviors here: +# \* should have removed the whitespace at the beginning and end of the class docstring +# \* in method1, the \"pass\" should remain on its own line +# \* in method2, the closing triple-quote should get its own line, and the \"pass\" too + +")) + (py-bug-tests-intern 'more-docstring-filling-woes-lp-1102296-nil-base arg teststring))) + +(defun more-docstring-filling-woes-lp-1102296-nil-base () + (let ((py-docstring-style nil)) + (goto-char 178) + (assert (fill-paragraph) nil "more-docstring-filling-woes-lp-1102296-nil-test #1 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-nil-test #1 done") + (goto-char 259) + (fill-paragraph) + (forward-line 1) + (sit-for 0.2) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-nil-test #2 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-nil-test #2 done") + (goto-char 380) + (fill-paragraph) + (back-to-indentation) + (sit-for 0.1) + (assert (eq (char-after) 34) nil "more-docstring-filling-woes-lp-1102296-nil-test #3a failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-nil-test #3a done") + (search-forward "pass" nil t 1) + (beginning-of-line) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-nil-test #3c failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-nil-test #3c done"))) + +(defun more-docstring-filling-woes-lp-1102296-pep-257-nn-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# (I selected \"PEP-257-NN\" as the docstring fill style.) +# Given the following code: + +class Test(object): + \"\"\" + Builds target formats from the reST sources. + \"\"\" + + def method1(self): + \"\"\"Return the template bridge configured.\"\"\" + pass + + def method2(self): + \"\"\"Load necessary templates and perform initialization. The default implementation does nothing. + \"\"\" + pass + +# There are three misbehaviors here: +# \* should have removed the whitespace at the beginning and end of the class docstring +# \* in method1, the \"pass\" should remain on its own line +# \* in method2, the closing triple-quote should get its own line, and the \"pass\" too + +")) + (py-bug-tests-intern 'more-docstring-filling-woes-lp-1102296-pep-257-nn-base arg teststring))) + +(defun more-docstring-filling-woes-lp-1102296-pep-257-nn-base () + (let ((py-docstring-style 'pep-257-nn)) + (goto-char 178) + (assert (fill-paragraph) nil "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #1 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #1 done") + (goto-char 259) + (fill-paragraph) + (forward-line 1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #2 failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #2 done") + (goto-char 357) + (fill-paragraph) + (beginning-of-line) + (sit-for 0.1) + (assert (eq (current-indentation) 8) nil "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #3a failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #3a done") + (search-forward "pass") + (beginning-of-line) + (sit-for 0.1) + (assert (looking-at " pass") nil "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #3b failed") + (message "%s" "more-docstring-filling-woes-lp-1102296-pep-257-nn-test #3b done"))) + +(defun infinite-loop-on-lp-1156426-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +while mvi.t2 <= T: + +# calculate a spline for the kinematic inputs +#fname = 'data/monte_1000hz.mat' +")) + (py-bug-tests-intern 'infinite-loop-on-lp-1156426-base arg teststring))) + +(defun infinite-loop-on-lp-1156426-base () + (let ((py-indent-comments t)) + (goto-char 68) + (assert (eq 4 (py-compute-indentation)) nil "infinite-loop-on-lp-1156426-test #1 failed")) + (goto-char (point-max)) + (assert (eq 0 (py-compute-indentation)) nil "infinite-loop-on-lp-1156426-test #2 failed")) + +(defun fill-paragraph-in-docstring-lp-1161232-test (&optional arg) + (interactive "p") + (let ((teststring "def foo (): + \"\"\"Returns a rewritten path. + +Assuming that ``cr`` is a :class:`ContextRewriter` instance, that the rewriter maps the path ``views/`` to asdf asdf asdf asdf asdf asdf asdf asdf asdfasdf asdfasdf asdf asdf \"\"\" + pass +")) + (py-bug-tests-intern 'fill-paragraph-in-docstring-lp-1161232-base arg teststring))) + +(defun fill-paragraph-in-docstring-lp-1161232-base () + (goto-char 94) + (fill-paragraph t) + (sit-for 0.1) + (assert (eq (point) 51) nil "fill-paragraph-in-docstring-lp-1161232-test #1 failed") + (goto-char 249) + (sit-for 1) + (message "%s" (buffer-substring-no-properties (line-beginning-position) (line-end-position) )) + (assert (looking-at " pass") nil "fill-paragraph-in-docstring-lp-1161232-test #2 failed") + ) + +(defun wfmc-lp-1160022-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# which-func-misses-class-lp-1160022 +class kugel(object): + zeit = time.strftime('%Y%m%d--%H-%M-%S') + # zeit = time.strftime('%Y-%m-%d--%H-%M-%S') + spiel = [] + + def pylauf(self): + \"\"\"Eine Doku fuer pylauf\"\"\" + pass + +a = \"asdf\" +")) + (py-bug-tests-intern 'wfmc-lp-1160022-base arg teststring))) + +(defun wfmc-lp-1160022-base () + (imenu-add-menubar-index) + (goto-char 251) + (which-func-mode) + (company-mode -1) + (yas/minor-mode -1) + (hs-minor-mode -1) + (undo-tree-mode -1) + (abbrev-mode -1) + ;; (car (nth 2 (car '((#1="class kugel" (#1# . 85) ("kugel.pylauf" . 224)))))) + (assert (string= "kugel.pylauf" (car (nth 2 (eval '(car imenu--index-alist))))) nil "wfmc-lp-1160022-test failed")) + +(defun tab-results-in-never-ending-process-lp-1163423-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -\*- coding: utf-8 -\*- + class asdf(object): + zeit = time.strftime('%Y%m%d--%H-%M-%S') + + def utf8_exists(filename): + return os.path.exists(filename.encode('utf-8')) +")) + (py-bug-tests-intern 'tab-results-in-never-ending-process-lp-1163423-base arg teststring))) + +(defun tab-results-in-never-ending-process-lp-1163423-base () + (let ((py-tab-indents-region-p t) + (py-tab-indent t)) + (goto-char 216) + (push-mark) + (goto-char 122) + (call-interactively 'py-indent-line) + (sit-for 0.1) + ;; (message "point: %s" (point)) + (assert (bolp) nil "tab-results-in-never-ending-process-lp-1163423-test failed"))) + +(defun loops-on-if-else-lp-328777-test (&optional arg) + (interactive "p") + (let ((teststring "x = (if 1: 2 + else: 3) +")) + (py-bug-tests-intern 'loops-on-if-else-lp-328777-base arg teststring))) + +(defun loops-on-if-else-lp-328777-base () + (goto-char 14) + (assert (eq 5 (py-compute-indentation)) nil "loops-on-if-else-lp-328777-test failed")) + +(defun nested-dictionaries-indent-again-lp:1174174-test (&optional arg) + "With ARG greater 1 keep test buffer open. + +If no `load-branch-function' is specified, make sure the appropriate branch is loaded. Otherwise default python-mode will be checked. " + (interactive "p") + (let ((teststring " +d = {'a':{'b':3, + 'c':4 + } + } + +d = {'a':{ + 'b':3, + 'c':4 + } + } +")) + 1174174 + (py-bug-tests-intern 'nested-dictionaries-indent-again-lp:1174174 arg teststring))) + +(defun nested-dictionaries-indent-again-lp:1174174 () + (let ((py-indent-honors-multiline-listing t)) + (goto-char 19) + (assert (eq 10 (py-compute-indentation)) nil "nested-dictionaries-indent-again-lp:1174174-test #1 failed") + (goto-char 35) + (assert (eq 10 (py-compute-indentation)) nil "nested-dictionaries-indent-again-lp:1174174-test #2 failed") + (goto-char 47) + (assert (eq 5 (py-compute-indentation)) nil "nested-dictionaries-indent-again-lp:1174174-test #3 failed") + ;; (goto-char 57) + ;; (assert (eq 4 (py-compute-indentation)) nil "nested-dictionaries-indent-again-lp:1174174-test #4 failed") + ;; (goto-char 63) + ;; (assert (eq 0 (py-compute-indentation)) nil "nested-dictionaries-indent-again-lp:1174174-test #5 failed") + + )) + +(defun TAB-leaves-point-in-the-wrong-lp-1178453-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# r1225 + +import tarfile + +src = tarfile.open('src.tgz', 'r:gz') +dst = tarfile.open('dst.tgz', 'w:gz') + +for name in src.getnames(): + print('name:', name) + info = src.getmember(name) + fp = src.extractfile(name) + dst.addfile(info, fp) + +src.close() +dst.close() + +# Put point at the end of the `dst.addfile` line and hit return. Point is +# properly left on the next line right under the first 'd'. Now hit TAB. Point is +# correctly left at the beginning of the line. Hit TAB one more time. +# +# Now, while 4 spaces have been added to the beginning of the line, point is left +# at the beginning of the line instead of at the end of the just inserted +# whitespace. Point should be at column 4. +")) + (py-bug-tests-intern 'TAB-leaves-point-in-the-wrong-lp-1178453-base arg teststring))) + +(defun TAB-leaves-point-in-the-wrong-lp-1178453-base () + (goto-char 292) + (py-indent-line) + (assert (eq 4 (current-column)) nil "TAB-leaves-point-in-the-wrong-lp-1178453-test failed")) + +(defun Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# r1225 + +def foo(): + \"\"\"Line one of a comment. + + A paragraph of comments. These should get wrapped correctly. These should get wrapped correctly. + These should get wrapped correctly. + They do, but whooboy! + + Last line of comment. + \"\"\" + +# Put point somewhere in the middle paragraph and hit M-q (fill-paragraph). +# +# The paragraph gets properly wrapped, but the blank line before it and after it +# get additional 4 bogus spaces at the beginning of their lines. +")) + (py-bug-tests-intern 'Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-base arg teststring))) + +(defun Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-base () + (goto-char 97) + (message "paragraph-start: %s" paragraph-start) + (message "Fehler? %s" (buffer-substring-no-properties (line-beginning-position) (line-end-position))) + (fill-paragraph t) + (sit-for 0.1) + (message "Fehler? %s" (buffer-substring-no-properties (line-beginning-position) (line-end-position))) + (forward-line 1) + (sit-for 1) + (assert (and (bolp) (eolp)) nil "Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-test #1 failed") + (goto-char 140) + (fill-paragraph) + (end-of-line) + (assert (eq 70 (current-column)) nil "Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-test #2 failed") + (forward-line 3) + (assert (and (bolp) (eolp)) nil "Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-test #3 failed") + (goto-char 273) + (fill-paragraph) + (end-of-line) + (assert (eq 25 (current-column)) nil "Bogus-whitespace-left-in-docstring-after-wrapping-lp-1178455-test #4 failed")) + +(defun trouble-with-py-fill-paragraph-lp-1180653-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -\*- coding: utf-8 -\*- +# I'm trying to refill the following docstring: + +class BlockCache(object): + + def remove(self, inode, start_no, end_no=None): + \"\"\"Remove blocks for `inode` + + If `end_no` is not specified, remove just the `start_no` + block. + Otherwise removes all blocks from `start_no` to, but not + including, `end_no`. + + Note: if `get` and `remove` are called concurrently, then +it is + possible that a block that has been requested with `get` +and + passed to `remove` for deletion will not be deleted. + \"\"\" + + log.debug('remove(inode=%d, start=%d, end=%s): start', +inode, start_no, end_no) + + if end_no is None: + end_no = start_no + 1 + +# When I place the cursor on e.g. the first line (\"If `end_no`...) +# and execute M-x py-fill-paragraph, the buffer is scrolled such that +# this becomes the first visible line, and the indentation is +# removed. No filling occurs at all. +# +# Am I doing something wrong? py-docstring-style is set to +# pep-256-nn. +")) + (py-bug-tests-intern 'trouble-with-py-fill-paragraph-lp-1180653-base arg teststring))) + +(defun trouble-with-py-fill-paragraph-lp-1180653-base () + (goto-char 214) + (assert nil "trouble-with-py-fill-paragraph-lp-1180653-test failed")) + +(defun py-shell-in-a-shell-buffer-doesnt-work-lp:1182696-test (&optional arg) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'py-shell-in-a-shell-buffer-doesnt-work-lp:1182696-base arg teststring))) + +(defun py-shell-in-a-shell-buffer-doesnt-work-lp:1182696-base () + (let (py-split-windows-on-execute-p) + (shell) + (delete-other-windows) + ;; (set-buffer (py-shell)) + (py-shell) + ;; (assert (string= "*shell*" (buffer-name)) nil "py-shell-in-a-shell-buffer-doesnt-work-lp:1182696-test #1 failed") + (assert (string= "*shell*" (buffer-name)) nil "py-shell-in-a-shell-buffer-doesnt-work-lp:1182696-test #1 failed") + (let ((py-switch-buffers-on-execute-p t)) + (py-shell)) + (sit-for 0.1) + (assert (string= "*Python*" (buffer-name)) nil "py-shell-in-a-shell-buffer-doesnt-work-lp:1182696-test #2 failed"))) + +(defun from-within-py-shell-call-another-instance-lp-1169687-test (&optional arg) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'from-within-py-shell-call-another-instance-lp-1169687-base arg teststring))) + +(defun from-within-py-shell-call-another-instance-lp-1169687-base () + (let ((py-split-windows-on-execute-p t) + (py-switch-buffers-on-execute-p t)) + (py-shell) + (sit-for 0.1) + (py-shell nil nil nil t nil nil nil t) + (assert (string-match "\\*Python\\*\<[0-9]+\>" (buffer-name)) nil "from-within-py-shell-call-another-instance-lp-1169687-test failed"))) + +(defun multibuffer-mayhem-lp-1162q272-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def do_something(): +wrong_indent +")) + (py-bug-tests-intern 'multibuffer-mayhem-lp-1162272-base arg teststring))) + +(defun multibuffer-mayhem-lp-1162272-base () + (assert (py-execute-buffer) nil "multibuffer-mayhem-lp-1162272-test failed")) + +(defun incorrect-indentation-with-tertiary-lp-1189604-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Put point right after the 'c' on the last line and hit return. You +# will be indented to column 8 when you should be indented to column +# 13. + +def foo(c): + a = 1 + other = ('yes' + if a == c +")) + (py-bug-tests-intern 'incorrect-indentation-with-tertiary-lp-1189604-base arg teststring))) + +(defun incorrect-indentation-with-tertiary-lp-1189604-base () + (assert (eq 13 (py-compute-indentation)) nil "incorrect-indentation-with-tertiary-lp-1189604-test failed")) + +(defun indentation-doesnt-honor-comment-on-preceding-lp-1190288-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# Put point at the end of the comment line and hit return. The next +# line indents to column 8 when it should indent to column 4. + +def foo(): + with bar() as baz: + baz.frobnicate() + # This is a comment +")) + (py-bug-tests-intern 'indentation-doesnt-honor-comment-on-preceding-lp-1190288-base arg teststring))) + +(defun indentation-doesnt-honor-comment-on-preceding-lp-1190288-base () + (assert (eq 4 (py-compute-indentation)) nil "indentation-doesnt-honor-comment-on-preceding-lp-1190288-test failed")) + +(defun fill-paragraph-corrupts-the-lp-1162912-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +# Put point on the whitespace at the beginning of the line that +# starts with 'The' inside the docstring and hit M-q. You end up with +# the following: +# +# -----snip snip----- +# def foo(): +# \"\"\"This is a function. +# The function does some stuff that is very interesting. It's hard to +# describe, but you will certainly love it when you try it. It's +# one +# of the best functions ever written, not just by me, but by all +# of +# mankind. Well, that may be overstating it, but it is a wondeful +# function. \"\"\" + +def foo(): + \"\"\"This is a function. + + The function does some stuff that is very interesting. It's +hard to + describe, but you will certainly love it when you try it. It's +one of the + best functions ever written, not just by me, but by all of +mankind. + Well, that may be overstating it, but it is a wondeful +function. + \"\"\" + +")) + (py-bug-tests-intern 'fill-paragraph-corrupts-the-lp-1162912-base arg teststring))) + +(defun fill-paragraph-corrupts-the-lp-1162912-base () + (goto-char 616) + (fill-paragraph) + (forward-line 1) + (assert (eq 4 (current-indentation)) nil "fill-paragraph-corrupts-the-lp-1162912-test failed")) + +(defun return-key-is-broken-lp-1191158-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# A recent change broke the return key. +# +# Put point at the end of the last line and hit return. You correctly end +# up on a new line at column 8. But hit return again and point doesn't +# move! It should insert a blank line and leave you at column 8 on a new +# line. + +def foo(): + with open('foo') as fp: + do_something()")) + (py-bug-tests-intern 'return-key-is-broken-lp-1191158-base arg teststring))) + +(defun return-key-is-broken-lp-1191158-base () + (goto-char 378) + (py-newline-and-indent) + (py-newline-and-indent) + (message "%s" (point) ) + ;; (sit-for 0.1) + (assert (and (eq 14 (count-lines (point-min) (point))) (eq 8 (current-column))) nil "return-key-is-broken-lp-1191158-test failed")) + +(defun indent-refused-lp-1191133-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def(foo): +")) + (py-bug-tests-intern 'indent-refused-lp-1191133-base arg teststring))) + +(defun indent-refused-lp-1191133-base () + (message "%s" (current-buffer)) + ;; (switch-to-buffer (current-buffer)) + (assert (eq 4 (py-compute-indentation)) nil "indent-refused-lp-1191133-test failed")) + +(defun Parens-span-multiple-lines-lp-1191225-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# On Jun 14, 2013, at 05:04 PM, Felipe Reyes wrote: +def foo(): + if (foo && + baz): + bar() +# >> This example raises a pep8 warning[0], +# >> I've been dealing with it and manually +# >> adding another indentation level to not leave 'baz' aligned with 'baz +# ()' +# >> +def foo(): + if (foo && + baz): + bar() +")) + (py-bug-tests-intern 'Parens-span-multiple-lines-lp-1191225-base arg teststring))) + +(defun Parens-span-multiple-lines-lp-1191225-base () + (let (py-indent-paren-spanned-multilines-p) + (goto-char 126) + (assert (eq 8 (py-compute-indentation)) nil "Parens-span-multiple-lines-lp-1191225-test #1 failed") + (goto-char 354) + (setq py-indent-paren-spanned-multilines-p t) + (assert (eq 12 (py-compute-indentation)) nil "Parens-span-multiple-lines-lp-1191225-test #2 failed"))) + +(defun Bogus-dedent-when-typing-colon-in-dictionary-literal-lp-1197171-test (&optional arg) + (interactive "p") + (let + ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(): + bar('thing', + {'another' + +# Put point at the end of the last line and hit colon, as you would to +# separate the key from the value. The last line will incorrectly dedent +# to column 4. Indentation should not change. + +")) + (py-bug-tests-intern 'Bogus-dedent-when-typing-colon-in-dictionary-literal-lp-1197171-base arg teststring))) + +(defun Bogus-dedent-when-typing-colon-in-dictionary-literal-lp-1197171-base () + (goto-char 94) + (assert (eq 8 (py-compute-indentation)) nil "Bogus-dedent-when-typing-colon-in-dictionary-literal-lp-1197171-test failed")) + +(defun Non-indenting-colon-lp-1207405-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -\*- coding: utf-8 -\*- +def foo(bar): + for i in range(10) + print(i) + tied = bar[ + +# Put point on the last line, after the open bracket. Hit colon (as if you +# were going to type bar[:]). The line gets incorrectly indented to under +# the `print`. +# +# There may be other situations where colons should not re-indent the +# line. + +")) + (py-bug-tests-intern 'Non-indenting-colon-lp-1207405-base arg teststring))) + +(defun Non-indenting-colon-lp-1207405-base () + (goto-char 81) + (py-electric-colon t) + (message "(current-indentation): %s" (current-indentation)) + (assert (eq 4 (current-indentation)) nil "Non-indenting-colon-lp-1207405-test #1 failed") + (goto-char 118) + (ignore-errors (py-electric-colon 1)) + (assert (eq 4 (current-indentation)) nil "Non-indenting-colon-lp-1207405-test #2 failed")) + +;; (defun missing-py-variable-name-face-lp-1215791-test (&optional arg) +;; (interactive "p") +;; (let ((teststring "a = b = c = 5 +;; a, b, c = (1, 2, 3) +;; # http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-08/msg00740. +;; # html +;; # +;; # The symptom is that in the code: +;; +;; # no s'ha trobat cap oferta, l'alumne queda sense assignar +;; # (alumne.assignacio == None) +;; self._logger.info( +;; u\"no assigna '%s'\", +;; alumne.id +;; ) +;; alumne.assignacio = None +;; +;; # 'alumne.assignacio' isn't properly colorized after visiting the +;; # file. +;; # +;; # In order to reproduce this behaviour: +;; # +;; # emacs -Q /tmp/bugtest.py +;; # +;; # type: +;; +;; # a = +;; variable = \"value\" +;; a = b = c = 5 +;; a, b, c = (1, 2, 3) +;; ")) +;; (py-bug-tests-intern 'missing-py-variable-name-face-lp-1215791-base arg teststring))) + +(defun missing-py-variable-name-face-lp-1215791-test (&optional arg) + (interactive "p") + (let ((teststring "# a == +variable = \"value\" +a = b = c = 5 +a, b, c = (1, 2, 3) +# http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-08/msg00740. +# html +# +# The symptom is that in the code: + + # no s'ha trobat cap oferta, l'alumne queda sense assignar + # (alumne.assignacio == None) + self._logger.info( + u\"no assigna '%s'\", + alumne.id + ) + alumne.assignacio = None + +# 'alumne.assignacio' isn't properly colorized after visiting the +# file. +# +# In order to reproduce this behaviour: + +")) + (py-bug-tests-intern 'missing-py-variable-name-face-lp-1215791-base arg teststring))) + +(defun missing-py-variable-name-face-lp-1215791-base () + ;; (goto-char 6) + (goto-char 27) + (sit-for 0.1) + (assert (eq (get-char-property (point) 'face) 'py-variable-name-face) nil "missing-py-variable-name-face-lp-1215791-test #1 failed") + (goto-char 44) + (assert (eq (get-char-property (point) 'face) 'py-variable-name-face) nil "missing-py-variable-name-face-lp-1215791-test #2 failed") + (goto-char 360) + (assert (eq (get-char-property (point) 'face) 'py-variable-name-face) nil "missing-py-variable-name-face-lp-1215791-test #3 failed") + + ) + +(defun C-c-C-c-lp:1221310-and-store-result-test (&optional arg) + (interactive "p") + (let ((teststring "print(\"C-c-C-c-lp:1221310-and-store-result-test\") +")) + (py-bug-tests-intern 'C-c-C-c-lp:1221310-and-store-result-base arg teststring))) + +(defun C-c-C-c-lp:1221310-and-store-result-base () + (write-file (concat py-temp-directory "/lp-1221310.py")) + (assert (let ((py-store-result-p t)) + (sit-for 0.1) + (string= "C-c-C-c-lp:1221310-and-store-result-test" (py-execute-base))) nil "C-c-C-c-lp:1221310-and-store-result-test failed")) + +(defun py-empty-line-closes-p-lp-1235324-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +if True: + if True: + print(\"This line is part of the inner statement\") + + print(\"This line is NOT part of the inner statement\") +\") +")) + (py-bug-tests-intern 'py-empty-line-closes-p-lp-1235324-base arg teststring))) + +(defun py-empty-line-closes-p-lp-1235324-base () + (goto-char (point-min)) + (let (py-empty-line-closes-p) + (search-forward "print" nil t 2) + (assert (eq 8 (py-compute-indentation)) nil "py-empty-line-closes-p-lp-1235324-test #1 failed")) + (let ((py-empty-line-closes-p t)) + (assert (eq 4 (py-compute-indentation)) nil "py-empty-line-closes-p-lp-1235324-test #2 failed"))) + +(defun py-docstring-style-pep-257-nn-closing-quotes-lp-1241147-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +class Class(object): + \"\"\"A long long long long long long long long long long long +long long long long long long long line.\"\"\" +")) + (py-bug-tests-intern 'py-docstring-style-pep-257-nn-closing-quotes-lp-1241147-base arg teststring))) + +(defun py-docstring-style-pep-257-nn-closing-quotes-lp-1241147-base () + (let ((py-docstring-style 'pep-257-nn)) + (forward-line -1) + (fill-paragraph) + (sit-for 0.1) + (assert (search-forward " \"\"\"") nil "py-docstring-style-pep-257-nn-closing-quotes-lp-1241147-test failed"))) + +(defun indentation-after-parentized-assignment-lp-1243012-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +def main(): + (a, b) = (1, 2) +")) + (py-bug-tests-intern 'indentation-after-parentized-assignment-lp-1243012-base arg teststring))) + +(defun indentation-after-parentized-assignment-lp-1243012-base () + (goto-char 40) + (assert nil "indentation-after-parentized-assignment-lp-1243012-test failed")) + +(defun py-execute-buffer-ipython-lp-1252643-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +print(1234) +")) + (py-bug-tests-intern 'py-execute-buffer-ipython-lp-1252643-base arg teststring))) + +(defun py-execute-buffer-ipython-lp-1252643-base () + (let ((py-switch-buffers-on-execute-p t)) + (py-execute-buffer-ipython) + (sit-for 1) + (assert (string= "*Ipython*" (buffer-name (current-buffer))) nil "py-execute-buffer-ipython-lp-1252643-test failed"))) + + +(defun Execute-region_statement-runs-full-file-lp-1269855-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def s (n): + sum=0 + for i in range(1,n+1): + sum += i + #print i + return sum + +print s(10) +print s(100) +print s(500) +")) + (py-bug-tests-intern 'Execute-region_statement-runs-full-file-lp-1269855-base arg teststring))) + +(defun Execute-region_statement-runs-full-file-lp-1269855-base () + (py-execute-buffer) + (goto-char 149) + (py-execute-statement) + (assert nil "Execute-region_statement-runs-full-file-lp-1269855-test failed")) + + +(defun abbrevs-changed-t-when-starting-lp-1270631-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +")) + (py-bug-tests-intern 'abbrevs-changed-t-when-starting-lp-1270631-base arg teststring))) + +(defun abbrevs-changed-t-when-starting-lp-1270631-base () + (assert (eq nil abbrevs-changed) nil "abbrevs-changed-t-when-starting-lp-1270631-test failed")) + + +(provide 'py-bug-numbered-tests) +;;; py-bug-numbered-tests.el ends here diff --git a/elpa/python-mode-6.1.3/test/py-bug-numbered-tests.elc b/elpa/python-mode-6.1.3/test/py-bug-numbered-tests.elc new file mode 100644 index 0000000000000000000000000000000000000000..ea31a951b764403db4977a49a00cc80ba737d3b7 GIT binary patch literal 421346 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 literal 0 HcmV?d00001 diff --git a/elpa/python-mode-6.1.3/test/py-shell-completion-tests.el b/elpa/python-mode-6.1.3/test/py-shell-completion-tests.el new file mode 100644 index 000000000..f49edca11 --- /dev/null +++ b/elpa/python-mode-6.1.3/test/py-shell-completion-tests.el @@ -0,0 +1,173 @@ +;;; py-shell-completion-tests.el --- Test completion for available Python shell + +;; Author: Andreas Roehler +;; Keywords: languages, convenience + +;; 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 . + +;;; Commentary: Edit `py-test-pyshellname-list' before +;; running this test-builder or give a list of shells as +;; arguments + +;;; Code: + +(setq python-mode-shell-complete-tests + (list + + 'python-shell-complete-test + 'usr-bin-python-shell-complete-test + 'usr-bin-python2.7-shell-complete-test + ;; 'arbeit-python-epdfree-epd_free-7.2-2-rh5-x86-bin-python2.7-shell-complete-test + 'usr-bin-python3-shell-complete-test + ;; 'usr-bin-python3.2-shell-complete-test + ;; 'ipython-shell-complete-test + ;; 'usr-bin-ipython-shell-complete-test + ;; 'arbeit-python-epd_free-7.1-2-rh5-x86-bin-ipython-shell-complete-test + ) +) + +(defun py-run-shell-complete-tests () + (interactive) + (dolist (ele python-mode-shell-complete-tests) + (funcall ele) + ;; (sit-for 1) +)) + +(defun python-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + ;; (set-buffer (py-shell nil t "python" nil "/")) + (set-buffer (py-shell nil t "python")) + (when (interactive-p) (switch-to-buffer (current-buffer))) + (sit-for 0.2 t) + (goto-char (point-max)) + (save-excursion + (insert "pri") + (py-shell-complete)) + (sit-for 0.5) + (assert (looking-at "print") nil "python-shell-complete-test failed") + (message "%s" "python-shell-complete-test passed"))) + + +(defun usr-bin-python-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + (set-buffer (py-shell nil t "/usr/bin/python" nil "/")) + (switch-to-buffer (current-buffer)) + (sit-for 0.1) + (goto-char (point-max)) + (insert "pri") + (py-shell-complete) + (forward-word -1) + (sit-for 0.1) + (assert (looking-at "print") nil "usr-bin-python-shell-complete-test failed") + (when py-verbose-p (message "%s" "usr-bin-python-shell-complete-test passed")))) + + +(defun usr-bin-python2.7-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + (set-buffer (py-shell nil t "/usr/bin/python2.7" nil "/")) + (when (interactive-p) (switch-to-buffer (current-buffer))) + (sit-for 0.1) + (goto-char (point-max)) + (insert "pri") + (py-shell-complete) + (forward-word -1) + (assert (looking-at "print") nil "usr-bin-python2.7-shell-complete-test failed") + (message "%s" "usr-bin-python2.7-shell-complete-test passed"))) + + +(defun arbeit-python-epdfree-epd_free-7.2-2-rh5-x86-bin-python2.7-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + (set-buffer (py-shell nil t "~/arbeit/python/epdfree/epd_free-7.2-2-rh5-x86/bin/python2.7" nil "/")) + (sit-for 0.2 t) + (goto-char (point-max)) + (insert "pri") + (py-shell-complete) + (sit-for 0.1) + (forward-word -1) + (assert (looking-at "print") nil "arbeit-python-epdfree-epd_free-7.2-2-rh5-x86-bin-python2.7-shell-complete-test failed") + (when py-verbose-p (message "%s" "arbeit-python-epdfree-epd_free-7.2-2-rh5-x86-bin-python2.7-shell-complete-test passed")))) + +(defun usr-bin-python3-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + (set-buffer (py-shell nil t "/usr/local/bin/python3" nil "/")) + (when (interactive-p) (switch-to-buffer (current-buffer))) + (goto-char (point-max)) + (insert "pri") + (py-shell-complete) + (forward-word -1) + (sit-for 0.1) + (assert (looking-at "print") nil "usr-bin-python3-shell-complete-test failed") + (message "%s" "usr-bin-python3-shell-complete-test passed"))) + +(defun ipython-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + (set-buffer (py-shell nil t "ipython")) + (switch-to-buffer (current-buffer)) + (sit-for 2) + (goto-char (point-max)) + ;; (comint-send-input) + (insert "pri") + + (py-shell-complete) + (sit-for 0.1) + (assert (looking-back "print") nil "ipython-shell-complete-test failed") + (message "%s" "ipython-shell-complete-test passed"))) + + +(defun usr-bin-ipython-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + (set-buffer (py-shell nil t "/usr/bin/ipython" nil "/")) + (sit-for 0.1) + (goto-char (point-max)) + (insert "pri") + (py-shell-complete) + (sit-for 1 t) + (forward-word -1) + (assert (looking-at "print") nil "usr-bin-ipython-shell-complete-test failed") + (message "%s" "usr-bin-ipython-shell-complete-test passed"))) + + +(defun arbeit-python-epd_free-7.1-2-rh5-x86-bin-ipython-shell-complete-test () + (interactive) + (let (py-shell-switch-buffers-on-execute-p + py-split-windows-on-execute-p) + (set-buffer (py-shell nil t "~/arbeit/python/epd_free-7.1-2-rh5-x86/bin/ipython" nil "/")) + (sit-for 0.1) + (switch-to-buffer (current-buffer)) + (goto-char (point-max)) + (insert "pri") + (py-shell-complete) + (sit-for 1 t) + (forward-word -1) + (assert (looking-at "print") nil "arbeit-python-epd_free-7.1-2-rh5-x86-bin-ipython-shell-complete-test failed") + (message "%s" "arbeit-python-epd_free-7.1-2-rh5-x86-bin-ipython-shell-complete-test passed"))) + + + +(provide 'py-shell-completion-tests) +;;; py-shell-completion-tests ends here diff --git a/elpa/python-mode-6.1.3/test/py-shell-completion-tests.elc b/elpa/python-mode-6.1.3/test/py-shell-completion-tests.elc new file mode 100644 index 0000000000000000000000000000000000000000..ba8f5f7dd1c3f2998ffa283b76bb427c90adbb8b GIT binary patch literal 5420 zcmc&&U2oeq6wPDdr)?Ovbx)j%VoecBA|=^v^U@;dfC2;dumO9hi-MNuSg0(yqMS5+ z=x^U4_2Dl`R+khB;7H=fC3Vla=U(dk^`93%pPZbG&d<-uMYdeUiHykXhAc&~h=qC| z$!ifV3You5^UHv))6}!|oxN7}WgbU%x)y0D?J!%CEG7S9_FrK^SU}v#i(vdBV1&EO zH}>Z_2FHKFAt8#;D zB^8NoQn8Ff5@n$(@;JRzXXwpUK|~bcMVoclbDKXuun}djk!A%6v$PNxye{VS8Cp{M z>hFs;Z%DWhxd`D~b!L_qX+%^;LXnc0BuOTA7O7rF5h?N{mN_XF7|6YHUEp`CKfQt5 z{*6YXC$pPE0+>h=YwEcSKaQV=pZ~{qriHr`i@e>&b_Y#aVo9n2Eq!FIaypAsI(P`5 z+LK+*l&kDn^4i9{BmU{=NhIeYK|GM(!M=Q*wvANe(c3gmi1k3f@xv)+?AIxGgP%^O z=}Z0eJ;8r>n!eHxKcLHhaH5Ak#qA)UNQ4fhQI^E2prBMjDZz^Gh^H^+c5kmHfZBXm zZ57LNy_;Vi>W!EuAcbr2=%d-J=Z>*!*ZWcLbh7%bY{Xl5OoQuBE!`5$Ogm=)oAIz3 z>T$Q~V0@)bRThe@GC~v5=FQ5UJS*r~?(+G<2e{h|F_LtQKk`3z-8x8Chg0l@gZ-m&eNLov;#0VFLKr z4)%bk*nsWHw#S023VJ3|2`B>( zSPu^dVAIZr0TUZujEC@|QwlfS=nw>OLreL%=7u{l!T@zceE(0HfN*RAD!9I@NdTGP ztYS?i1DX}zQVRA+z-GVB72WxqlshRr?33z5$x1g=V=auv;UDJib+ z&CO(LbINJH2z%hSbW`B zW|O<7QLnIkaZ2A-!s1lE)z`|m+pgV`poV?JG7lpVo^FaA19*EA+xUJJ7w>qHW2D`s zerv&2S7Ao4>MXZY+6+*#hKj7talFoPUd=wFD;Cr_ZbQX;Rk9=tMY6>xZ;+aG6*r*Q zhKYSt8v@Ia1lJDeF;c`m2Z5t$ZBysgIm|`9!pe%Yn+9f(SEFB3!S$c&bXb!?%T}4x zj1YaxJXZOjr-13JVK>;$MEGI9itY1nJF0y%8Z?j8v3)jQsX%ejV(a zLyJx|_i<=xDwPImQ?E8>l&Jx6k42Fb|p8z}-=v9wd;a{9t?KN8kQ#LkPgh z%Ghth{h$Cb;jWKL8)`IXojTg@uZV3aIO;-U%ZVl}bdu-b^xKsbj +;; Keywords: languages, convenience + +;; 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 . + +;;; Code: + +(defun py-execute-statement-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-test\")")) + (py-bug-tests-intern 'py-execute-statement-base arg teststring))) + +(defun py-execute-statement-base () + (assert (py-execute-statement) nil "py-execute-statement-test failed")) + +(defun py-execute-block-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-test\")")) + (py-bug-tests-intern 'py-execute-block-base arg teststring))) + +(defun py-execute-block-base () + (assert (py-execute-block) nil "py-execute-block-test failed")) + +(defun py-execute-block-or-clause-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-base arg teststring))) + +(defun py-execute-block-or-clause-base () + (assert (py-execute-block-or-clause) nil "py-execute-block-or-clause-test failed")) + +(defun py-execute-def-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-test\")")) + (py-bug-tests-intern 'py-execute-def-base arg teststring))) + +(defun py-execute-def-base () + (assert (py-execute-def) nil "py-execute-def-test failed")) + +(defun py-execute-class-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-test\")")) + (py-bug-tests-intern 'py-execute-class-base arg teststring))) + +(defun py-execute-class-base () + (assert (py-execute-class) nil "py-execute-class-test failed")) + +(defun py-execute-region-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-test\")")) + (py-bug-tests-intern 'py-execute-region-base arg teststring))) + +(defun py-execute-region-base () + (assert (eq nil (py-execute-region (line-beginning-position) (line-end-position))) nil "py-execute-region-test failed")) + +(defun py-execute-buffer-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-test\")")) + (py-bug-tests-intern 'py-execute-buffer-test-base arg teststring))) + +(defun py-execute-buffer-test-base () + (assert (py-execute-buffer) nil "py-execute-buffer-test failed")) + +(defun py-execute-expression-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-test\")")) + (py-bug-tests-intern 'py-execute-expression-base arg teststring))) + +(defun py-execute-expression-base () + (assert (py-execute-expression) nil "py-execute-expression-test failed")) + +(defun py-execute-line-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-test\")")) + (py-bug-tests-intern 'py-execute-line-base arg teststring))) + +(defun py-execute-line-base () + (assert (py-execute-line) nil "py-execute-line-test failed")) + +(defun beginning-of-block-fails-from-wrong-indent-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +with file(\"roulette-\" + zeit + \".csv\", 'w') as datei: + for i in range(anzahl): + klauf.pylauf() + datei.write(str(spiel[i]) + \"\\n\") +")) + (py-bug-tests-intern 'beginning-of-block-fails-from-wrong-indent-base arg teststring))) + +(defun beginning-of-block-fails-from-wrong-indent-base () + (goto-char 102) + (assert (eq 48 (py-beginning-of-block)) nil "beginning-of-block-fails-from-wrong-indent-test failed")) + +(defun py-execute-file-test (&optional arg) + (interactive "p") + (let ((teststring "print(3)")) + (py-bug-tests-intern 'py-execute-file-intern arg teststring))) + +(defun py-execute-file-intern () + (let ((py-store-result-p t) + (file (concat py-temp-directory "/py-execute-file-test.py"))) + (write-file file) + ;; (sit-for 0.1) + (unwind-protect + (setq erg (py-execute-file file)) + (assert (string= "3" erg) nil "py-execute-file-test failed") + (delete-file file)))) + +(provide 'python-executes-test) +;;; python-executes-test.el ends here diff --git a/elpa/python-mode-6.1.3/test/python-executes-test.elc b/elpa/python-mode-6.1.3/test/python-executes-test.elc new file mode 100644 index 0000000000000000000000000000000000000000..5b612f7c493235f962a6502b69e951280755c5ea GIT binary patch literal 5070 zcmc&&OK;;g5YBPehxX7zAE#LbXsm81+mfB^CMeJ%*h7E6i6yr z=ht^gS(Xw%A}5=z0YwTqFMcze;qd&!9~a*r92|7c&(GmP&U2oz6vhjfQ#0dK|C_Q~ zn#>GSzX>%RkwS32?jybGfbOmn0;nRfdj-21}t+b zxPT8<1l%yCIT{oWgD42y+$}dVpjieoH+;_Ts6hf9bll{}8P}z4g=QMkg`jhuKq?b$ z6c zsiz_ZEg_)-#tbq^?MgyZN<4l2>Az>JmdeL>y`dI^>`|ET%-IPsehA{(2`GPFH zL$slW&6zOHO>lVC{n^4V1d2%Ir_$QWAE~4j-W8usyX(2&(4mEsk1~AWMoQg<``4Wu3-p*XW-@Dwg2eq zEC;U6F`&(TK!b;`5Abtf3-`Qnv-XrhXdOj(-Etwau^>$WoCcqnI-OZ@BLp(jNGlZ$B5@ z=X-`T$V$>yx2z~ikXt$k)6vT~1qH)IO6dAKw?U=9jV~;1Tl_29r(tf5U(Yj@t!;xJ zV_uhq7p?fR8QqC)gKup^8-z>hwiwscPeZv}#5&Hk&25oZY>E}}WdeCe4sWP!gYJ^N zExZl#Ccd^(E=ZSKhiL@TE zb$Z=Bja66vxrS(aoh>F4roOsw#u2Zdeyv zyRObT%dYsf?{vnozz~SV=H_h=KzHuLJ>@h*XT0p}%F5+R);G3fxz4pJS)*m!H^ACv zo6uE>s^S2K@2aR;pCmhjq~$iYuHBqE_lT-;$3~C0(oS31VYlg{8{`dahp%ke|Lez} z@OARK!txXWKZ&D3-;E5udt0~Ec+-%Rlq;4PsTSpR4#KVRKSr>86qzA8;yeWd9^NCZ zZYfsaV2pa;Vv*P}=yt~o+y}T{7J(t8{-OJV@cTHhcIDRkkD!*=0x5^eN k!wturPVDS`zj-ZT1uc&uxso>=O~D%$cQtnJ4$SZT2iW3mfdBvi literal 0 HcmV?d00001 diff --git a/elpa/python-mode-6.1.3/test/python-extended-executes-test.el b/elpa/python-mode-6.1.3/test/python-extended-executes-test.el new file mode 100644 index 000000000..38a2f3d7f --- /dev/null +++ b/elpa/python-mode-6.1.3/test/python-extended-executes-test.el @@ -0,0 +1,2545 @@ +;;; python-extended-executes-test.el --- extended-executes test +;; Author: Andreas Roehler +;; Keywords: languages, convenience + +;; 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 . + +;;; Code: + + +(defun py-execute-statement-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python-test\")")) + (py-bug-tests-intern 'py-execute-statement-python-base arg teststring))) + +(defun py-execute-statement-python-base () + (assert (py-execute-statement-python) nil "py-execute-statement-python-test failed")) + +(defun py-execute-statement-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python-switch-base arg teststring))) + +(defun py-execute-statement-python-switch-base () + (assert (py-execute-statement-python-switch) nil "py-execute-statement-python-switch-test failed")) + +(defun py-execute-statement-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python-no-switch-base arg teststring))) + +(defun py-execute-statement-python-no-switch-base () + (assert (py-execute-statement-python-no-switch) nil "py-execute-statement-python-no-switch-test failed")) + +(defun py-execute-statement-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-statement-python-dedicated-base arg teststring))) + +(defun py-execute-statement-python-dedicated-base () + (assert (py-execute-statement-python-dedicated) nil "py-execute-statement-python-dedicated-test failed")) + +(defun py-execute-statement-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python-dedicated-switch-base arg teststring))) + +(defun py-execute-statement-python-dedicated-switch-base () + (assert (py-execute-statement-python-dedicated-switch) nil "py-execute-statement-python-dedicated-switch-test failed")) + +(defun py-execute-statement-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-ipython-test\")")) + (py-bug-tests-intern 'py-execute-statement-ipython-base arg teststring))) + +(defun py-execute-statement-ipython-base () + (sit-for 0.1) + (assert (py-execute-statement-ipython) nil "py-execute-statement-ipython-test failed")) + +(defun py-execute-statement-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-ipython-switch-base arg teststring))) + +(defun py-execute-statement-ipython-switch-base () + (assert (py-execute-statement-ipython-switch) nil "py-execute-statement-ipython-switch-test failed")) + +(defun py-execute-statement-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-ipython-no-switch-base arg teststring))) + +(defun py-execute-statement-ipython-no-switch-base () + (assert (py-execute-statement-ipython-no-switch) nil "py-execute-statement-ipython-no-switch-test failed")) + +(defun py-execute-statement-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-statement-ipython-dedicated-base arg teststring))) + +(defun py-execute-statement-ipython-dedicated-base () + (assert (py-execute-statement-ipython-dedicated) nil "py-execute-statement-ipython-dedicated-test failed")) + +(defun py-execute-statement-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-statement-ipython-dedicated-switch-base () + (assert (py-execute-statement-ipython-dedicated-switch) nil "py-execute-statement-ipython-dedicated-switch-test failed")) + +(defun py-execute-statement-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3-base arg teststring))) + +(defun py-execute-statement-python3-base () + (assert (py-execute-statement-python3) nil "py-execute-statement-python3-test failed")) + +(defun py-execute-statement-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3-switch-base arg teststring))) + +(defun py-execute-statement-python3-switch-base () + (assert (py-execute-statement-python3-switch) nil "py-execute-statement-python3-switch-test failed")) + +(defun py-execute-statement-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3-no-switch-base arg teststring))) + +(defun py-execute-statement-python3-no-switch-base () + (assert (py-execute-statement-python3-no-switch) nil "py-execute-statement-python3-no-switch-test failed")) + +(defun py-execute-statement-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3-dedicated-base arg teststring))) + +(defun py-execute-statement-python3-dedicated-base () + (assert (py-execute-statement-python3-dedicated) nil "py-execute-statement-python3-dedicated-test failed")) + +(defun py-execute-statement-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-statement-python3-dedicated-switch-base () + (assert (py-execute-statement-python3-dedicated-switch) nil "py-execute-statement-python3-dedicated-switch-test failed")) + +(defun py-execute-statement-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2-base arg teststring))) + +(defun py-execute-statement-python2-base () + (assert (py-execute-statement-python2) nil "py-execute-statement-python2-test failed")) + +(defun py-execute-statement-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2-switch-base arg teststring))) + +(defun py-execute-statement-python2-switch-base () + (assert (py-execute-statement-python2-switch) nil "py-execute-statement-python2-switch-test failed")) + +(defun py-execute-statement-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2-no-switch-base arg teststring))) + +(defun py-execute-statement-python2-no-switch-base () + (assert (py-execute-statement-python2-no-switch) nil "py-execute-statement-python2-no-switch-test failed")) + +(defun py-execute-statement-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2-dedicated-base arg teststring))) + +(defun py-execute-statement-python2-dedicated-base () + (assert (py-execute-statement-python2-dedicated) nil "py-execute-statement-python2-dedicated-test failed")) + +(defun py-execute-statement-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-statement-python2-dedicated-switch-base () + (assert (py-execute-statement-python2-dedicated-switch) nil "py-execute-statement-python2-dedicated-switch-test failed")) + +(defun py-execute-statement-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2.7-base arg teststring))) + +(defun py-execute-statement-python2.7-base () + (assert (py-execute-statement-python2.7) nil "py-execute-statement-python2.7-test failed")) + +(defun py-execute-statement-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2.7-switch-base arg teststring))) + +(defun py-execute-statement-python2.7-switch-base () + (assert (py-execute-statement-python2.7-switch) nil "py-execute-statement-python2.7-switch-test failed")) + +(defun py-execute-statement-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2.7-no-switch-base arg teststring))) + +(defun py-execute-statement-python2.7-no-switch-base () + (assert (py-execute-statement-python2.7-no-switch) nil "py-execute-statement-python2.7-no-switch-test failed")) + +(defun py-execute-statement-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2.7-dedicated-base arg teststring))) + +(defun py-execute-statement-python2.7-dedicated-base () + (assert (py-execute-statement-python2.7-dedicated) nil "py-execute-statement-python2.7-dedicated-test failed")) + +(defun py-execute-statement-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-statement-python2.7-dedicated-switch-base () + (assert (py-execute-statement-python2.7-dedicated-switch) nil "py-execute-statement-python2.7-dedicated-switch-test failed")) + +(defun py-execute-statement-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-jython-test\")")) + (py-bug-tests-intern 'py-execute-statement-jython-base arg teststring))) + +(defun py-execute-statement-jython-base () + (assert (py-execute-statement-jython) nil "py-execute-statement-jython-test failed")) + +(defun py-execute-statement-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-jython-switch-base arg teststring))) + +(defun py-execute-statement-jython-switch-base () + (assert (py-execute-statement-jython-switch) nil "py-execute-statement-jython-switch-test failed")) + +(defun py-execute-statement-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-jython-no-switch-base arg teststring))) + +(defun py-execute-statement-jython-no-switch-base () + (assert (py-execute-statement-jython-no-switch) nil "py-execute-statement-jython-no-switch-test failed")) + +(defun py-execute-statement-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-statement-jython-dedicated-base arg teststring))) + +(defun py-execute-statement-jython-dedicated-base () + (assert (py-execute-statement-jython-dedicated) nil "py-execute-statement-jython-dedicated-test failed")) + +(defun py-execute-statement-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-statement-jython-dedicated-switch-base () + (assert (py-execute-statement-jython-dedicated-switch) nil "py-execute-statement-jython-dedicated-switch-test failed")) + +(defun py-execute-statement-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3.2-base arg teststring))) + +(defun py-execute-statement-python3.2-base () + (assert (py-execute-statement-python3.2) nil "py-execute-statement-python3.2-test failed")) + +(defun py-execute-statement-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3.2-switch-base arg teststring))) + +(defun py-execute-statement-python3.2-switch-base () + (assert (py-execute-statement-python3.2-switch) nil "py-execute-statement-python3.2-switch-test failed")) + +(defun py-execute-statement-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3.2-no-switch-base arg teststring))) + +(defun py-execute-statement-python3.2-no-switch-base () + (assert (py-execute-statement-python3.2-no-switch) nil "py-execute-statement-python3.2-no-switch-test failed")) + +(defun py-execute-statement-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3.2-dedicated-base arg teststring))) + +(defun py-execute-statement-python3.2-dedicated-base () + (assert (py-execute-statement-python3.2-dedicated) nil "py-execute-statement-python3.2-dedicated-test failed")) + +(defun py-execute-statement-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-statement-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-statement-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-statement-python3.2-dedicated-switch-base () + (assert (py-execute-statement-python3.2-dedicated-switch) nil "py-execute-statement-python3.2-dedicated-switch-test failed")) + +(defun py-execute-block-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python-test\")")) + (py-bug-tests-intern 'py-execute-block-python-base arg teststring))) + +(defun py-execute-block-python-base () + (sit-for 0.1) + (assert (py-execute-block-python) nil "py-execute-block-python-test failed")) + +(defun py-execute-block-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python-switch-base arg teststring))) + +(defun py-execute-block-python-switch-base () + (assert (py-execute-block-python-switch) nil "py-execute-block-python-switch-test failed")) + +(defun py-execute-block-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python-no-switch-base arg teststring))) + +(defun py-execute-block-python-no-switch-base () + (assert (py-execute-block-python-no-switch) nil "py-execute-block-python-no-switch-test failed")) + +(defun py-execute-block-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-python-dedicated-base arg teststring))) + +(defun py-execute-block-python-dedicated-base () + (assert (py-execute-block-python-dedicated) nil "py-execute-block-python-dedicated-test failed")) + +(defun py-execute-block-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python-dedicated-switch-base arg teststring))) + +(defun py-execute-block-python-dedicated-switch-base () + (assert (py-execute-block-python-dedicated-switch) nil "py-execute-block-python-dedicated-switch-test failed")) + +(defun py-execute-block-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-ipython-test\")")) + (py-bug-tests-intern 'py-execute-block-ipython-base arg teststring))) + +(defun py-execute-block-ipython-base () + (assert (py-execute-block-ipython) nil "py-execute-block-ipython-test failed")) + +(defun py-execute-block-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-ipython-switch-base arg teststring))) + +(defun py-execute-block-ipython-switch-base () + (assert (py-execute-block-ipython-switch) nil "py-execute-block-ipython-switch-test failed")) + +(defun py-execute-block-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-ipython-no-switch-base arg teststring))) + +(defun py-execute-block-ipython-no-switch-base () + (assert (py-execute-block-ipython-no-switch) nil "py-execute-block-ipython-no-switch-test failed")) + +(defun py-execute-block-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-ipython-dedicated-base arg teststring))) + +(defun py-execute-block-ipython-dedicated-base () + (assert (py-execute-block-ipython-dedicated) nil "py-execute-block-ipython-dedicated-test failed")) + +(defun py-execute-block-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-block-ipython-dedicated-switch-base () + (assert (py-execute-block-ipython-dedicated-switch) nil "py-execute-block-ipython-dedicated-switch-test failed")) + +(defun py-execute-block-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3-test\")")) + (py-bug-tests-intern 'py-execute-block-python3-base arg teststring))) + +(defun py-execute-block-python3-base () + (assert (py-execute-block-python3) nil "py-execute-block-python3-test failed")) + +(defun py-execute-block-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python3-switch-base arg teststring))) + +(defun py-execute-block-python3-switch-base () + (assert (py-execute-block-python3-switch) nil "py-execute-block-python3-switch-test failed")) + +(defun py-execute-block-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python3-no-switch-base arg teststring))) + +(defun py-execute-block-python3-no-switch-base () + (assert (py-execute-block-python3-no-switch) nil "py-execute-block-python3-no-switch-test failed")) + +(defun py-execute-block-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-python3-dedicated-base arg teststring))) + +(defun py-execute-block-python3-dedicated-base () + (assert (py-execute-block-python3-dedicated) nil "py-execute-block-python3-dedicated-test failed")) + +(defun py-execute-block-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-block-python3-dedicated-switch-base () + (assert (py-execute-block-python3-dedicated-switch) nil "py-execute-block-python3-dedicated-switch-test failed")) + +(defun py-execute-block-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2-test\")")) + (py-bug-tests-intern 'py-execute-block-python2-base arg teststring))) + +(defun py-execute-block-python2-base () + (assert (py-execute-block-python2) nil "py-execute-block-python2-test failed")) + +(defun py-execute-block-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python2-switch-base arg teststring))) + +(defun py-execute-block-python2-switch-base () + (assert (py-execute-block-python2-switch) nil "py-execute-block-python2-switch-test failed")) + +(defun py-execute-block-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python2-no-switch-base arg teststring))) + +(defun py-execute-block-python2-no-switch-base () + (assert (py-execute-block-python2-no-switch) nil "py-execute-block-python2-no-switch-test failed")) + +(defun py-execute-block-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-python2-dedicated-base arg teststring))) + +(defun py-execute-block-python2-dedicated-base () + (assert (py-execute-block-python2-dedicated) nil "py-execute-block-python2-dedicated-test failed")) + +(defun py-execute-block-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-block-python2-dedicated-switch-base () + (assert (py-execute-block-python2-dedicated-switch) nil "py-execute-block-python2-dedicated-switch-test failed")) + +(defun py-execute-block-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-block-python2.7-base arg teststring))) + +(defun py-execute-block-python2.7-base () + (assert (py-execute-block-python2.7) nil "py-execute-block-python2.7-test failed")) + +(defun py-execute-block-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python2.7-switch-base arg teststring))) + +(defun py-execute-block-python2.7-switch-base () + (assert (py-execute-block-python2.7-switch) nil "py-execute-block-python2.7-switch-test failed")) + +(defun py-execute-block-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python2.7-no-switch-base arg teststring))) + +(defun py-execute-block-python2.7-no-switch-base () + (assert (py-execute-block-python2.7-no-switch) nil "py-execute-block-python2.7-no-switch-test failed")) + +(defun py-execute-block-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-python2.7-dedicated-base arg teststring))) + +(defun py-execute-block-python2.7-dedicated-base () + (assert (py-execute-block-python2.7-dedicated) nil "py-execute-block-python2.7-dedicated-test failed")) + +(defun py-execute-block-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-block-python2.7-dedicated-switch-base () + (assert (py-execute-block-python2.7-dedicated-switch) nil "py-execute-block-python2.7-dedicated-switch-test failed")) + +(defun py-execute-block-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-jython-test\")")) + (py-bug-tests-intern 'py-execute-block-jython-base arg teststring))) + +(defun py-execute-block-jython-base () + (assert (py-execute-block-jython) nil "py-execute-block-jython-test failed")) + +(defun py-execute-block-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-jython-switch-base arg teststring))) + +(defun py-execute-block-jython-switch-base () + (assert (py-execute-block-jython-switch) nil "py-execute-block-jython-switch-test failed")) + +(defun py-execute-block-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-jython-no-switch-base arg teststring))) + +(defun py-execute-block-jython-no-switch-base () + (assert (py-execute-block-jython-no-switch) nil "py-execute-block-jython-no-switch-test failed")) + +(defun py-execute-block-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-jython-dedicated-base arg teststring))) + +(defun py-execute-block-jython-dedicated-base () + (assert (py-execute-block-jython-dedicated) nil "py-execute-block-jython-dedicated-test failed")) + +(defun py-execute-block-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-block-jython-dedicated-switch-base () + (assert (py-execute-block-jython-dedicated-switch) nil "py-execute-block-jython-dedicated-switch-test failed")) + +(defun py-execute-block-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-block-python3.2-base arg teststring))) + +(defun py-execute-block-python3.2-base () + (assert (py-execute-block-python3.2) nil "py-execute-block-python3.2-test failed")) + +(defun py-execute-block-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python3.2-switch-base arg teststring))) + +(defun py-execute-block-python3.2-switch-base () + (assert (py-execute-block-python3.2-switch) nil "py-execute-block-python3.2-switch-test failed")) + +(defun py-execute-block-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python3.2-no-switch-base arg teststring))) + +(defun py-execute-block-python3.2-no-switch-base () + (assert (py-execute-block-python3.2-no-switch) nil "py-execute-block-python3.2-no-switch-test failed")) + +(defun py-execute-block-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-python3.2-dedicated-base arg teststring))) + +(defun py-execute-block-python3.2-dedicated-base () + (assert (py-execute-block-python3.2-dedicated) nil "py-execute-block-python3.2-dedicated-test failed")) + +(defun py-execute-block-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-block-python3.2-dedicated-switch-base () + (assert (py-execute-block-python3.2-dedicated-switch) nil "py-execute-block-python3.2-dedicated-switch-test failed")) + +(defun py-execute-block-or-clause-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python-base arg teststring))) + +(defun py-execute-block-or-clause-python-base () + (assert (py-execute-block-or-clause-python) nil "py-execute-block-or-clause-python-test failed")) + +(defun py-execute-block-or-clause-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python-switch-base () + (assert (py-execute-block-or-clause-python-switch) nil "py-execute-block-or-clause-python-switch-test failed")) + +(defun py-execute-block-or-clause-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python-no-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python-no-switch-base () + (assert (py-execute-block-or-clause-python-no-switch) nil "py-execute-block-or-clause-python-no-switch-test failed")) + +(defun py-execute-block-or-clause-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python-dedicated-base arg teststring))) + +(defun py-execute-block-or-clause-python-dedicated-base () + (assert (py-execute-block-or-clause-python-dedicated) nil "py-execute-block-or-clause-python-dedicated-test failed")) + +(defun py-execute-block-or-clause-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python-dedicated-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python-dedicated-switch-base () + (assert (py-execute-block-or-clause-python-dedicated-switch) nil "py-execute-block-or-clause-python-dedicated-switch-test failed")) + +(defun py-execute-block-or-clause-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-ipython-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-ipython-base arg teststring))) + +(defun py-execute-block-or-clause-ipython-base () + (assert (py-execute-block-or-clause-ipython) nil "py-execute-block-or-clause-ipython-test failed")) + +(defun py-execute-block-or-clause-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-ipython-switch-base arg teststring))) + +(defun py-execute-block-or-clause-ipython-switch-base () + (assert (py-execute-block-or-clause-ipython-switch) nil "py-execute-block-or-clause-ipython-switch-test failed")) + +(defun py-execute-block-or-clause-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-ipython-no-switch-base arg teststring))) + +(defun py-execute-block-or-clause-ipython-no-switch-base () + (assert (py-execute-block-or-clause-ipython-no-switch) nil "py-execute-block-or-clause-ipython-no-switch-test failed")) + +(defun py-execute-block-or-clause-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-ipython-dedicated-base arg teststring))) + +(defun py-execute-block-or-clause-ipython-dedicated-base () + (assert (py-execute-block-or-clause-ipython-dedicated) nil "py-execute-block-or-clause-ipython-dedicated-test failed")) + +(defun py-execute-block-or-clause-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-block-or-clause-ipython-dedicated-switch-base () + (assert (py-execute-block-or-clause-ipython-dedicated-switch) nil "py-execute-block-or-clause-ipython-dedicated-switch-test failed")) + +(defun py-execute-block-or-clause-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3-base arg teststring))) + +(defun py-execute-block-or-clause-python3-base () + (assert (py-execute-block-or-clause-python3) nil "py-execute-block-or-clause-python3-test failed")) + +(defun py-execute-block-or-clause-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python3-switch-base () + (assert (py-execute-block-or-clause-python3-switch) nil "py-execute-block-or-clause-python3-switch-test failed")) + +(defun py-execute-block-or-clause-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3-no-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python3-no-switch-base () + (assert (py-execute-block-or-clause-python3-no-switch) nil "py-execute-block-or-clause-python3-no-switch-test failed")) + +(defun py-execute-block-or-clause-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3-dedicated-base arg teststring))) + +(defun py-execute-block-or-clause-python3-dedicated-base () + (assert (py-execute-block-or-clause-python3-dedicated) nil "py-execute-block-or-clause-python3-dedicated-test failed")) + +(defun py-execute-block-or-clause-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python3-dedicated-switch-base () + (assert (py-execute-block-or-clause-python3-dedicated-switch) nil "py-execute-block-or-clause-python3-dedicated-switch-test failed")) + +(defun py-execute-block-or-clause-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2-base arg teststring))) + +(defun py-execute-block-or-clause-python2-base () + (assert (py-execute-block-or-clause-python2) nil "py-execute-block-or-clause-python2-test failed")) + +(defun py-execute-block-or-clause-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python2-switch-base () + (assert (py-execute-block-or-clause-python2-switch) nil "py-execute-block-or-clause-python2-switch-test failed")) + +(defun py-execute-block-or-clause-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2-no-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python2-no-switch-base () + (assert (py-execute-block-or-clause-python2-no-switch) nil "py-execute-block-or-clause-python2-no-switch-test failed")) + +(defun py-execute-block-or-clause-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2-dedicated-base arg teststring))) + +(defun py-execute-block-or-clause-python2-dedicated-base () + (assert (py-execute-block-or-clause-python2-dedicated) nil "py-execute-block-or-clause-python2-dedicated-test failed")) + +(defun py-execute-block-or-clause-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python2-dedicated-switch-base () + (assert (py-execute-block-or-clause-python2-dedicated-switch) nil "py-execute-block-or-clause-python2-dedicated-switch-test failed")) + +(defun py-execute-block-or-clause-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2.7-base arg teststring))) + +(defun py-execute-block-or-clause-python2.7-base () + (assert (py-execute-block-or-clause-python2.7) nil "py-execute-block-or-clause-python2.7-test failed")) + +(defun py-execute-block-or-clause-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2.7-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python2.7-switch-base () + (assert (py-execute-block-or-clause-python2.7-switch) nil "py-execute-block-or-clause-python2.7-switch-test failed")) + +(defun py-execute-block-or-clause-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2.7-no-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python2.7-no-switch-base () + (assert (py-execute-block-or-clause-python2.7-no-switch) nil "py-execute-block-or-clause-python2.7-no-switch-test failed")) + +(defun py-execute-block-or-clause-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2.7-dedicated-base arg teststring))) + +(defun py-execute-block-or-clause-python2.7-dedicated-base () + (assert (py-execute-block-or-clause-python2.7-dedicated) nil "py-execute-block-or-clause-python2.7-dedicated-test failed")) + +(defun py-execute-block-or-clause-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python2.7-dedicated-switch-base () + (assert (py-execute-block-or-clause-python2.7-dedicated-switch) nil "py-execute-block-or-clause-python2.7-dedicated-switch-test failed")) + +(defun py-execute-block-or-clause-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-jython-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-jython-base arg teststring))) + +(defun py-execute-block-or-clause-jython-base () + (assert (py-execute-block-or-clause-jython) nil "py-execute-block-or-clause-jython-test failed")) + +(defun py-execute-block-or-clause-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-jython-switch-base arg teststring))) + +(defun py-execute-block-or-clause-jython-switch-base () + (assert (py-execute-block-or-clause-jython-switch) nil "py-execute-block-or-clause-jython-switch-test failed")) + +(defun py-execute-block-or-clause-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-jython-no-switch-base arg teststring))) + +(defun py-execute-block-or-clause-jython-no-switch-base () + (assert (py-execute-block-or-clause-jython-no-switch) nil "py-execute-block-or-clause-jython-no-switch-test failed")) + +(defun py-execute-block-or-clause-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-jython-dedicated-base arg teststring))) + +(defun py-execute-block-or-clause-jython-dedicated-base () + (assert (py-execute-block-or-clause-jython-dedicated) nil "py-execute-block-or-clause-jython-dedicated-test failed")) + +(defun py-execute-block-or-clause-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-block-or-clause-jython-dedicated-switch-base () + (assert (py-execute-block-or-clause-jython-dedicated-switch) nil "py-execute-block-or-clause-jython-dedicated-switch-test failed")) + +(defun py-execute-block-or-clause-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3.2-base arg teststring))) + +(defun py-execute-block-or-clause-python3.2-base () + (assert (py-execute-block-or-clause-python3.2) nil "py-execute-block-or-clause-python3.2-test failed")) + +(defun py-execute-block-or-clause-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3.2-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python3.2-switch-base () + (assert (py-execute-block-or-clause-python3.2-switch) nil "py-execute-block-or-clause-python3.2-switch-test failed")) + +(defun py-execute-block-or-clause-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3.2-no-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python3.2-no-switch-base () + (assert (py-execute-block-or-clause-python3.2-no-switch) nil "py-execute-block-or-clause-python3.2-no-switch-test failed")) + +(defun py-execute-block-or-clause-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3.2-dedicated-base arg teststring))) + +(defun py-execute-block-or-clause-python3.2-dedicated-base () + (assert (py-execute-block-or-clause-python3.2-dedicated) nil "py-execute-block-or-clause-python3.2-dedicated-test failed")) + +(defun py-execute-block-or-clause-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: print(\"I'm the py-execute-block-or-clause-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-block-or-clause-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-block-or-clause-python3.2-dedicated-switch-base () + (assert (py-execute-block-or-clause-python3.2-dedicated-switch) nil "py-execute-block-or-clause-python3.2-dedicated-switch-test failed")) + +(defun py-execute-def-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python-test\")")) + (py-bug-tests-intern 'py-execute-def-python-base arg teststring))) + +(defun py-execute-def-python-base () + (assert (py-execute-def-python) nil "py-execute-def-python-test failed")) + +(defun py-execute-def-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python-switch-base arg teststring))) + +(defun py-execute-def-python-switch-base () + (assert (py-execute-def-python-switch) nil "py-execute-def-python-switch-test failed")) + +(defun py-execute-def-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python-no-switch-base arg teststring))) + +(defun py-execute-def-python-no-switch-base () + (assert (py-execute-def-python-no-switch) nil "py-execute-def-python-no-switch-test failed")) + +(defun py-execute-def-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-def-python-dedicated-base arg teststring))) + +(defun py-execute-def-python-dedicated-base () + (assert (py-execute-def-python-dedicated) nil "py-execute-def-python-dedicated-test failed")) + +(defun py-execute-def-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python-dedicated-switch-base arg teststring))) + +(defun py-execute-def-python-dedicated-switch-base () + (assert (py-execute-def-python-dedicated-switch) nil "py-execute-def-python-dedicated-switch-test failed")) + +(defun py-execute-def-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-ipython-test\")")) + (py-bug-tests-intern 'py-execute-def-ipython-base arg teststring))) + +(defun py-execute-def-ipython-base () + (assert (py-execute-def-ipython) nil "py-execute-def-ipython-test failed")) + +(defun py-execute-def-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-ipython-switch-base arg teststring))) + +(defun py-execute-def-ipython-switch-base () + (assert (py-execute-def-ipython-switch) nil "py-execute-def-ipython-switch-test failed")) + +(defun py-execute-def-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-ipython-no-switch-base arg teststring))) + +(defun py-execute-def-ipython-no-switch-base () + (assert (py-execute-def-ipython-no-switch) nil "py-execute-def-ipython-no-switch-test failed")) + +(defun py-execute-def-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-def-ipython-dedicated-base arg teststring))) + +(defun py-execute-def-ipython-dedicated-base () + (assert (py-execute-def-ipython-dedicated) nil "py-execute-def-ipython-dedicated-test failed")) + +(defun py-execute-def-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-def-ipython-dedicated-switch-base () + (assert (py-execute-def-ipython-dedicated-switch) nil "py-execute-def-ipython-dedicated-switch-test failed")) + +(defun py-execute-def-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3-test\")")) + (py-bug-tests-intern 'py-execute-def-python3-base arg teststring))) + +(defun py-execute-def-python3-base () + (assert (py-execute-def-python3) nil "py-execute-def-python3-test failed")) + +(defun py-execute-def-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python3-switch-base arg teststring))) + +(defun py-execute-def-python3-switch-base () + (assert (py-execute-def-python3-switch) nil "py-execute-def-python3-switch-test failed")) + +(defun py-execute-def-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python3-no-switch-base arg teststring))) + +(defun py-execute-def-python3-no-switch-base () + (assert (py-execute-def-python3-no-switch) nil "py-execute-def-python3-no-switch-test failed")) + +(defun py-execute-def-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-def-python3-dedicated-base arg teststring))) + +(defun py-execute-def-python3-dedicated-base () + (assert (py-execute-def-python3-dedicated) nil "py-execute-def-python3-dedicated-test failed")) + +(defun py-execute-def-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-def-python3-dedicated-switch-base () + (assert (py-execute-def-python3-dedicated-switch) nil "py-execute-def-python3-dedicated-switch-test failed")) + +(defun py-execute-def-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2-test\")")) + (py-bug-tests-intern 'py-execute-def-python2-base arg teststring))) + +(defun py-execute-def-python2-base () + (assert (py-execute-def-python2) nil "py-execute-def-python2-test failed")) + +(defun py-execute-def-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python2-switch-base arg teststring))) + +(defun py-execute-def-python2-switch-base () + (assert (py-execute-def-python2-switch) nil "py-execute-def-python2-switch-test failed")) + +(defun py-execute-def-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python2-no-switch-base arg teststring))) + +(defun py-execute-def-python2-no-switch-base () + (assert (py-execute-def-python2-no-switch) nil "py-execute-def-python2-no-switch-test failed")) + +(defun py-execute-def-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-def-python2-dedicated-base arg teststring))) + +(defun py-execute-def-python2-dedicated-base () + (assert (py-execute-def-python2-dedicated) nil "py-execute-def-python2-dedicated-test failed")) + +(defun py-execute-def-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-def-python2-dedicated-switch-base () + (assert (py-execute-def-python2-dedicated-switch) nil "py-execute-def-python2-dedicated-switch-test failed")) + +(defun py-execute-def-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-def-python2.7-base arg teststring))) + +(defun py-execute-def-python2.7-base () + (assert (py-execute-def-python2.7) nil "py-execute-def-python2.7-test failed")) + +(defun py-execute-def-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python2.7-switch-base arg teststring))) + +(defun py-execute-def-python2.7-switch-base () + (assert (py-execute-def-python2.7-switch) nil "py-execute-def-python2.7-switch-test failed")) + +(defun py-execute-def-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python2.7-no-switch-base arg teststring))) + +(defun py-execute-def-python2.7-no-switch-base () + (assert (py-execute-def-python2.7-no-switch) nil "py-execute-def-python2.7-no-switch-test failed")) + +(defun py-execute-def-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-def-python2.7-dedicated-base arg teststring))) + +(defun py-execute-def-python2.7-dedicated-base () + (assert (py-execute-def-python2.7-dedicated) nil "py-execute-def-python2.7-dedicated-test failed")) + +(defun py-execute-def-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-def-python2.7-dedicated-switch-base () + (assert (py-execute-def-python2.7-dedicated-switch) nil "py-execute-def-python2.7-dedicated-switch-test failed")) + +(defun py-execute-def-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-jython-test\")")) + (py-bug-tests-intern 'py-execute-def-jython-base arg teststring))) + +(defun py-execute-def-jython-base () + (assert (py-execute-def-jython) nil "py-execute-def-jython-test failed")) + +(defun py-execute-def-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-jython-switch-base arg teststring))) + +(defun py-execute-def-jython-switch-base () + (assert (py-execute-def-jython-switch) nil "py-execute-def-jython-switch-test failed")) + +(defun py-execute-def-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-jython-no-switch-base arg teststring))) + +(defun py-execute-def-jython-no-switch-base () + (assert (py-execute-def-jython-no-switch) nil "py-execute-def-jython-no-switch-test failed")) + +(defun py-execute-def-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-def-jython-dedicated-base arg teststring))) + +(defun py-execute-def-jython-dedicated-base () + (assert (py-execute-def-jython-dedicated) nil "py-execute-def-jython-dedicated-test failed")) + +(defun py-execute-def-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-def-jython-dedicated-switch-base () + (assert (py-execute-def-jython-dedicated-switch) nil "py-execute-def-jython-dedicated-switch-test failed")) + +(defun py-execute-def-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-def-python3.2-base arg teststring))) + +(defun py-execute-def-python3.2-base () + (assert (py-execute-def-python3.2) nil "py-execute-def-python3.2-test failed")) + +(defun py-execute-def-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python3.2-switch-base arg teststring))) + +(defun py-execute-def-python3.2-switch-base () + (assert (py-execute-def-python3.2-switch) nil "py-execute-def-python3.2-switch-test failed")) + +(defun py-execute-def-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python3.2-no-switch-base arg teststring))) + +(defun py-execute-def-python3.2-no-switch-base () + (assert (py-execute-def-python3.2-no-switch) nil "py-execute-def-python3.2-no-switch-test failed")) + +(defun py-execute-def-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-def-python3.2-dedicated-base arg teststring))) + +(defun py-execute-def-python3.2-dedicated-base () + (assert (py-execute-def-python3.2-dedicated) nil "py-execute-def-python3.2-dedicated-test failed")) + +(defun py-execute-def-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo (): print(\"I'm the py-execute-def-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-def-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-def-python3.2-dedicated-switch-base () + (assert (py-execute-def-python3.2-dedicated-switch) nil "py-execute-def-python3.2-dedicated-switch-test failed")) + +(defun py-execute-class-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python-test\")")) + (py-bug-tests-intern 'py-execute-class-python-base arg teststring))) + +(defun py-execute-class-python-base () + (assert (py-execute-class-python) nil "py-execute-class-python-test failed")) + +(defun py-execute-class-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python-switch-base arg teststring))) + +(defun py-execute-class-python-switch-base () + (assert (py-execute-class-python-switch) nil "py-execute-class-python-switch-test failed")) + +(defun py-execute-class-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python-no-switch-base arg teststring))) + +(defun py-execute-class-python-no-switch-base () + (assert (py-execute-class-python-no-switch) nil "py-execute-class-python-no-switch-test failed")) + +(defun py-execute-class-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-class-python-dedicated-base arg teststring))) + +(defun py-execute-class-python-dedicated-base () + (assert (py-execute-class-python-dedicated) nil "py-execute-class-python-dedicated-test failed")) + +(defun py-execute-class-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python-dedicated-switch-base arg teststring))) + +(defun py-execute-class-python-dedicated-switch-base () + (assert (py-execute-class-python-dedicated-switch) nil "py-execute-class-python-dedicated-switch-test failed")) + +(defun py-execute-class-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-ipython-test\")")) + (py-bug-tests-intern 'py-execute-class-ipython-base arg teststring))) + +(defun py-execute-class-ipython-base () + (assert (py-execute-class-ipython) nil "py-execute-class-ipython-test failed")) + +(defun py-execute-class-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-ipython-switch-base arg teststring))) + +(defun py-execute-class-ipython-switch-base () + (assert (py-execute-class-ipython-switch) nil "py-execute-class-ipython-switch-test failed")) + +(defun py-execute-class-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-ipython-no-switch-base arg teststring))) + +(defun py-execute-class-ipython-no-switch-base () + (assert (py-execute-class-ipython-no-switch) nil "py-execute-class-ipython-no-switch-test failed")) + +(defun py-execute-class-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-class-ipython-dedicated-base arg teststring))) + +(defun py-execute-class-ipython-dedicated-base () + (assert (py-execute-class-ipython-dedicated) nil "py-execute-class-ipython-dedicated-test failed")) + +(defun py-execute-class-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-class-ipython-dedicated-switch-base () + (assert (py-execute-class-ipython-dedicated-switch) nil "py-execute-class-ipython-dedicated-switch-test failed")) + +(defun py-execute-class-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3-test\")")) + (py-bug-tests-intern 'py-execute-class-python3-base arg teststring))) + +(defun py-execute-class-python3-base () + (assert (py-execute-class-python3) nil "py-execute-class-python3-test failed")) + +(defun py-execute-class-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python3-switch-base arg teststring))) + +(defun py-execute-class-python3-switch-base () + (assert (py-execute-class-python3-switch) nil "py-execute-class-python3-switch-test failed")) + +(defun py-execute-class-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python3-no-switch-base arg teststring))) + +(defun py-execute-class-python3-no-switch-base () + (assert (py-execute-class-python3-no-switch) nil "py-execute-class-python3-no-switch-test failed")) + +(defun py-execute-class-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-class-python3-dedicated-base arg teststring))) + +(defun py-execute-class-python3-dedicated-base () + (assert (py-execute-class-python3-dedicated) nil "py-execute-class-python3-dedicated-test failed")) + +(defun py-execute-class-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-class-python3-dedicated-switch-base () + (assert (py-execute-class-python3-dedicated-switch) nil "py-execute-class-python3-dedicated-switch-test failed")) + +(defun py-execute-class-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2-test\")")) + (py-bug-tests-intern 'py-execute-class-python2-base arg teststring))) + +(defun py-execute-class-python2-base () + (assert (py-execute-class-python2) nil "py-execute-class-python2-test failed")) + +(defun py-execute-class-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python2-switch-base arg teststring))) + +(defun py-execute-class-python2-switch-base () + (assert (py-execute-class-python2-switch) nil "py-execute-class-python2-switch-test failed")) + +(defun py-execute-class-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python2-no-switch-base arg teststring))) + +(defun py-execute-class-python2-no-switch-base () + (assert (py-execute-class-python2-no-switch) nil "py-execute-class-python2-no-switch-test failed")) + +(defun py-execute-class-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-class-python2-dedicated-base arg teststring))) + +(defun py-execute-class-python2-dedicated-base () + (assert (py-execute-class-python2-dedicated) nil "py-execute-class-python2-dedicated-test failed")) + +(defun py-execute-class-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-class-python2-dedicated-switch-base () + (assert (py-execute-class-python2-dedicated-switch) nil "py-execute-class-python2-dedicated-switch-test failed")) + +(defun py-execute-class-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-class-python2.7-base arg teststring))) + +(defun py-execute-class-python2.7-base () + (assert (py-execute-class-python2.7) nil "py-execute-class-python2.7-test failed")) + +(defun py-execute-class-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python2.7-switch-base arg teststring))) + +(defun py-execute-class-python2.7-switch-base () + (assert (py-execute-class-python2.7-switch) nil "py-execute-class-python2.7-switch-test failed")) + +(defun py-execute-class-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python2.7-no-switch-base arg teststring))) + +(defun py-execute-class-python2.7-no-switch-base () + (assert (py-execute-class-python2.7-no-switch) nil "py-execute-class-python2.7-no-switch-test failed")) + +(defun py-execute-class-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-class-python2.7-dedicated-base arg teststring))) + +(defun py-execute-class-python2.7-dedicated-base () + (assert (py-execute-class-python2.7-dedicated) nil "py-execute-class-python2.7-dedicated-test failed")) + +(defun py-execute-class-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-class-python2.7-dedicated-switch-base () + (assert (py-execute-class-python2.7-dedicated-switch) nil "py-execute-class-python2.7-dedicated-switch-test failed")) + +(defun py-execute-class-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-jython-test\")")) + (py-bug-tests-intern 'py-execute-class-jython-base arg teststring))) + +(defun py-execute-class-jython-base () + (assert (py-execute-class-jython) nil "py-execute-class-jython-test failed")) + +(defun py-execute-class-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-jython-switch-base arg teststring))) + +(defun py-execute-class-jython-switch-base () + (assert (py-execute-class-jython-switch) nil "py-execute-class-jython-switch-test failed")) + +(defun py-execute-class-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-jython-no-switch-base arg teststring))) + +(defun py-execute-class-jython-no-switch-base () + (assert (py-execute-class-jython-no-switch) nil "py-execute-class-jython-no-switch-test failed")) + +(defun py-execute-class-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-class-jython-dedicated-base arg teststring))) + +(defun py-execute-class-jython-dedicated-base () + (assert (py-execute-class-jython-dedicated) nil "py-execute-class-jython-dedicated-test failed")) + +(defun py-execute-class-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-class-jython-dedicated-switch-base () + (assert (py-execute-class-jython-dedicated-switch) nil "py-execute-class-jython-dedicated-switch-test failed")) + +(defun py-execute-class-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-class-python3.2-base arg teststring))) + +(defun py-execute-class-python3.2-base () + (assert (py-execute-class-python3.2) nil "py-execute-class-python3.2-test failed")) + +(defun py-execute-class-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python3.2-switch-base arg teststring))) + +(defun py-execute-class-python3.2-switch-base () + (assert (py-execute-class-python3.2-switch) nil "py-execute-class-python3.2-switch-test failed")) + +(defun py-execute-class-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python3.2-no-switch-base arg teststring))) + +(defun py-execute-class-python3.2-no-switch-base () + (assert (py-execute-class-python3.2-no-switch) nil "py-execute-class-python3.2-no-switch-test failed")) + +(defun py-execute-class-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-class-python3.2-dedicated-base arg teststring))) + +(defun py-execute-class-python3.2-dedicated-base () + (assert (py-execute-class-python3.2-dedicated) nil "py-execute-class-python3.2-dedicated-test failed")) + +(defun py-execute-class-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class foo (): print(\"I'm the py-execute-class-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-class-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-class-python3.2-dedicated-switch-base () + (assert (py-execute-class-python3.2-dedicated-switch) nil "py-execute-class-python3.2-dedicated-switch-test failed")) + +(defun py-execute-region-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python-test\")")) + (py-bug-tests-intern 'py-execute-region-python-base arg teststring))) + +(defun py-execute-region-python-base () + (assert (py-execute-region-python (line-beginning-position) (line-end-position)) nil "py-execute-region-python-test failed")) + +(defun py-execute-region-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python-switch-base arg teststring))) + +(defun py-execute-region-python-switch-base () + (assert (py-execute-region-python-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python-switch-test failed")) + +(defun py-execute-region-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python-no-switch-base arg teststring))) + +(defun py-execute-region-python-no-switch-base () + (assert (py-execute-region-python-no-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python-no-switch-test failed")) + +(defun py-execute-region-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-region-python-dedicated-base arg teststring))) + +(defun py-execute-region-python-dedicated-base () + (assert (py-execute-region-python-dedicated (line-beginning-position) (line-end-position)) nil "py-execute-region-python-dedicated-test failed")) + +(defun py-execute-region-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python-dedicated-switch-base arg teststring))) + +(defun py-execute-region-python-dedicated-switch-base () + (assert (py-execute-region-python-dedicated-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python-dedicated-switch-test failed")) + +(defun py-execute-region-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-ipython-test\")")) + (py-bug-tests-intern 'py-execute-region-ipython-base arg teststring))) + +(defun py-execute-region-ipython-base () + (assert (py-execute-region-ipython (line-beginning-position) (line-end-position)) nil "py-execute-region-ipython-test failed")) + +(defun py-execute-region-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-ipython-switch-base arg teststring))) + +(defun py-execute-region-ipython-switch-base () + (assert (py-execute-region-ipython-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-ipython-switch-test failed")) + +(defun py-execute-region-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-ipython-no-switch-base arg teststring))) + +(defun py-execute-region-ipython-no-switch-base () + (assert (py-execute-region-ipython-no-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-ipython-no-switch-test failed")) + +(defun py-execute-region-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-region-ipython-dedicated-base arg teststring))) + +(defun py-execute-region-ipython-dedicated-base () + (assert (py-execute-region-ipython-dedicated (line-beginning-position) (line-end-position)) nil "py-execute-region-ipython-dedicated-test failed")) + +(defun py-execute-region-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-region-ipython-dedicated-switch-base () + (assert (py-execute-region-ipython-dedicated-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-ipython-dedicated-switch-test failed")) + +(defun py-execute-region-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3-test\")")) + (py-bug-tests-intern 'py-execute-region-python3-base arg teststring))) + +(defun py-execute-region-python3-base () + (assert (py-execute-region-python3 (line-beginning-position) (line-end-position)) nil "py-execute-region-python3-test failed")) + +(defun py-execute-region-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python3-switch-base arg teststring))) + +(defun py-execute-region-python3-switch-base () + (assert (py-execute-region-python3-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python3-switch-test failed")) + +(defun py-execute-region-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python3-no-switch-base arg teststring))) + +(defun py-execute-region-python3-no-switch-base () + (assert (py-execute-region-python3-no-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python3-no-switch-test failed")) + +(defun py-execute-region-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-region-python3-dedicated-base arg teststring))) + +(defun py-execute-region-python3-dedicated-base () + (assert (py-execute-region-python3-dedicated (line-beginning-position) (line-end-position)) nil "py-execute-region-python3-dedicated-test failed")) + +(defun py-execute-region-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-region-python3-dedicated-switch-base () + (assert (py-execute-region-python3-dedicated-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python3-dedicated-switch-test failed")) + +(defun py-execute-region-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2-test\")")) + (py-bug-tests-intern 'py-execute-region-python2-base arg teststring))) + +(defun py-execute-region-python2-base () + (assert (py-execute-region-python2 (line-beginning-position) (line-end-position)) nil "py-execute-region-python2-test failed")) + +(defun py-execute-region-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python2-switch-base arg teststring))) + +(defun py-execute-region-python2-switch-base () + (assert (py-execute-region-python2-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python2-switch-test failed")) + +(defun py-execute-region-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python2-no-switch-base arg teststring))) + +(defun py-execute-region-python2-no-switch-base () + (assert (py-execute-region-python2-no-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python2-no-switch-test failed")) + +(defun py-execute-region-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-region-python2-dedicated-base arg teststring))) + +(defun py-execute-region-python2-dedicated-base () + (assert (py-execute-region-python2-dedicated (line-beginning-position) (line-end-position)) nil "py-execute-region-python2-dedicated-test failed")) + +(defun py-execute-region-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-region-python2-dedicated-switch-base () + (assert (py-execute-region-python2-dedicated-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python2-dedicated-switch-test failed")) + +(defun py-execute-region-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-region-python2.7-base arg teststring))) + +(defun py-execute-region-python2.7-base () + (assert (py-execute-region-python2.7 (line-beginning-position) (line-end-position)) nil "py-execute-region-python2.7-test failed")) + +(defun py-execute-region-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python2.7-switch-base arg teststring))) + +(defun py-execute-region-python2.7-switch-base () + (assert (py-execute-region-python2.7-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python2.7-switch-test failed")) + +(defun py-execute-region-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python2.7-no-switch-base arg teststring))) + +(defun py-execute-region-python2.7-no-switch-base () + (sit-for 0.1) + (assert (py-execute-region-python2.7-no-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python2.7-no-switch-test failed")) + +(defun py-execute-region-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-region-python2.7-dedicated-base arg teststring))) + +(defun py-execute-region-python2.7-dedicated-base () + (assert (py-execute-region-python2.7-dedicated (line-beginning-position) (line-end-position)) nil "py-execute-region-python2.7-dedicated-test failed")) + +(defun py-execute-region-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-region-python2.7-dedicated-switch-base () + (assert (py-execute-region-python2.7-dedicated-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python2.7-dedicated-switch-test failed")) + +(defun py-execute-region-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-jython-test\")")) + (py-bug-tests-intern 'py-execute-region-jython-base arg teststring))) + +(defun py-execute-region-jython-base () + (assert (py-execute-region-jython (line-beginning-position) (line-end-position)) nil "py-execute-region-jython-test failed")) + +(defun py-execute-region-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-jython-switch-base arg teststring))) + +(defun py-execute-region-jython-switch-base () + (assert (py-execute-region-jython-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-jython-switch-test failed")) + +(defun py-execute-region-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-jython-no-switch-base arg teststring))) + +(defun py-execute-region-jython-no-switch-base () + (assert (py-execute-region-jython-no-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-jython-no-switch-test failed")) + +(defun py-execute-region-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-region-jython-dedicated-base arg teststring))) + +(defun py-execute-region-jython-dedicated-base () + (assert (py-execute-region-jython-dedicated (line-beginning-position) (line-end-position)) nil "py-execute-region-jython-dedicated-test failed")) + +(defun py-execute-region-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-region-jython-dedicated-switch-base () + (assert (py-execute-region-jython-dedicated-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-jython-dedicated-switch-test failed")) + +(defun py-execute-region-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-region-python3.2-base arg teststring))) + +(defun py-execute-region-python3.2-base () + (assert (py-execute-region-python3.2 (line-beginning-position) (line-end-position)) nil "py-execute-region-python3.2-test failed")) + +(defun py-execute-region-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python3.2-switch-base arg teststring))) + +(defun py-execute-region-python3.2-switch-base () + (assert (py-execute-region-python3.2-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python3.2-switch-test failed")) + +(defun py-execute-region-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python3.2-no-switch-base arg teststring))) + +(defun py-execute-region-python3.2-no-switch-base () + (assert (py-execute-region-python3.2-no-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python3.2-no-switch-test failed")) + +(defun py-execute-region-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-region-python3.2-dedicated-base arg teststring))) + +(defun py-execute-region-python3.2-dedicated-base () + (assert (py-execute-region-python3.2-dedicated (line-beginning-position) (line-end-position)) nil "py-execute-region-python3.2-dedicated-test failed")) + +(defun py-execute-region-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-region-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-region-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-region-python3.2-dedicated-switch-base () + (assert (py-execute-region-python3.2-dedicated-switch (line-beginning-position) (line-end-position)) nil "py-execute-region-python3.2-dedicated-switch-test failed")) + +(defun py-execute-buffer-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python-base arg teststring))) + +(defun py-execute-buffer-python-base () + (assert (py-execute-buffer-python) nil "py-execute-buffer-python-test failed")) + +(defun py-execute-buffer-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python-switch-base arg teststring))) + +(defun py-execute-buffer-python-switch-base () + (assert (py-execute-buffer-python-switch) nil "py-execute-buffer-python-switch-test failed")) + +(defun py-execute-buffer-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python-no-switch-base arg teststring))) + +(defun py-execute-buffer-python-no-switch-base () + (assert (py-execute-buffer-python-no-switch) nil "py-execute-buffer-python-no-switch-test failed")) + +(defun py-execute-buffer-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python-dedicated-base arg teststring))) + +(defun py-execute-buffer-python-dedicated-base () + (assert (py-execute-buffer-python-dedicated) nil "py-execute-buffer-python-dedicated-test failed")) + +(defun py-execute-buffer-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python-dedicated-switch-base arg teststring))) + +(defun py-execute-buffer-python-dedicated-switch-base () + (assert (py-execute-buffer-python-dedicated-switch) nil "py-execute-buffer-python-dedicated-switch-test failed")) + +(defun py-execute-buffer-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-ipython-test\")")) + (py-bug-tests-intern 'py-execute-buffer-ipython-base arg teststring))) + +(defun py-execute-buffer-ipython-base () + (assert (py-execute-buffer-ipython) nil "py-execute-buffer-ipython-test failed")) + +(defun py-execute-buffer-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-ipython-switch-base arg teststring))) + +(defun py-execute-buffer-ipython-switch-base () + (assert (py-execute-buffer-ipython-switch) nil "py-execute-buffer-ipython-switch-test failed")) + +(defun py-execute-buffer-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-ipython-no-switch-base arg teststring))) + +(defun py-execute-buffer-ipython-no-switch-base () + (assert (py-execute-buffer-ipython-no-switch) nil "py-execute-buffer-ipython-no-switch-test failed")) + +(defun py-execute-buffer-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-buffer-ipython-dedicated-base arg teststring))) + +(defun py-execute-buffer-ipython-dedicated-base () + (assert (py-execute-buffer-ipython-dedicated) nil "py-execute-buffer-ipython-dedicated-test failed")) + +(defun py-execute-buffer-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-buffer-ipython-dedicated-switch-base () + (assert (py-execute-buffer-ipython-dedicated-switch) nil "py-execute-buffer-ipython-dedicated-switch-test failed")) + +(defun py-execute-buffer-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3-base arg teststring))) + +(defun py-execute-buffer-python3-base () + (assert (py-execute-buffer-python3) nil "py-execute-buffer-python3-test failed")) + +(defun py-execute-buffer-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3-switch-base arg teststring))) + +(defun py-execute-buffer-python3-switch-base () + (assert (py-execute-buffer-python3-switch) nil "py-execute-buffer-python3-switch-test failed")) + +(defun py-execute-buffer-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3-no-switch-base arg teststring))) + +(defun py-execute-buffer-python3-no-switch-base () + (assert (py-execute-buffer-python3-no-switch) nil "py-execute-buffer-python3-no-switch-test failed")) + +(defun py-execute-buffer-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3-dedicated-base arg teststring))) + +(defun py-execute-buffer-python3-dedicated-base () + (assert (py-execute-buffer-python3-dedicated) nil "py-execute-buffer-python3-dedicated-test failed")) + +(defun py-execute-buffer-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-buffer-python3-dedicated-switch-base () + (assert (py-execute-buffer-python3-dedicated-switch) nil "py-execute-buffer-python3-dedicated-switch-test failed")) + +(defun py-execute-buffer-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2-base arg teststring))) + +(defun py-execute-buffer-python2-base () + (assert (py-execute-buffer-python2) nil "py-execute-buffer-python2-test failed")) + +(defun py-execute-buffer-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2-switch-base arg teststring))) + +(defun py-execute-buffer-python2-switch-base () + (assert (py-execute-buffer-python2-switch) nil "py-execute-buffer-python2-switch-test failed")) + +(defun py-execute-buffer-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2-no-switch-base arg teststring))) + +(defun py-execute-buffer-python2-no-switch-base () + (assert (py-execute-buffer-python2-no-switch) nil "py-execute-buffer-python2-no-switch-test failed")) + +(defun py-execute-buffer-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2-dedicated-base arg teststring))) + +(defun py-execute-buffer-python2-dedicated-base () + (assert (py-execute-buffer-python2-dedicated) nil "py-execute-buffer-python2-dedicated-test failed")) + +(defun py-execute-buffer-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-buffer-python2-dedicated-switch-base () + (assert (py-execute-buffer-python2-dedicated-switch) nil "py-execute-buffer-python2-dedicated-switch-test failed")) + +(defun py-execute-buffer-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2.7-base arg teststring))) + +(defun py-execute-buffer-python2.7-base () + (assert (py-execute-buffer-python2.7) nil "py-execute-buffer-python2.7-test failed")) + +(defun py-execute-buffer-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2.7-switch-base arg teststring))) + +(defun py-execute-buffer-python2.7-switch-base () + (assert (py-execute-buffer-python2.7-switch) nil "py-execute-buffer-python2.7-switch-test failed")) + +(defun py-execute-buffer-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2.7-no-switch-base arg teststring))) + +(defun py-execute-buffer-python2.7-no-switch-base () + (assert (py-execute-buffer-python2.7-no-switch) nil "py-execute-buffer-python2.7-no-switch-test failed")) + +(defun py-execute-buffer-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2.7-dedicated-base arg teststring))) + +(defun py-execute-buffer-python2.7-dedicated-base () + (assert (py-execute-buffer-python2.7-dedicated) nil "py-execute-buffer-python2.7-dedicated-test failed")) + +(defun py-execute-buffer-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-buffer-python2.7-dedicated-switch-base () + (assert (py-execute-buffer-python2.7-dedicated-switch) nil "py-execute-buffer-python2.7-dedicated-switch-test failed")) + +(defun py-execute-buffer-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-jython-test\")")) + (py-bug-tests-intern 'py-execute-buffer-jython-base arg teststring))) + +(defun py-execute-buffer-jython-base () + (assert (py-execute-buffer-jython) nil "py-execute-buffer-jython-test failed")) + +(defun py-execute-buffer-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-jython-switch-base arg teststring))) + +(defun py-execute-buffer-jython-switch-base () + (assert (py-execute-buffer-jython-switch) nil "py-execute-buffer-jython-switch-test failed")) + +(defun py-execute-buffer-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-jython-no-switch-base arg teststring))) + +(defun py-execute-buffer-jython-no-switch-base () + (assert (py-execute-buffer-jython-no-switch) nil "py-execute-buffer-jython-no-switch-test failed")) + +(defun py-execute-buffer-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-buffer-jython-dedicated-base arg teststring))) + +(defun py-execute-buffer-jython-dedicated-base () + (assert (py-execute-buffer-jython-dedicated) nil "py-execute-buffer-jython-dedicated-test failed")) + +(defun py-execute-buffer-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-buffer-jython-dedicated-switch-base () + (assert (py-execute-buffer-jython-dedicated-switch) nil "py-execute-buffer-jython-dedicated-switch-test failed")) + +(defun py-execute-buffer-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3.2-base arg teststring))) + +(defun py-execute-buffer-python3.2-base () + (assert (py-execute-buffer-python3.2) nil "py-execute-buffer-python3.2-test failed")) + +(defun py-execute-buffer-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3.2-switch-base arg teststring))) + +(defun py-execute-buffer-python3.2-switch-base () + (assert (py-execute-buffer-python3.2-switch) nil "py-execute-buffer-python3.2-switch-test failed")) + +(defun py-execute-buffer-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3.2-no-switch-base arg teststring))) + +(defun py-execute-buffer-python3.2-no-switch-base () + (assert (py-execute-buffer-python3.2-no-switch) nil "py-execute-buffer-python3.2-no-switch-test failed")) + +(defun py-execute-buffer-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3.2-dedicated-base arg teststring))) + +(defun py-execute-buffer-python3.2-dedicated-base () + (assert (py-execute-buffer-python3.2-dedicated) nil "py-execute-buffer-python3.2-dedicated-test failed")) + +(defun py-execute-buffer-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-buffer-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-buffer-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-buffer-python3.2-dedicated-switch-base () + (assert (py-execute-buffer-python3.2-dedicated-switch) nil "py-execute-buffer-python3.2-dedicated-switch-test failed")) + +(defun py-execute-expression-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python-test\")")) + (py-bug-tests-intern 'py-execute-expression-python-base arg teststring))) + +(defun py-execute-expression-python-base () + (assert (py-execute-expression-python) nil "py-execute-expression-python-test failed")) + +(defun py-execute-expression-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python-switch-base arg teststring))) + +(defun py-execute-expression-python-switch-base () + (assert (py-execute-expression-python-switch) nil "py-execute-expression-python-switch-test failed")) + +(defun py-execute-expression-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python-no-switch-base arg teststring))) + +(defun py-execute-expression-python-no-switch-base () + (assert (py-execute-expression-python-no-switch) nil "py-execute-expression-python-no-switch-test failed")) + +(defun py-execute-expression-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-expression-python-dedicated-base arg teststring))) + +(defun py-execute-expression-python-dedicated-base () + (assert (py-execute-expression-python-dedicated) nil "py-execute-expression-python-dedicated-test failed")) + +(defun py-execute-expression-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python-dedicated-switch-base arg teststring))) + +(defun py-execute-expression-python-dedicated-switch-base () + (assert (py-execute-expression-python-dedicated-switch) nil "py-execute-expression-python-dedicated-switch-test failed")) + +(defun py-execute-expression-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-ipython-test\")")) + (py-bug-tests-intern 'py-execute-expression-ipython-base arg teststring))) + +(defun py-execute-expression-ipython-base () + (assert (py-execute-expression-ipython) nil "py-execute-expression-ipython-test failed")) + +(defun py-execute-expression-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-ipython-switch-base arg teststring))) + +(defun py-execute-expression-ipython-switch-base () + (assert (py-execute-expression-ipython-switch) nil "py-execute-expression-ipython-switch-test failed")) + +(defun py-execute-expression-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-ipython-no-switch-base arg teststring))) + +(defun py-execute-expression-ipython-no-switch-base () + (assert (py-execute-expression-ipython-no-switch) nil "py-execute-expression-ipython-no-switch-test failed")) + +(defun py-execute-expression-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-expression-ipython-dedicated-base arg teststring))) + +(defun py-execute-expression-ipython-dedicated-base () + (assert (py-execute-expression-ipython-dedicated) nil "py-execute-expression-ipython-dedicated-test failed")) + +(defun py-execute-expression-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-expression-ipython-dedicated-switch-base () + (assert (py-execute-expression-ipython-dedicated-switch) nil "py-execute-expression-ipython-dedicated-switch-test failed")) + +(defun py-execute-expression-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3-base arg teststring))) + +(defun py-execute-expression-python3-base () + (assert (py-execute-expression-python3) nil "py-execute-expression-python3-test failed")) + +(defun py-execute-expression-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3-switch-base arg teststring))) + +(defun py-execute-expression-python3-switch-base () + (assert (py-execute-expression-python3-switch) nil "py-execute-expression-python3-switch-test failed")) + +(defun py-execute-expression-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3-no-switch-base arg teststring))) + +(defun py-execute-expression-python3-no-switch-base () + (assert (py-execute-expression-python3-no-switch) nil "py-execute-expression-python3-no-switch-test failed")) + +(defun py-execute-expression-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3-dedicated-base arg teststring))) + +(defun py-execute-expression-python3-dedicated-base () + (assert (py-execute-expression-python3-dedicated) nil "py-execute-expression-python3-dedicated-test failed")) + +(defun py-execute-expression-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-expression-python3-dedicated-switch-base () + (assert (py-execute-expression-python3-dedicated-switch) nil "py-execute-expression-python3-dedicated-switch-test failed")) + +(defun py-execute-expression-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2-base arg teststring))) + +(defun py-execute-expression-python2-base () + (assert (py-execute-expression-python2) nil "py-execute-expression-python2-test failed")) + +(defun py-execute-expression-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2-switch-base arg teststring))) + +(defun py-execute-expression-python2-switch-base () + (assert (py-execute-expression-python2-switch) nil "py-execute-expression-python2-switch-test failed")) + +(defun py-execute-expression-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2-no-switch-base arg teststring))) + +(defun py-execute-expression-python2-no-switch-base () + (assert (py-execute-expression-python2-no-switch) nil "py-execute-expression-python2-no-switch-test failed")) + +(defun py-execute-expression-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2-dedicated-base arg teststring))) + +(defun py-execute-expression-python2-dedicated-base () + (assert (py-execute-expression-python2-dedicated) nil "py-execute-expression-python2-dedicated-test failed")) + +(defun py-execute-expression-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-expression-python2-dedicated-switch-base () + (assert (py-execute-expression-python2-dedicated-switch) nil "py-execute-expression-python2-dedicated-switch-test failed")) + +(defun py-execute-expression-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2.7-base arg teststring))) + +(defun py-execute-expression-python2.7-base () + (assert (py-execute-expression-python2.7) nil "py-execute-expression-python2.7-test failed")) + +(defun py-execute-expression-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2.7-switch-base arg teststring))) + +(defun py-execute-expression-python2.7-switch-base () + (assert (py-execute-expression-python2.7-switch) nil "py-execute-expression-python2.7-switch-test failed")) + +(defun py-execute-expression-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2.7-no-switch-base arg teststring))) + +(defun py-execute-expression-python2.7-no-switch-base () + (assert (py-execute-expression-python2.7-no-switch) nil "py-execute-expression-python2.7-no-switch-test failed")) + +(defun py-execute-expression-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2.7-dedicated-base arg teststring))) + +(defun py-execute-expression-python2.7-dedicated-base () + (assert (py-execute-expression-python2.7-dedicated) nil "py-execute-expression-python2.7-dedicated-test failed")) + +(defun py-execute-expression-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-expression-python2.7-dedicated-switch-base () + (assert (py-execute-expression-python2.7-dedicated-switch) nil "py-execute-expression-python2.7-dedicated-switch-test failed")) + +(defun py-execute-expression-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-jython-test\")")) + (py-bug-tests-intern 'py-execute-expression-jython-base arg teststring))) + +(defun py-execute-expression-jython-base () + (assert (py-execute-expression-jython) nil "py-execute-expression-jython-test failed")) + +(defun py-execute-expression-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-jython-switch-base arg teststring))) + +(defun py-execute-expression-jython-switch-base () + (assert (py-execute-expression-jython-switch) nil "py-execute-expression-jython-switch-test failed")) + +(defun py-execute-expression-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-jython-no-switch-base arg teststring))) + +(defun py-execute-expression-jython-no-switch-base () + (assert (py-execute-expression-jython-no-switch) nil "py-execute-expression-jython-no-switch-test failed")) + +(defun py-execute-expression-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-expression-jython-dedicated-base arg teststring))) + +(defun py-execute-expression-jython-dedicated-base () + (assert (py-execute-expression-jython-dedicated) nil "py-execute-expression-jython-dedicated-test failed")) + +(defun py-execute-expression-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-expression-jython-dedicated-switch-base () + (assert (py-execute-expression-jython-dedicated-switch) nil "py-execute-expression-jython-dedicated-switch-test failed")) + +(defun py-execute-expression-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3.2-base arg teststring))) + +(defun py-execute-expression-python3.2-base () + (assert (py-execute-expression-python3.2) nil "py-execute-expression-python3.2-test failed")) + +(defun py-execute-expression-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3.2-switch-base arg teststring))) + +(defun py-execute-expression-python3.2-switch-base () + (assert (py-execute-expression-python3.2-switch) nil "py-execute-expression-python3.2-switch-test failed")) + +(defun py-execute-expression-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3.2-no-switch-base arg teststring))) + +(defun py-execute-expression-python3.2-no-switch-base () + (assert (py-execute-expression-python3.2-no-switch) nil "py-execute-expression-python3.2-no-switch-test failed")) + +(defun py-execute-expression-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3.2-dedicated-base arg teststring))) + +(defun py-execute-expression-python3.2-dedicated-base () + (assert (py-execute-expression-python3.2-dedicated) nil "py-execute-expression-python3.2-dedicated-test failed")) + +(defun py-execute-expression-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-expression-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-expression-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-expression-python3.2-dedicated-switch-base () + (assert (py-execute-expression-python3.2-dedicated-switch) nil "py-execute-expression-python3.2-dedicated-switch-test failed")) + +(defun py-execute-line-python-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python-test\")")) + (py-bug-tests-intern 'py-execute-line-python-base t teststring))) + +(defun py-execute-line-python-base () + (assert (py-execute-line-python) nil "py-execute-line-python-test failed")) + +(defun py-execute-line-python-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python-switch-base arg teststring))) + +(defun py-execute-line-python-switch-base () + (assert (py-execute-line-python-switch) nil "py-execute-line-python-switch-test failed")) + +(defun py-execute-line-python-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python-no-switch-base arg teststring))) + +(defun py-execute-line-python-no-switch-base () + (assert (py-execute-line-python-no-switch) nil "py-execute-line-python-no-switch-test failed")) + +(defun py-execute-line-python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-line-python-dedicated-base arg teststring))) + +(defun py-execute-line-python-dedicated-base () + (assert (py-execute-line-python-dedicated) nil "py-execute-line-python-dedicated-test failed")) + +(defun py-execute-line-python-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python-dedicated-switch-base arg teststring))) + +(defun py-execute-line-python-dedicated-switch-base () + (assert (py-execute-line-python-dedicated-switch) nil "py-execute-line-python-dedicated-switch-test failed")) + +(defun py-execute-line-ipython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-ipython-test\")")) + (py-bug-tests-intern 'py-execute-line-ipython-base arg teststring))) + +(defun py-execute-line-ipython-base () + (assert (py-execute-line-ipython) nil "py-execute-line-ipython-test failed")) + +(defun py-execute-line-ipython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-ipython-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-ipython-switch-base arg teststring))) + +(defun py-execute-line-ipython-switch-base () + (assert (py-execute-line-ipython-switch) nil "py-execute-line-ipython-switch-test failed")) + +(defun py-execute-line-ipython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-ipython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-ipython-no-switch-base arg teststring))) + +(defun py-execute-line-ipython-no-switch-base () + (assert (py-execute-line-ipython-no-switch) nil "py-execute-line-ipython-no-switch-test failed")) + +(defun py-execute-line-ipython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-ipython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-line-ipython-dedicated-base arg teststring))) + +(defun py-execute-line-ipython-dedicated-base () + (assert (py-execute-line-ipython-dedicated) nil "py-execute-line-ipython-dedicated-test failed")) + +(defun py-execute-line-ipython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-ipython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-ipython-dedicated-switch-base arg teststring))) + +(defun py-execute-line-ipython-dedicated-switch-base () + (assert (py-execute-line-ipython-dedicated-switch) nil "py-execute-line-ipython-dedicated-switch-test failed")) + +(defun py-execute-line-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3-test\")")) + (py-bug-tests-intern 'py-execute-line-python3-base arg teststring))) + +(defun py-execute-line-python3-base () + (assert (py-execute-line-python3) nil "py-execute-line-python3-test failed")) + +(defun py-execute-line-python3-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python3-switch-base arg teststring))) + +(defun py-execute-line-python3-switch-base () + (assert (py-execute-line-python3-switch) nil "py-execute-line-python3-switch-test failed")) + +(defun py-execute-line-python3-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python3-no-switch-base arg teststring))) + +(defun py-execute-line-python3-no-switch-base () + (assert (py-execute-line-python3-no-switch) nil "py-execute-line-python3-no-switch-test failed")) + +(defun py-execute-line-python3-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-line-python3-dedicated-base arg teststring))) + +(defun py-execute-line-python3-dedicated-base () + (assert (py-execute-line-python3-dedicated) nil "py-execute-line-python3-dedicated-test failed")) + +(defun py-execute-line-python3-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python3-dedicated-switch-base arg teststring))) + +(defun py-execute-line-python3-dedicated-switch-base () + (assert (py-execute-line-python3-dedicated-switch) nil "py-execute-line-python3-dedicated-switch-test failed")) + +(defun py-execute-line-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2-test\")")) + (py-bug-tests-intern 'py-execute-line-python2-base arg teststring))) + +(defun py-execute-line-python2-base () + (assert (py-execute-line-python2) nil "py-execute-line-python2-test failed")) + +(defun py-execute-line-python2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python2-switch-base arg teststring))) + +(defun py-execute-line-python2-switch-base () + (assert (py-execute-line-python2-switch) nil "py-execute-line-python2-switch-test failed")) + +(defun py-execute-line-python2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python2-no-switch-base arg teststring))) + +(defun py-execute-line-python2-no-switch-base () + (assert (py-execute-line-python2-no-switch) nil "py-execute-line-python2-no-switch-test failed")) + +(defun py-execute-line-python2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-line-python2-dedicated-base arg teststring))) + +(defun py-execute-line-python2-dedicated-base () + (assert (py-execute-line-python2-dedicated) nil "py-execute-line-python2-dedicated-test failed")) + +(defun py-execute-line-python2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python2-dedicated-switch-base arg teststring))) + +(defun py-execute-line-python2-dedicated-switch-base () + (assert (py-execute-line-python2-dedicated-switch) nil "py-execute-line-python2-dedicated-switch-test failed")) + +(defun py-execute-line-python2.7-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2.7-test\")")) + (py-bug-tests-intern 'py-execute-line-python2.7-base arg teststring))) + +(defun py-execute-line-python2.7-base () + (assert (py-execute-line-python2.7) nil "py-execute-line-python2.7-test failed")) + +(defun py-execute-line-python2.7-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2.7-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python2.7-switch-base arg teststring))) + +(defun py-execute-line-python2.7-switch-base () + (assert (py-execute-line-python2.7-switch) nil "py-execute-line-python2.7-switch-test failed")) + +(defun py-execute-line-python2.7-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2.7-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python2.7-no-switch-base arg teststring))) + +(defun py-execute-line-python2.7-no-switch-base () + (assert (py-execute-line-python2.7-no-switch) nil "py-execute-line-python2.7-no-switch-test failed")) + +(defun py-execute-line-python2.7-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2.7-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-line-python2.7-dedicated-base arg teststring))) + +(defun py-execute-line-python2.7-dedicated-base () + (assert (py-execute-line-python2.7-dedicated) nil "py-execute-line-python2.7-dedicated-test failed")) + +(defun py-execute-line-python2.7-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python2.7-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python2.7-dedicated-switch-base arg teststring))) + +(defun py-execute-line-python2.7-dedicated-switch-base () + (assert (py-execute-line-python2.7-dedicated-switch) nil "py-execute-line-python2.7-dedicated-switch-test failed")) + +(defun py-execute-line-jython-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-jython-test\")")) + (py-bug-tests-intern 'py-execute-line-jython-base arg teststring))) + +(defun py-execute-line-jython-base () + (assert (py-execute-line-jython) nil "py-execute-line-jython-test failed")) + +(defun py-execute-line-jython-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-jython-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-jython-switch-base arg teststring))) + +(defun py-execute-line-jython-switch-base () + (assert (py-execute-line-jython-switch) nil "py-execute-line-jython-switch-test failed")) + +(defun py-execute-line-jython-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-jython-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-jython-no-switch-base arg teststring))) + +(defun py-execute-line-jython-no-switch-base () + (assert (py-execute-line-jython-no-switch) nil "py-execute-line-jython-no-switch-test failed")) + +(defun py-execute-line-jython-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-jython-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-line-jython-dedicated-base arg teststring))) + +(defun py-execute-line-jython-dedicated-base () + (assert (py-execute-line-jython-dedicated) nil "py-execute-line-jython-dedicated-test failed")) + +(defun py-execute-line-jython-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-jython-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-jython-dedicated-switch-base arg teststring))) + +(defun py-execute-line-jython-dedicated-switch-base () + (assert (py-execute-line-jython-dedicated-switch) nil "py-execute-line-jython-dedicated-switch-test failed")) + +(defun py-execute-line-python3.2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3.2-test\")")) + (py-bug-tests-intern 'py-execute-line-python3.2-base arg teststring))) + +(defun py-execute-line-python3.2-base () + (assert (py-execute-line-python3.2) nil "py-execute-line-python3.2-test failed")) + +(defun py-execute-line-python3.2-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3.2-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python3.2-switch-base arg teststring))) + +(defun py-execute-line-python3.2-switch-base () + (assert (py-execute-line-python3.2-switch) nil "py-execute-line-python3.2-switch-test failed")) + +(defun py-execute-line-python3.2-no-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3.2-no-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python3.2-no-switch-base arg teststring))) + +(defun py-execute-line-python3.2-no-switch-base () + (assert (py-execute-line-python3.2-no-switch) nil "py-execute-line-python3.2-no-switch-test failed")) + +(defun py-execute-line-python3.2-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3.2-dedicated-test\")")) + (py-bug-tests-intern 'py-execute-line-python3.2-dedicated-base arg teststring))) + +(defun py-execute-line-python3.2-dedicated-base () + (assert (py-execute-line-python3.2-dedicated) nil "py-execute-line-python3.2-dedicated-test failed")) + +(defun py-execute-line-python3.2-dedicated-switch-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print(\"I'm the py-execute-line-python3.2-dedicated-switch-test\")")) + (py-bug-tests-intern 'py-execute-line-python3.2-dedicated-switch-base arg teststring))) + +(defun py-execute-line-python3.2-dedicated-switch-base () + (assert (py-execute-line-python3.2-dedicated-switch) nil "py-execute-line-python3.2-dedicated-switch-test failed")) + +(provide 'python-extended-executes-test) +;;; python-extended-executes-test.el ends here diff --git a/elpa/python-mode-6.1.3/test/python-extended-executes-test.elc b/elpa/python-mode-6.1.3/test/python-extended-executes-test.elc new file mode 100644 index 0000000000000000000000000000000000000000..5e6a7493131763949ac717e90109812fd0546aab GIT binary patch literal 150160 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 O+xYzPW>++?U;RHx!cp%4 literal 0 HcmV?d00001 diff --git a/elpa/python-mode-6.1.3/test/python-mode-ert-tests.el b/elpa/python-mode-6.1.3/test/python-mode-ert-tests.el new file mode 100644 index 000000000..00975db96 --- /dev/null +++ b/elpa/python-mode-6.1.3/test/python-mode-ert-tests.el @@ -0,0 +1,582 @@ +;;; python-mode-ert-tests.el --- Tests, some adapted from python.el + +;; Copyright (C) 2013 Free Software Foundation, Inc. +;; Copyright (C) 2014 Andreas Roehler, + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;;; Code: + +;; (require 'ert) + +(defmacro py-tests-with-temp-buffer (contents &rest body) + "Create a `python-mode' enabled temp buffer with CONTENTS. +BODY is code to be executed within the temp buffer. Point is +always located at the beginning of buffer." + (declare (indent 1) (debug t)) + `(with-temp-buffer + (let (hs-minor-mode) + (python-mode) + (insert ,contents) + (message "ERT %s" (point)) + (goto-char (point-min)) + ,@body))) + +(defun py-tests-go-to (string) + "Move point at beginning of STRING in the current test. " + (and (eq (point) (point-max))(goto-char (point-min))) + (search-forward string nil t 1)) + +(ert-deftest electric-kill-backward-test1 () + (let ((py-electric-kill-backward-p t)) + (with-temp-buffer + (insert "mystring[0:1]") + (py-electric-backspace 1) + (should (eq ?\] (char-after)))))) + +(ert-deftest electric-kill-backward-test2 () + (let ((py-electric-kill-backward-p t)) + (with-temp-buffer + (insert "mystring(\"asdf\")") + (py-electric-backspace 1) + (should (eq ?\) (char-after))) + ))) + +(ert-deftest electric-kill-backward-test3 () + (let ((py-electric-kill-backward-p t)) + (with-temp-buffer + (insert "mystring{0 . 1}") + (py-electric-backspace 1) + (should (eq ?\} (char-after))) + ))) + +(ert-deftest py-indent-dedenters-1 () + "Check all dedenters." + (py-tests-with-temp-buffer + " +def foo(a, b, c): + if a: + print (a) + elif b: + print (b) + else: + try: + print (c.pop()) + except (IndexError, AttributeError): + print (c) + finally: + print ('nor a, nor b are true') +" + (py-tests-go-to "if a:") + (should (= (py-compute-indentation) 4)) + (py-tests-go-to "print (a)") + (should (= (py-compute-indentation) 8)) + (py-tests-go-to "elif b:") + (should (= (py-compute-indentation) 4)) + (py-tests-go-to "print (b)") + (should (= (py-compute-indentation) 8)) + (py-tests-go-to "else:") + (should (= (py-compute-indentation) 4)) + (py-tests-go-to "try:") + (should (= (py-compute-indentation) 8)) + (py-tests-go-to "print (c.pop())") + (should (= (py-compute-indentation) 12)) + (py-tests-go-to "except (IndexError, AttributeError):") + (should (= (py-compute-indentation) 8)) + (py-tests-go-to "print (c)") + (should (= (py-compute-indentation) 12)) + (py-tests-go-to "finally:") + (should (= (py-compute-indentation) 8)) + (py-tests-go-to "print ('nor a, nor b are true')") + (should (= (py-compute-indentation) 12)))) + +(ert-deftest py-indent-after-backslash-lp-852052-1 () + "The most common case." + (py-tests-with-temp-buffer + " +from foo.bar.baz import something, something_1 \\ + something_2 something_3, \\ + something_4, something_5 +" + (py-tests-go-to "from foo.bar.baz import something, something_1") + (should (= (py-compute-indentation) 0)) + (py-tests-go-to "something_2 something_3,") + (should (= (py-compute-indentation) 5)) + (py-tests-go-to "something_4, something_5") + (should (= (py-compute-indentation) 5)))) + +(ert-deftest py-indent-closing () + "" + (py-tests-with-temp-buffer + " +my_list = [ + 1, 2, 3, + 4, 5, 6, + ] +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', + ) +" + (goto-char 40) + (should (eq 4 (py-compute-indentation))) + (goto-char 129) + (should (eq 4 (py-compute-indentation))))) + +(ert-deftest py-moves () + (py-tests-with-temp-buffer + "class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\" + + def __init__(self, d={}): + self._keys = d.keys() + dict.__init__(self, d) + + def f(): + \"\"\" + class for in 'for in while with blah' + \"\"\" + if a: + + ar_atpt_python_list_roh = ([ + 'python-expression', + + # def ar_thingatpt_write_lists (&optional datei): + 'python-partial-expression', + 'python-statement', + ]) + elif b: + pass + else b: + pass + +''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf +''' +" + (switch-to-buffer (current-buffer)) + ;; (sit-for 1) + (message "comment-start: %s" comment-start) + (goto-char 592) + ;; (sit-for 1) + (should (eq 561 (py-up-clause-bol))) + (message "%s" "py-up-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 317 (py-up-block-or-clause-bol)) ) + (message "%s" "py-up-block-or-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 234 (py-up-def-bol))) + (message "%s" "py-up-def-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 1 (py-up-class-bol))) + (message "%s" "py-up-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 234 (py-up-def-or-class-bol))) + (message "%s" "py-up-def-or-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 317 (py-up-block-bol))) + (message "%s" "py-up-block-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 317 (py-up-minor-block-bol))) + (message "%s" "py-up-minor-block-bol-test of `py-moves-test' done") + (goto-char 592) + ;; (sit-for 1) + (should (eq 325 (py-up-block))) + (message "%s" "py-up-block-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 325 (py-up-minor-block))) + (message "%s" "py-up-minor-block-test of `py-moves-test' done") + (goto-char 592) + ;; (sit-for 1) + (should (eq 569 (py-up-clause))) + (message "%s" "py-up-clause-test of `py-moves-test' done") + (goto-char 592) + ;; (sit-for 1) + (should (eq 569 (py-up-block-or-clause))) + (message "%s" "py-up-block-or-clause-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 238 (py-up-def))) + (message "%s" "py-up-def-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 1 (py-up-class))) + (message "%s" "py-up-class-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 238 (py-up-def-or-class))) + (message "%s" "py-up-def-or-class-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 1) + (should (eq 317 (py-down-block-bol))) + (message "%s" "py-down-block-bol-test of `py-moves-test' done") + (goto-char 561) + ;; (sit-for 1) + (should (eq 594 (py-down-clause-bol))) + (message "%s" "py-down-clause-bol-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 1) + (should (eq 317 (py-down-block-or-clause-bol))) + (message "%s" "py-down-block-or-clause-bol-test of `py-moves-test' done") + (goto-char (point-min)) + (should (eq 142 (py-down-def-bol))) + (message "%s" "py-down-def-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (not (py-down-class-bol))) + (message "%s" "py-down-class-bol-test of `py-moves-test' done") + (goto-char (point-min)) + (should (eq 142 (py-down-def-or-class-bol))) + (message "%s" "py-down-def-or-class-bol-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 1) + (should (eq 325 (py-down-block))) + (message "%s" "py-down-block-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 1) + (should (eq 317 (py-down-block-bol))) + (message "%s" "py-down-block-bol-test of `py-moves-test' done") + + (goto-char 264) + ;; (sit-for 1) + (should (eq 325 (py-down-minor-block))) + (message "%s" "py-down-minor-block-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 1) + (should (eq 317 (py-down-minor-block-bol))) + (message "%s" "py-down-minor-block-bol-test of `py-moves-test' done") + + (goto-char 569) + ;; (sit-for 1) + (should (eq 602 (py-down-clause))) + (message "%s" "py-down-clause-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 569 (py-down-block-or-clause))) + (message "%s" "py-down-block-or-clause-test of `py-moves-test' done") + (goto-char (point-min)) + (should (eq 146 (py-down-def))) + (message "%s" "py-down-def-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (not (py-down-class))) + (message "%s" "py-down-class-test of `py-moves-test' done") + (goto-char (point-min)) + (should (eq 146 (py-down-def-or-class))) + (message "%s" "py-down-def-or-class-test of `py-moves-test' done") + + (goto-char 410) + ;; (sit-for 1) + (should (eq 332 (py-beginning-of-statement-bol))) + (message "%s" "py-beginning-of-statement-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 317 (py-beginning-of-block-bol))) + (message "%s" "py-beginning-of-block-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 317 (py-beginning-of-clause-bol))) + (message "%s" "py-beginning-of-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 317 (py-beginning-of-block-or-clause-bol))) + (message "%s" "py-beginning-of-block-or-clause-bol-test of `py-moves-test' done") + (should (eq 1 (py-beginning-of-class-bol))) + (message "%s" "py-beginning-of-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 234 (py-beginning-of-def-or-class-bol))) + (message "%s" "py-beginning-of-def-or-class-bol-test of `py-moves-test' done") + (message "%s" "py-end-of-block-bol-test of `py-moves-test' done") + (goto-char 576) + ;; (sit-for 1) + (should (eq 594 (py-end-of-clause-bol))) + (message "%s" "py-end-of-clause-bol-test of `py-moves-test' done") + (goto-char 576) + ;; (sit-for 1) + (should (eq 594 (py-end-of-block-or-clause-bol))) + (message "%s" "py-end-of-block-or-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 627 (py-end-of-def-bol))) + (message "%s" "py-end-of-def-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 627 (py-end-of-class-bol))) + (message "%s" "py-end-of-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 627 (py-end-of-def-or-class-bol))) + (message "%s" "py-end-of-def-or-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 561 (py-end-of-statement-bol))) + (message "%s" "py-end-of-statement-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 1) + (should (eq 234 (py-beginning-of-def-bol))) + (message "%s" "py-beginning-of-def-bol-test of `py-moves-test' done") + )) + +(ert-deftest py-indent-tabs-mode-test () + (py-tests-with-temp-buffer + "class OrderedDict1(dict):" + (end-of-line) + (let ((indent-tabs-mode t)) + (py-newline-and-indent) + (should (looking-back "^\t"))))) + +(ert-deftest py-no-indent-tabs-mode-test () + (py-tests-with-temp-buffer + "class OrderedDict1(dict):" + (end-of-line) + (let ((indent-tabs-mode)) + (py-newline-and-indent) + (should (looking-back "^ "))))) + +(ert-deftest py-pyflakespep-command-test () + (py-tests-with-temp-buffer + "" + (file-readable-p py-pyflakespep8-command))) + +(ert-deftest Bogus-dedent-when-typing-colon-in-dictionary-literal-lp-1197171 () + (py-tests-with-temp-buffer + "#! /usr/bin/env python +# -*- coding: utf-8 -*- +# Put point at the end of the last line and hit colon, as you would to +# separate the key from the value. The last line will incorrectly dedent +# to column 4. Indentation should not change. + +def foo(): + bar('thing', + {'another'" + (goto-char (point-max)) + (should (eq 8 (py-compute-indentation))))) + +;; (ert-deftest exception-buffer-and-line () +;; (py-tests-with-temp-buffer +;; "print(4+5d)" +;; ;; error should report its just a buffer, not a file +;; (should (string-match "SyntaxError: invalid syntax" (py-execute-statement))))) + +(ert-deftest pep-arglist-indent () + (py-tests-with-temp-buffer + "# Aligned with opening delimiter +foo = long_function_name(var_one, var_two, + var_three, var_four) + +# More indentation included to distinguish this from the rest. +def long_function_name( + var_one, var_two, var_three, + var_four): + print(var_one) +" + (search-forward "var_three") + (should (eq 25 (py-compute-indentation))) + (search-forward "var_three") + (should (eq 8 (py-compute-indentation))) + + )) + +(ert-deftest close-at-start-column () + (py-tests-with-temp-buffer + "# boolean `py-closing-list-dedents-bos', + +# Current behavior matches default nil + +my_list = [ + 1, 2, 3, + 4, 5, 6, + ] + +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', + ) + +# When non-nil, it will be lined up under the first character of the line that starts the multi-line construct, as in: + +my_list = [ + 1, 2, 3, + 4, 5, 6, +] + +result = some_function_that_takes_arguments( + 'a', 'b', 'c', + 'd', 'e', 'f', +) + +# Examples see PEP8 + +asdf = { + 'a':{ + 'b':3, + 'c':4 + } +} + +data = { + 'key': + { + 'objlist': [ + { + 'pk': 1, + 'name': 'first', + }, + { + 'pk': 2, + 'name': 'second', + } + ] + } +} + +" + (let (py-closing-list-dedents-bos) + (switch-to-buffer (current-buffer)) + (search-forward "]") + (should (eq 4 (py-compute-indentation))) + (search-forward ")") + (should (eq 4 (py-compute-indentation))) + (setq py-closing-list-dedents-bos t) + (search-forward "]") + (should (eq 0 (py-compute-indentation))) + (search-forward ")") + (should (eq 0 (py-compute-indentation))) + ;; dicts + (search-forward "}") + (should (eq 4 (py-compute-indentation))) + (search-forward "}") + (should (eq 0 (py-compute-indentation))) + (search-forward "}") + (should (eq 12 (py-compute-indentation))) + (search-forward "]") + (should (eq 8 (py-compute-indentation))) + (search-forward "}") + (should (eq 4 (py-compute-indentation))) + (search-forward "}") + (should (eq 0 (py-compute-indentation))) + ))) + +(ert-deftest top-level () + (py-tests-with-temp-buffer + "klauf = kugel() + +with file(\"roulette-\" + zeit + \".csv\", 'w') as datei: + for i in range(anzahl): + klauf.pylauf() + datei.write(str(spiel[i]) + \"\\n\") +" + (message "%s" (point)) + (switch-to-buffer (current-buffer)) + (should (eq 16 (py-end-of-top-level))) + (should (eq 168 (py-end-of-top-level))) + + (should (eq 18 (py-beginning-of-top-level))) + (should (eq 1 (py-beginning-of-top-level))) + (should (eq 1 (py-beginning-of-top-level-p))))) + +(ert-deftest position-tests () + (interactive) + (py-tests-with-temp-buffer + "class kugel(object): + zeit = time.strftime('%Y%m%d--%H-%M-%S') + def pylauf(self): + \"\"\"Eine Doku fuer pylauf\"\"\" + ausgabe = [\" \",\" \",\" \",\" \",\" \",\" \",\" \",\" \", \" \"] + if treffer in gruen: + # print \"0, Gruen\" + elif treffer in schwarz: + # print \"%i, Schwarz\" % (treffer) + ausgabe[1] = treffer + else: + # print \"%i, manque\" % (treffer) + ausgabe[7] = treffer +" + (switch-to-buffer (current-buffer)) + (search-forward "else:") + (forward-char -1) + (should (eq 1 (py-beginning-of-top-level-position))) + (should (eq 445 (py-end-of-top-level-position))) + (should (eq 362 (py-beginning-of-statement-position))) + (should (eq 367 (py-end-of-statement-position))) + (should (eq 367 (py-end-of-line-position))) + (should (eq 354 (py-beginning-of-line-position))) + (should (eq 1 (py-beginning-of-paragraph-position))) + (should (eq 446 (py-end-of-paragraph-position))) + (should (eq 190 (py-beginning-of-block-position))) + (should (eq 445 (py-end-of-block-position))) + (should (eq 190 (py-beginning-of-minor-block-position))) + (should (eq 445 (py-end-of-minor-block-position))) + (should (eq 362 (py-beginning-of-clause-position))) + (should (eq 445 (py-end-of-clause-position))) + (should (eq 362 (py-beginning-of-block-or-clause-position))) + (should (eq 445 (py-end-of-block-or-clause-position))) + (should (eq 71 (py-beginning-of-def-position))) + (should (eq 445 (py-end-of-def-position))) + (should (eq 1 (py-beginning-of-class-position))) + (should (eq 445 (py-end-of-class-position))) + (should (eq 71 (py-beginning-of-def-or-class-position))) + (should (eq 445 (py-end-of-def-or-class-position))) + (search-forward "#") + (should (eq 380 (py-beginning-of-comment-position))) + (should (eq 412 (py-end-of-comment-position))))) + +(ert-deftest py-copy-statement-test () + (interactive) + (py-tests-with-temp-buffer + "from foo.bar.baz import something +" + (should (and (not (py-copy-statement))(string-match "from foo.bar.baz import something" (car kill-ring)))))) + +(ert-deftest execute-runs-full-file-lp-1269855 () + (interactive) + (py-tests-with-temp-buffer + ;; (switch-to-buffer (buffer-name (current-buffer))) + "a = 0 +a += 8 +a += 1 +print(a) +eval(a) +" + (py-execute-buffer) + (goto-char 14) + (py-execute-statement) + (goto-char 22) + (py-execute-statement) + (goto-char 31) + (py-execute-statement))) + +(ert-deftest py-abbrevs-changed-lp-1270631 () + (interactive) + (with-temp-buffer + (insert "foo") + (emacs-lisp-mode) + (define-abbrev lisp-mode-abbrev-table "foo" "foo") + (should abbrevs-changed) + (python-mode) + (should abbrevs-changed))) + +(provide 'python-mode-ert-tests) diff --git a/elpa/python-mode-6.1.3/test/python-mode-ert-tests.elc b/elpa/python-mode-6.1.3/test/python-mode-ert-tests.elc new file mode 100644 index 0000000000000000000000000000000000000000..9a5b1657acb1c0d49c44a23df3a5da4e6a26764b GIT binary patch literal 71537 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 +;; Keywords: lisp, languages + +;; 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 . + +;;; Commentary: + +;; A couple of test cases for python-mode.el + +;;; Code: +(require 'py-bug-numbered-tests) + +(defvar py-variables (list 'py-version 'python-mode-modeline-display 'py-indent-offset 'pdb-path 'py-verbose-p 'py-load-pymacs-p 'py-smart-operator-mode-p 'py-sexp-function 'py-autopair-mode 'py-no-completion-calls-dabbrev-expand-p 'py-indent-no-completion-p 'py-fontify-shell-buffer-p 'py-modeline-display-full-path-p 'py-modeline-acronym-display-home-p 'py-install-directory 'py-guess-py-install-directory-p 'py-extensions 'py-hide-show-minor-mode-p 'empty-comment-line-separates-paragraph-p 'py-org-cycle-p 'ipython-complete-use-separate-shell-p 'py-outline-minor-mode-p 'py-outline-mode-keywords 'py-start-run-py-shell 'py-start-run-ipython-shell 'py-close-provides-newline 'py-dedent-keep-relative-column 'py-indent-honors-inline-comment 'py-closing-list-dedents-bos 'py-electric-colon-active-p 'py-electric-colon-greedy-p 'py-electric-colon-newline-and-indent-p 'py-electric-comment-p 'py-electric-comment-add-space-p 'py-mark-decorators 'py-tab-indent 'py-complete-function 'py-encoding-string 'py-shebang-startstring 'py-python-command-args 'py-jython-command-args 'py-cleanup-temporary 'py-lhs-inbound-indent 'py-continuation-offset 'py-indent-tabs-mode 'py-smart-indentation 'py-block-comment-prefix 'py-indent-comments 'py-separator-char 'py-custom-temp-directory 'py-jump-on-exception 'py-ask-about-save 'py-pdbtrack-do-tracking-p 'py-pdbtrack-filename-mapping 'py-pdbtrack-minor-mode-string 'py-import-check-point-max 'py-jython-packages 'py-current-defun-show 'py-current-defun-delay 'py-honor-IPYTHONDIR-p 'py-ipython-history 'py-honor-PYTHONHISTORY-p 'py-master-file 'py-pychecker-command 'py-pychecker-command-args 'py-pep8-command 'py-pep8-command-args 'py-pyflakespep8-command 'py-pep8-command 'py-pep8-command-args 'py-pyflakespep8-command-args 'py-pyflakes-command 'py-pyflakes-command-args 'py-pep8-command-args 'py-pylint-command 'py-pylint-command-args 'py-shell-input-prompt-1-regexp 'py-shell-input-prompt-2-regexp 'py-shell-prompt-read-only 'py-switch-buffers-on-execute-p 'py-split-windows-on-execute-p 'py-max-split-windows 'py-split-windows-on-execute-function 'py-hide-show-keywords 'py-hide-show-hide-docstrings 'python-mode-hook 'py-imenu-create-index-p 'py-imenu-create-index-function 'py-shell-name 'py-shell-toggle-1 'py-shell-toggle-2 'py-match-paren-mode 'py-kill-empty-line 'py-remove-cwd-from-path 'py-imenu-show-method-args-p 'py-history-filter-regexp 'py-use-local-default 'py-shell-local-path 'py-underscore-word-syntax-p 'py-edit-only-p 'py-force-py-shell-name-p 'python-mode-v5-behavior-p 'py-trailing-whitespace-smart-delete-p 'py-warn-tmp-files-left-p 'py-ipython-execute-delay 'strip-chars-before 'strip-chars-after 'py-fill-docstring-style 'py-number-face 'py-XXX-tag-face 'py-pseudo-keyword-face 'py-variable-name-face 'py-decorators-face 'py-builtins-face 'py-class-name-face 'py-exception-name-face 'python-mode-message-string 'py-local-command 'py-local-versioned-command 'py-shell-complete-debug 'py-encoding-string-re 'symbol-definition-start-re 'symbol-definition-start-re 'py-shebang-regexp 'py-separator-char 'py-temp-directory 'py-exec-command 'py-exec-string-command 'py-which-bufname 'py-pychecker-history 'py-pep8-history 'py-pyflakespep8-history 'py-pyflakes-history 'py-pylint-history 'ipython-de-input-prompt-regexp 'ipython-de-input-prompt-regexp 'ipython-de-output-prompt-regexp 'py-force-local-shell-p 'python-mode-v5-behavior 'python--prompt-regexp 'py-bol-forms-last-indent 'python-mode-syntax-table 'outline-heading-end-regexp 'eldoc-documentation-function 'py-completion-last-window-configuration 'ipython-version 'py-shell-template 'py-imports 'py-execute-directory 'py-use-current-dir-when-execute-p 'py-exception-buffer 'py-output-buffer 'py-string-delim-re 'py-labelled-re 'py-expression-skip-regexp 'py-expression-skip-chars 'py-expression-looking-re 'py-not-expression-regexp 'py-not-expression-chars 'py-not-expression-chars 'py-partial-expression-skip-chars 'py-partial-expression-forward-regexp 'py-partial-expression-skip-backward-chars 'py-not-partial-expression-skip-chars 'py-partial-expression-looking-regexp 'py-not-partial-expression-regexp 'py-operator-regexp 'py-assignment-regexp 'py-delimiter-regexp 'py-delimiter-chars 'py-line-number-offset 'match-paren-no-use-syntax-pps 'py-traceback-line-re 'py-traceback-line-re 'python-preoutput-result 'python-preoutput-leftover 'python-preoutput-skip-next-prompt 'py-mode-syntax-table 'py-file-queue 'python-mode-abbrev-table 'inferior-python-mode-abbrev-table 'py-pdbtrack-input-prompt 'py-pydbtrack-input-prompt 'py-pdbtrack-is-tracking-p 'py-shell-map 'py-font-lock-keywords 'py-dotted-expression-syntax-table 'jython-mode-hook 'py-shell-hook 'ipython-completion-command-string 'ipython0.10-completion-command-string 'ipython0.11-completion-command-string 'py-last-exeption-buffer 'python-preoutput-result 'py-imenu-class-regexp 'py-imenu-method-regexp 'py-imenu-method-no-arg-parens 'py-imenu-method-arg-parens 'py-imenu-generic-expression 'py-imenu-generic-regexp 'py-imenu-generic-parens 'py-mode-output-map 'py-menu 'py-already-guessed-indent-offset 'python-mode-map 'skeleton-further-elements 'virtualenv-workon-home 'virtualenv-name 'python-mode-syntax-table 'python-dotty-syntax-table 'py-shell-template 'py-blank-or-comment-re 'py-block-closing-keywords-re 'py-finally-re 'py-except-re 'py-else-re 'py-no-outdent-re 'py-assignment-re 'py-block-re 'py-minor-block-re 'py-try-block-re 'py-class-re 'py-def-or-class-re 'py-def-re 'py-block-or-clause-re 'py-extended-block-or-clause-re 'py-clause-re 'py-elif-re 'py-if-re 'py-try-re 'py-mode-syntax-table 'py-pdbtrack-stack-entry-regexp 'py-pdbtrack-input-prompt 'py-pydbtrack-input-prompt 'py-pdbtrack-marker-regexp-file-group 'py-pdbtrack-marker-regexp-line-group 'py-pdbtrack-marker-regexp-funcname-group 'py-pdbtrack-track-range 'python-compilation-regexp-alist 'py-font-lock-syntactic-keywords 'virtualenv-name ) + "Used for bug-tracking by `py-list-settings'") + +(defvar unused-variables (list 'py-indent-honors-multiline-listing 'ipython-complete-function 'py-rhs-inbound-indent 'py-align-multiline-strings-p 'py-beep-if-tab-change 'py-backspace-function 'py-delete-function 'py-send-receive-delay 'py-python-history 'py-source-modes 'py-shell-prompt-alist 'py-shell-continuation-prompt-alist 'py-match-paren-key 'py-set-complete-keymap-p 'python-eldoc-setup-code 'python-eldoc-string-code 'python-use-skeletons 'python-local-version 'py-local-complete-function 'py-shell-alist 'python-pdbtrack-tracked-buffer 'view-return-to-alist 'py-prev-dir/file 'python-preoutput-continuation 'python-version-checked 'py-help-mode-syntax-table 'python-file-queue 'python-pdbtrack-is-tracking-p 'py-indent-line-indent 'inferior-python-mode-map 'py-variables 'inferior-python-mode-syntax-table 'py-return-re 'py-try-clause-re 'py-space-backslash-table 'python-pdbtrack-stack-entry-regexp 'python-pdbtrack-input-prompt 'python-pdbtrack-track-range 'python-dotty-syntax-table 'py-help-address 'py-shell-map 'python-mode-map 'imenu-generic-expression )) + +(defun py-list-settings () + "List py-variables with it's current value. + + For debugging " + (interactive) + (set-buffer (get-buffer-create "Python-mode-el-settings")) + (erase-buffer) + (load (concat (py-normalize-directory py-install-directory) "devel/python-mode-vars.el") nil t) + (dolist (elt py-variables) + (insert (concat (prin1-to-string elt) " ==> ")) + (if (stringp (ignore-errors (symbol-value elt))) + (insert (concat (symbol-value elt) "\n\n")) + (insert (concat (prin1-to-string (ignore-errors (symbol-value elt))) "\n\n")))) + (switch-to-buffer (current-buffer))) + +(setq python-mode-tests + (list + 'docstring-style-switches-test + 'py-nested-block-or-clause-test + 'py-down-statement-test + 'py-fill-string-django-test + 'py-fill-string-onetwo-test + 'py-fill-string-pep-257-test + 'py-fill-string-pep-257-nn-test + ;; fails for unknown reasons, interactive call works + ;; 'py-fill-string-symmetric-test + 'py-highlight-indentation-test + 'py-smart-indentation-test + 'autopair-mode-test + 'py-smart-operator-test + 'py-guess-indent-offset-test + 'py-bol-moves-test + ;; broken + ;; 'augmented-assigment-test + 'key-binding-tests + 'py-end-of-statement-test + 'py-compute-indentation-test + 'py-end-of-def-inline-comment-test + 'before-inline-comment-test + 'toggle-force-py-shell-name-p-test + 'py-execute-statement-python-test + 'py-execute-statement-python-switch-test + 'py-execute-statement-python-noswitch-test + 'py-execute-statement-python-dedicated-test + 'py-execute-statement-python-dedicated-switch-test + 'py-execute-statement-ipython-test + 'py-execute-statement-ipython-switch-test + 'py-execute-statement-ipython-noswitch-test + 'py-execute-statement-ipython-dedicated-test + 'py-execute-statement-ipython-dedicated-switch-test + 'py-execute-statement-python3-test + 'py-execute-statement-python3-switch-test + 'py-execute-statement-python3-noswitch-test + 'py-execute-statement-python3-dedicated-test + 'py-execute-statement-python3-dedicated-switch-test + 'py-execute-statement-python2-test + 'py-execute-statement-python2-switch-test + 'py-execute-statement-python2-noswitch-test + 'py-execute-statement-python2-dedicated-test + 'py-execute-statement-python2-dedicated-switch-test + 'py-execute-statement-python2.7-test + 'py-execute-statement-python2.7-switch-test + 'py-execute-statement-python2.7-noswitch-test + 'py-execute-statement-python2.7-dedicated-test + 'py-execute-statement-python2.7-dedicated-switch-test + 'py-execute-statement-jython-test + 'py-execute-statement-jython-switch-test + 'py-execute-statement-jython-noswitch-test + 'py-execute-statement-jython-dedicated-test + 'py-execute-statement-jython-dedicated-switch-test + 'py-separator-char-test + 'py-execute-block-python-switch-test + 'py-execute-block-python-noswitch-test + 'py-execute-block-python-dedicated-test + 'py-execute-block-python-dedicated-switch-test + 'py-execute-block-ipython-test + 'py-execute-block-ipython-switch-test + 'py-execute-block-ipython-noswitch-test + 'py-execute-block-ipython-dedicated-test + 'py-execute-block-ipython-dedicated-switch-test + 'py-execute-block-python3-test + 'py-execute-block-python3-switch-test + 'py-execute-block-python3-noswitch-test + 'py-execute-block-python3-dedicated-test + 'py-execute-block-python3-dedicated-switch-test + 'py-execute-block-python2-test + 'py-execute-block-python2-switch-test + 'py-execute-block-python2-noswitch-test + 'py-execute-block-python2-dedicated-test + 'py-execute-block-python2-dedicated-switch-test + 'py-execute-block-python2.7-test + 'py-execute-block-python2.7-switch-test + 'py-execute-block-python2.7-noswitch-test + 'py-execute-block-python2.7-dedicated-test + 'py-execute-block-python2.7-dedicated-switch-test + 'py-execute-block-jython-test + 'py-execute-block-jython-switch-test + 'py-execute-block-jython-noswitch-test + 'py-execute-block-jython-dedicated-test + 'py-execute-block-jython-dedicated-switch-test + 'py-execute-block-or-clause-python-test + 'py-execute-block-or-clause-python-switch-test + 'py-execute-block-or-clause-python-noswitch-test + 'py-execute-block-or-clause-python-dedicated-test + 'py-execute-block-or-clause-python-dedicated-switch-test + 'py-execute-block-or-clause-ipython-test + 'py-execute-block-or-clause-ipython-switch-test + 'py-execute-block-or-clause-ipython-noswitch-test + 'py-execute-block-or-clause-ipython-dedicated-test + 'py-execute-block-or-clause-ipython-dedicated-switch-test + 'py-execute-block-or-clause-python3-test + 'py-execute-block-or-clause-python3-switch-test + 'py-execute-block-or-clause-python3-noswitch-test + 'py-execute-block-or-clause-python3-dedicated-test + 'py-execute-block-or-clause-python3-dedicated-switch-test + 'py-execute-block-or-clause-python2-test + 'py-execute-block-or-clause-python2-switch-test + 'py-execute-block-or-clause-python2-noswitch-test + 'py-execute-block-or-clause-python2-dedicated-test + 'py-execute-block-or-clause-python2-dedicated-switch-test + 'py-execute-block-or-clause-python2.7-test + 'py-execute-block-or-clause-python2.7-switch-test + 'py-execute-block-or-clause-python2.7-noswitch-test + 'py-execute-block-or-clause-python2.7-dedicated-test + 'py-execute-block-or-clause-python2.7-dedicated-switch-test + 'py-execute-block-or-clause-jython-test + 'py-execute-block-or-clause-jython-switch-test + 'py-execute-block-or-clause-jython-noswitch-test + 'py-execute-block-or-clause-jython-dedicated-test + 'py-execute-block-or-clause-jython-dedicated-switch-test + 'py-execute-def-python-test + 'py-execute-def-python-switch-test + 'py-execute-def-python-noswitch-test + 'py-execute-def-python-dedicated-test + 'py-execute-def-python-dedicated-switch-test + 'py-execute-def-ipython-test + 'py-execute-def-ipython-switch-test + 'py-execute-def-ipython-noswitch-test + 'py-execute-def-ipython-dedicated-test + 'py-execute-def-ipython-dedicated-switch-test + 'py-execute-def-python3-test + 'py-execute-def-python3-switch-test + 'py-execute-def-python3-noswitch-test + 'py-execute-def-python3-dedicated-test + 'py-execute-def-python3-dedicated-switch-test + 'py-execute-def-python2-test + 'py-execute-def-python2-switch-test + 'py-execute-def-python2-noswitch-test + 'py-execute-def-python2-dedicated-test + 'py-execute-def-python2-dedicated-switch-test + 'py-execute-def-python2.7-test + 'py-execute-def-python2.7-switch-test + 'py-execute-def-python2.7-noswitch-test + 'py-execute-def-python2.7-dedicated-test + 'py-execute-def-python2.7-dedicated-switch-test + 'py-execute-def-jython-test + 'py-execute-def-jython-switch-test + 'py-execute-def-jython-noswitch-test + 'py-execute-def-jython-dedicated-test + 'py-execute-def-jython-dedicated-switch-test + 'py-execute-class-python-test + 'py-execute-class-python-switch-test + 'py-execute-class-python-noswitch-test + 'py-execute-class-python-dedicated-test + 'py-execute-class-python-dedicated-switch-test + 'py-execute-class-ipython-test + 'py-execute-class-ipython-switch-test + 'py-execute-class-ipython-noswitch-test + 'py-execute-class-ipython-dedicated-test + 'py-execute-class-ipython-dedicated-switch-test + 'py-execute-class-python3-test + 'py-execute-class-python3-switch-test + 'py-execute-class-python3-noswitch-test + 'py-execute-class-python3-dedicated-test + 'py-execute-class-python3-dedicated-switch-test + 'py-execute-class-python2-test + 'py-execute-class-python2-switch-test + 'py-execute-class-python2-noswitch-test + 'py-execute-class-python2-dedicated-test + 'py-execute-class-python2-dedicated-switch-test + 'py-execute-class-python2.7-test + 'py-execute-class-python2.7-switch-test + 'py-execute-class-python2.7-noswitch-test + 'py-execute-class-python2.7-dedicated-test + 'py-execute-class-python2.7-dedicated-switch-test + 'py-execute-class-jython-test + 'py-execute-class-jython-switch-test + 'py-execute-class-jython-noswitch-test + 'py-execute-class-jython-dedicated-test + 'py-execute-class-jython-dedicated-switch-test + 'py-execute-region-python-test + 'py-execute-region-python-switch-test + 'py-execute-region-python-noswitch-test + 'py-execute-region-python-dedicated-test + 'py-execute-region-python-dedicated-switch-test + 'py-execute-region-ipython-test + 'py-execute-region-ipython-switch-test + 'py-execute-region-ipython-noswitch-test + 'py-execute-region-ipython-dedicated-test + 'py-execute-region-ipython-dedicated-switch-test + 'py-execute-region-python3-test + 'py-execute-region-python3-switch-test + 'py-execute-region-python3-noswitch-test + 'py-execute-region-python3-dedicated-test + 'py-execute-region-python3-dedicated-switch-test + 'py-execute-region-python2-test + 'py-execute-region-python2-switch-test + 'py-execute-region-python2-noswitch-test + 'py-execute-region-python2-dedicated-test + 'py-execute-region-python2-dedicated-switch-test + 'py-execute-region-python2.7-test + 'py-execute-region-python2.7-switch-test + 'py-execute-region-python2.7-noswitch-test + 'py-execute-region-python2.7-dedicated-test + 'py-execute-region-python2.7-dedicated-switch-test + 'py-execute-region-jython-test + 'py-execute-region-jython-switch-test + 'py-execute-region-jython-noswitch-test + 'py-execute-region-jython-dedicated-test + 'py-execute-region-jython-dedicated-switch-test + 'py-execute-buffer-python-test + 'py-execute-buffer-python-switch-test + 'py-execute-buffer-python-noswitch-test + 'py-execute-buffer-python-dedicated-test + 'py-execute-buffer-python-dedicated-switch-test + 'py-execute-buffer-ipython-test + 'py-execute-buffer-ipython-switch-test + 'py-execute-buffer-ipython-noswitch-test + 'py-execute-buffer-ipython-dedicated-test + 'py-execute-buffer-ipython-dedicated-switch-test + 'py-execute-buffer-python3-test + 'py-execute-buffer-python3-switch-test + 'py-execute-buffer-python3-noswitch-test + 'py-execute-buffer-python3-dedicated-test + 'py-execute-buffer-python3-dedicated-switch-test + 'py-execute-buffer-python2-test + 'py-execute-buffer-python2-switch-test + 'py-execute-buffer-python2-noswitch-test + 'py-execute-buffer-python2-dedicated-test + 'py-execute-buffer-python2-dedicated-switch-test + 'py-execute-buffer-python2.7-test + 'py-execute-buffer-python2.7-switch-test + 'py-execute-buffer-python2.7-noswitch-test + 'py-execute-buffer-python2.7-dedicated-test + 'py-execute-buffer-python2.7-dedicated-switch-test + 'py-execute-buffer-jython-test + 'py-execute-buffer-jython-switch-test + 'py-execute-buffer-jython-noswitch-test + 'py-execute-buffer-jython-dedicated-test + 'py-execute-buffer-jython-dedicated-switch-test + 'py-execute-expression-python-test + 'py-execute-expression-python-switch-test + 'py-execute-expression-python-noswitch-test + 'py-execute-expression-python-dedicated-test + 'py-execute-expression-python-dedicated-switch-test + 'py-execute-expression-ipython-test + 'py-execute-expression-ipython-switch-test + 'py-execute-expression-ipython-noswitch-test + 'py-execute-expression-ipython-dedicated-test + 'py-execute-expression-ipython-dedicated-switch-test + 'py-execute-expression-python3-test + 'py-execute-expression-python3-switch-test + 'py-execute-expression-python3-noswitch-test + 'py-execute-expression-python3-dedicated-test + 'py-execute-expression-python3-dedicated-switch-test + 'py-execute-expression-python2-test + 'py-execute-expression-python2-switch-test + 'py-execute-expression-python2-noswitch-test + 'py-execute-expression-python2-dedicated-test + 'py-execute-expression-python2-dedicated-switch-test + 'py-execute-expression-python2.7-test + 'py-execute-expression-python2.7-switch-test + 'py-execute-expression-python2.7-noswitch-test + 'py-execute-expression-python2.7-dedicated-test + 'py-execute-expression-python2.7-dedicated-switch-test + 'py-execute-expression-jython-test + 'py-execute-expression-jython-switch-test + 'py-execute-expression-jython-noswitch-test + 'py-execute-expression-jython-dedicated-test + 'py-execute-expression-jython-dedicated-switch-test + 'py-execute-partial-expression-python-test + 'py-execute-partial-expression-python-switch-test + 'py-execute-partial-expression-python-noswitch-test + 'py-execute-partial-expression-python-dedicated-test + 'py-execute-partial-expression-python-dedicated-switch-test + 'py-execute-partial-expression-ipython-test + 'py-execute-partial-expression-ipython-switch-test + 'py-execute-partial-expression-ipython-noswitch-test + 'py-execute-partial-expression-ipython-dedicated-test + 'py-execute-partial-expression-ipython-dedicated-switch-test + 'py-execute-partial-expression-python3-test + 'py-execute-partial-expression-python3-switch-test + 'py-execute-partial-expression-python3-noswitch-test + 'py-execute-partial-expression-python3-dedicated-test + 'py-execute-partial-expression-python3-dedicated-switch-test + 'py-execute-partial-expression-python2-test + 'py-execute-partial-expression-python2-switch-test + 'py-execute-partial-expression-python2-noswitch-test + 'py-execute-partial-expression-python2-dedicated-test + 'py-execute-partial-expression-python2-dedicated-switch-test + 'py-execute-partial-expression-python2.7-test + 'py-execute-partial-expression-python2.7-switch-test + 'py-execute-partial-expression-python2.7-noswitch-test + 'py-execute-partial-expression-python2.7-dedicated-test + 'py-execute-partial-expression-python2.7-dedicated-switch-test + 'py-execute-partial-expression-jython-test + 'py-execute-partial-expression-jython-switch-test + 'py-execute-partial-expression-jython-noswitch-test + 'py-execute-partial-expression-jython-dedicated-test + 'py-execute-partial-expression-jython-dedicated-switch-test + 'py-execute-line-python-test + 'py-execute-line-python-switch-test + 'py-execute-line-python-noswitch-test + 'py-execute-line-python-dedicated-test + 'py-execute-line-python-dedicated-switch-test + 'py-execute-line-ipython-test + 'py-execute-line-ipython-switch-test + 'py-execute-line-ipython-noswitch-test + 'py-execute-line-ipython-dedicated-test + 'py-execute-line-ipython-dedicated-switch-test + 'py-execute-line-python3-test + 'py-execute-line-python3-switch-test + 'py-execute-line-python3-noswitch-test + 'py-execute-line-python3-dedicated-test + 'py-execute-line-python3-dedicated-switch-test + 'py-execute-line-python2-test + 'py-execute-line-python2-switch-test + 'py-execute-line-python2-noswitch-test + 'py-execute-line-python2-dedicated-test + 'py-execute-line-python2-dedicated-switch-test + 'py-execute-line-python2.7-test + 'py-execute-line-python2.7-switch-test + 'py-execute-line-python2.7-noswitch-test + 'py-execute-line-python2.7-dedicated-test + 'py-execute-line-python2.7-dedicated-switch-test + 'py-execute-line-jython-test + 'py-execute-line-jython-switch-test + 'py-execute-line-jython-noswitch-test + 'py-execute-line-jython-dedicated-test + 'py-execute-line-jython-dedicated-switch-test + + 'py-beginning-of-block-test + 'py-end-of-block-test + 'py-beginning-of-block-or-clause-test + 'py-end-of-block-or-clause-test + 'py-beginning-of-def-test + 'py-end-of-def-test + 'py-beginning-of-def-or-class-test + 'py-end-of-def-or-class-test + 'py-electric-backspace-test + 'py-electric-delete-test + 'dict-error-test + ;; 'py-expand-abbrev-pst-pdb.set_trace-test + 'near-bob-beginning-of-statement-test + 'bob-beginning-of-statement-test + 'honor-comments-indent-test + 'assignment-indent-test + 'if-elif-test + 'if-elif-bob-test + 'try-else-clause-test + 'try-except-test + 'assignment-after-block-test + 'py-beginning-of-clause-test + 'py-end-of-clause-test + 'py-beginning-of-expression-test + 'py-end-of-expression-test + 'py-expression-index-test + 'py-indent-after-assigment-test + 'leave-dict-test + 'eofs-attribut-test + 'py-insert-super-python2-test + 'py-insert-super-python3-test + 'args-list-first-line-indent-test + 'py-partial-expression-test + 'py-execute-block-test + 'multiline-list-indent-test + 'close-block-test + 'py-shift-block-test + 'nesting-if-test + 'py-end-of-print-statement-test + 'nested-try-test + 'nested-if-test + 'nested-try-finally-test + 'py-shell-complete-test + 'python-dedicated-test + 'tqs-list-error-test + 'py-mark-def-commandp-test + 'split-windows-on-execute-p-test + 'switch-windows-on-execute-p-test + 'py-install-directory-path-test + 'UnicodeEncodeError-python3-test + 'py-execute-block-python-test + + )) + +(defun py-run-tests (&optional arg) + (interactive "p") + (dolist (ele python-mode-tests) + (funcall ele arg))) + +(defvar python-mode-teststring "class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\" + + def __init__(self, d={}): + self._keys = d.keys() + dict.__init__(self, d) + + def f(): + \"\"\" + class for in 'for in while with blah' + \"\"\" + if a: + + ar_atpt_python_list_roh = ([ + 'python-expression', + + # def ar_thingatpt_write_lists (&optional datei): + 'python-partial-expression', + 'python-statement', + ]) + elif b: + pass + else b: + pass + + ]) + +''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf +''' +" + "String used for tests by python-mode-test.el") + +(setq python-mode-teststring "class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\" + + def __init__(self, d={}): + self._keys = d.keys() + dict.__init__(self, d) + + def f(): + \"\"\" + class for in 'for in while with blah' + \"\"\" + if a: + + ar_atpt_python_list_roh = ([ + 'python-expression', + + # def ar_thingatpt_write_lists (&optional datei): + 'python-partial-expression', + 'python-statement', + ]) + elif b: + pass + else b: + pass + +''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf +''' +") + +(defun py-beginning-of-block-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-beginning-of-block-test-base arg teststring))) + +(defun py-beginning-of-block-test-base () + (goto-char 627) + (py-beginning-of-block) + (assert (eq (point) 325) nil "py-beginning-of-block-test failed")) + +(defun py-end-of-block-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\" + + def __init__(self, d={}): + self._keys = d.keys() + dict.__init__(self, d) + + def f(): + \"\"\" + class for in 'for in while with blah' + \"\"\" + if foo: + + ar_atpt_python_list_roh = ([ + 'python-expression', + + # def ar_thingatpt_write_lists (&optional datei): + 'python-partial-expression', + 'python-statement', + ]) + + elif bar: + pass + else: + pass + ")) + (py-bug-tests-intern 'py-end-of-block-base arg teststring))) + +(defun py-end-of-block-base () + (goto-char 326) + (assert (eq 562 (py-end-of-clause)) nil "py-end-of-block-test #1 failed") + (assert (eq 598 (py-end-of-clause)) nil "py-end-of-block-test #2 failed") + (assert (eq 629 (py-end-of-block)) nil "py-end-of-block-test #3 failed")) + +(defun py-beginning-of-block-or-clause-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-beginning-of-block-or-clause-base arg teststring))) + +(defun py-beginning-of-block-or-clause-base () + (goto-char 627) + (py-beginning-of-block-or-clause) + (assert (looking-at "else") nil "py-beginning-of-block-or-clause-test failed") + (py-beginning-of-block-or-clause) + (assert (looking-at "elif") nil "py-beginning-of-block-or-clause-test failed") + (py-beginning-of-block-or-clause) + (assert (looking-at "if") nil "py-beginning-of-block-or-clause-test failed") + + ) + +(defun py-end-of-block-or-clause-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-end-of-block-or-clause-base arg teststring))) + +(defun py-end-of-block-or-clause-base () + (goto-char 602) + (py-end-of-block-or-clause) + (assert (eq (point) 626) nil "py-end-of-block-or-clause-test failed")) + +(defun py-beginning-of-def-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-beginning-of-def-base arg teststring))) + +(defun py-beginning-of-def-base () + (goto-char 627) + (py-beginning-of-def) + (assert (eq (point) 238) nil "py-beginning-of-def-test failed") + ) + +(defun py-end-of-def-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-end-of-def-base arg teststring))) + +(defun py-end-of-def-base () + (goto-char 627) + (py-beginning-of-def) + (py-end-of-def) + (assert (eq (point) 626) nil "py-end-of-def-test failed") + ) + +(defun py-beginning-of-def-or-class-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-beginning-of-def-or-class-base arg teststring))) + +(defun py-beginning-of-def-or-class-base () + (goto-char 627) + (py-beginning-of-def-or-class 4) + (assert (eq (point) 238) nil "py-beginning-of-def-or-class-test failed")) + +(defun py-end-of-def-or-class-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-end-of-def-or-class-base arg teststring))) + +(defun py-end-of-def-or-class-base () + (goto-char 627) + (assert (eq 238 (py-beginning-of-def-or-class)) nil "py-end-of-def-or-class-test #1 failed") + (assert (eq 146 (py-beginning-of-def-or-class)) nil "py-end-of-def-or-class-test #2 failed") + (goto-char 201) + (assert (eq 232 (py-end-of-def-or-class)) nil "py-end-of-def-or-class-test #3 failed") + (assert (eq 626 (py-end-of-def-or-class '(4))) nil "py-end-of-def-or-class-test #4 failed")) + +(defun py-electric-backspace-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-electric-backspace-base arg teststring))) + +(defun py-electric-backspace-base () + (goto-char 232) + (py-newline-and-indent) + (sit-for 0.1) + (assert (eq 241 (point)) nil "py-electric-backspace-test #1 failed") + (py-electric-backspace) + (assert (eq 4 (current-column)) nil "py-electric-backspace-test #2 failed") + (py-electric-backspace) + (assert (eq 0 (current-column)) nil "py-electric-backspace-test #3 failed") + (py-electric-backspace) + (assert (eq 232 (point)) nil "py-electric-backspace-test #4 failed")) + +(defun py-electric-delete-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-electric-delete-base arg teststring))) + +(defun py-electric-delete-base () + (goto-char 202) + (py-electric-delete) + (assert (eq 4 (length (progn (looking-at "[ \t]+")(match-string-no-properties 0)))) nil "py-electric-delete-test #1 failed") + (py-electric-delete) + (assert (not (looking-at "[ \t]+")) nil "py-electric-delete-test #2 failed") + (py-electric-delete) + (assert (looking-at "ict") nil "py-electric-delete-test #2 failed") + ) + +(defun UnicodeEncodeError-python3-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat "#! /usr/bin/env python3 +# -\*- coding: utf-8 -\*-\n +print(\'\\xA9\') +"))) + (py-bug-tests-intern 'UnicodeEncodeError-python3-base 2 teststring))) + +(defun UnicodeEncodeError-python3-base () + (delete-other-windows) + (let ((py-split-windows-on-execute-p t) + (py-shell-switch-buffers-on-execute-p t) + erg pos) + (py-execute-region 50 63) + (setq erg (goto-char (point-max))) + (sit-for 1.0) + (assert (and (setq pos (search-backward "©"))(< (- erg pos) 9)) nil "UnicodeEncodeError-python3-test failed"))) + +(defun dict-error-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " + # -*- coding: utf-8 -*- + +class foo(bar): + \"\"\"baz\"\"\" + _some_extensions = { + + '38': 'asd', # whatever + '43': 'ddd', + '45': 'ddd', + } +"))) + (py-bug-tests-intern 'dict-error-base arg teststring))) + +(defun dict-error-base () + (goto-char 78) + (assert (eq 166 (py-end-of-statement)) nil "dict-error-test failed")) + +(defun py-expand-abbrev-pst-pdb.set_trace-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +print('\xA9') +pst +"))) + (py-bug-tests-intern 'py-expand-abbrev-pst-pdb.set_trace-base arg teststring))) + +(defun py-expand-abbrev-pst-pdb.set_trace-base () + (forward-char -1) + (expand-abbrev) + (sit-for 1) + ;; (assert (string= (expand-abbrev) "pst") nil "py-expand-abbrev-pst-pdb.set_trace-test failed")) + ;; (assert (expand-abbrev) nil "py-expand-abbrev-pst-pdb.set_trace-test failed")) + (progn (looking-back "pdb.set_trace()") + ;; (message "Looking back: %s" (match-string-no-properties 0)) + ) + (assert (looking-back "pdb.set_trace()") + ;; (message "%s" (match-string-no-properties 1)) + nil "py-expand-abbrev-pst-pdb.set_trace-test failed")) + +(defun near-bob-beginning-of-statement-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " + # -*- coding: utf-8 -*- + +print u'\xA9' +"))) + (py-bug-tests-intern 'near-bob-beginning-of-statement-base arg teststring))) + +(defun near-bob-beginning-of-statement-base () + (goto-char 50) + (assert (eq 0 (py-compute-indentation)) nil "near-bob-beginning-of-statement-test failed")) + +(defun bob-beginning-of-statement-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring " #Foo.py +")) + (py-bug-tests-intern 'bob-beginning-of-statement-base arg teststring))) + +(defun bob-beginning-of-statement-base () + (py-beginning-of-statement) + (assert (eq 1 (point)) "bob-beginning-of-statement-test failed")) + +(defun honor-comments-indent-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring " #Something.py + # The purpose of this program is uncertain. +")) + (py-bug-tests-intern 'honor-comments-indent-base arg teststring))) + +(defun honor-comments-indent-base () + (goto-char 19) + (assert (eq 4 (py-compute-indentation)) nil "honor-comments-indent-test failed")) + +(defun first-line-offset-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring " #Something.py + # The purpose of this program is uncertain. +")) + (py-bug-tests-intern 'first-line-offset-base arg teststring))) + +(defun first-line-offset-base () + (goto-char 18) + (assert (eq 4 (py-compute-indentation)) nil "first-line-offset-test failed")) + +(defun assignment-indent-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo(): +sammlung = [] +")) + (py-bug-tests-intern 'assignment-indent-base arg teststring))) + +(defun assignment-indent-base () + (goto-char 12) + (assert (eq 4 (py-compute-indentation)) nil "assignment-indent-test failed")) + +(defun if-elif-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if bar in baz: + print \"0, baz\" + abc[1] = \"x\" + +elif barr in bazz: + print \"\" +")) + (py-bug-tests-intern 'if-elif-base arg teststring))) + +(defun if-elif-base () + (goto-char 76) + (assert (eq 4 (py-compute-indentation)) nil "if-elif.py-test failed")) + +(defun if-elif-bob-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if bar in baz: + print \"0, baz\" +")) + (py-bug-tests-intern 'if-elif-bob-base arg teststring))) + +(defun if-elif-bob-base () + (goto-char (point-min)) + (assert (eq 0 (py-compute-indentation)) nil "if-elif-bob.py-test failed")) + +(defun try-else-clause-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring " +# an example from http://www.thomas-guettler.de +# © 2002-2008 Thomas Güttler. Der Text darf nach belieben kopiert und modifiziert werden, solange dieser Hinweis zum Copyright und ein Links zu dem Original unter www.thomas-guettler.de erhalten bleibt. Es wäre nett, wenn Sie mir Verbesserungsvorschläge mitteilen: guettli@thomas-guettler.de + +def _commit_on_success(*args, **kw): + begin() + try: + res = func(*args, **kw) + except Exception, e: + rollback() + raise # Re-raise (aufgefangene Exception erneut werfen) + else: + commit() + return res +")) + (py-bug-tests-intern 'try-else-clause-base arg teststring))) + +(defun try-else-clause-base () + (goto-char 541) + (assert (eq 4 (py-compute-indentation)) nil "try-else-clause-test failed")) + +(defun try-except-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring " +# an example from http://www.thomas-guettler.de +# © 2002-2008 Thomas Güttler. Der Text darf nach belieben kopiert und modifiziert werden, solange dieser Hinweis zum Copyright und ein Links zu dem Original unter www.thomas-guettler.de erhalten bleibt. Es wäre nett, wenn Sie mir Verbesserungsvorschläge mitteilen: guettli@thomas-guettler.de + +def _commit_on_success(*args, **kw): + begin() + try: + res = func(*args, **kw) + except Exception, e: + rollback() + raise # Re-raise (aufgefangene Exception erneut werfen) + else: + commit() + return res +")) + (py-bug-tests-intern 'try-except-base arg teststring))) + +(defun try-except-base () + (goto-char 434) + (assert (eq 4 (py-compute-indentation)) nil "try-except-test failed")) + +(defun assignment-after-block-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring " +if x > 0: + for i in range(100): + print i + else: + print \"All done\" + +a = \"asdf\" +b = \"asdf\" +")) + (py-bug-tests-intern 'assignment-after-block-base arg teststring))) + +(defun assignment-after-block-base () + (forward-line -1) + (assert (eq 0 (py-compute-indentation)) nil "assignment-after-block-test failed")) + +(defun py-beginning-of-clause-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "# Examples from http://diveintopython.org/ + +def main(argv): + grammar = \"kant.xml\" + try: + opts, args = getopt.getopt(argv, \"hg:d\", [\"help\", \"grammar=\"]) + except getopt.GetoptError: + usage() + sys.exit(2) + for opt, arg in opts: + if opt in (\"-h\", \"--help\"): + usage() + sys.exit() + elif opt == '-d': + global _debug + _debug = 1 + elif opt in (\"-g\", \"--grammar\"): + grammar = arg +")) + (py-bug-tests-intern 'py-beginning-of-clause-base arg teststring))) + +(defun py-beginning-of-clause-base () + (goto-char 364) + (assert (eq 346 (py-beginning-of-clause)) "py-beginning-of-clause-test failed")) + +(defun py-end-of-clause-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "# Examples from http://diveintopython.org/ + +def main(argv): + grammar = \"kant.xml\" + try: + opts, args = getopt.getopt(argv, \"hg:d\", [\"help\", \"grammar=\"]) + except getopt.GetoptError: + usage() + sys.exit(2) + for opt, arg in opts: + if opt in (\"-h\", \"--help\"): + usage() + sys.exit() + elif opt == '-d': + global _debug + _debug = 1 + elif opt in (\"-g\", \"--grammar\"): + grammar = arg +")) + (py-bug-tests-intern 'py-end-of-clause-base arg teststring))) + +(defun py-end-of-clause-base () + (goto-char 364) + (assert (eq 412 (py-end-of-clause)) "py-end-of-clause-test failed")) + +(defun py-beginning-of-expression-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "# Examples from http://diveintopython.org/ + +def main(argv): + grammar = \"kant.xml\" + try: + opts, args = getopt.getopt(argv, \"hg:d\", [\"help\", \"grammar=\"]) + except getopt.GetoptError: + usage() + sys.exit(2) +")) + (py-bug-tests-intern 'py-beginning-of-expression-base arg teststring))) + +(defun py-beginning-of-expression-base () + (goto-char 227) + (assert (eq 221 (py-beginning-of-expression)) nil "py-beginning-of-expression-test #1 failed") + (assert (eq 205 (py-beginning-of-expression)) nil "py-beginning-of-expression-test #2 failed") + (assert (eq 177 (py-beginning-of-expression)) nil "py-beginning-of-expression-test #3 failed")) + +(defun py-end-of-expression-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "# Examples from http://diveintopython.org/ + +def main(argv): + grammar = \"kant.xml\" + try: + opts, args = getopt.getopt(argv, \"hg:d\", [\"help\", \"grammar=\"]) + except getopt.GetoptError: + usage() + sys.exit(2) +")) + (py-bug-tests-intern 'py-end-of-expression-base arg teststring))) + +(defun py-end-of-expression-base () + (goto-char 49) + (assert (eq 60 (py-end-of-expression)) nil "py-end-of-expression-test failed") + (goto-char 69) + (assert (eq 72 (py-end-of-expression)) nil "py-end-of-expression-test failed") + (assert (eq 85 (py-end-of-expression)) nil "py-end-of-expression-test failed") + (assert (eq 94 (py-end-of-expression)) nil "py-end-of-expression-test failed") + (assert (eq 113 (py-end-of-expression)) nil "py-end-of-expression-test failed") + (goto-char 225) + (assert (eq 232 (py-end-of-expression)) nil "py-end-of-expression-test failed")) + +(defun py-expression-index-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " + # -\*- coding: utf-8 -\*- +b = a[0].split(':')[1] +"))) + (py-bug-tests-intern 'py-expression-index-base arg teststring))) + +(defun py-expression-index-base () + (goto-char 58) + (assert (eq 71 (py-end-of-expression)) nil "py-expression-index-test failed") +) + +(defun py-insert-super-python2-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -\*- coding: utf-8 -\*- +# 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)\" + +class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\" + + def __init__(self, d={}): + self._keys = d.keys() + dict.__init__(self, d) + "))) + (py-bug-tests-intern 'py-insert-super-python2-base arg teststring))) + +(defun py-insert-super-python2-base () + (ignore-errors (py-insert-super)) + (sit-for 0.1) + (assert (looking-back "super(OrderedDict1, self).__init__(d={})") nil "py-insert-super-python2-test failed")) + +(defun py-insert-super-python3-test (&optional arg load-branch-function) + (interactive "p") + (let* ((py-test-shebang "#! /usr/bin/env python3") + (teststring (concat py-test-shebang " +# -\*- coding: utf-8 -\*- +# 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)\" + +class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\" + + def __init__(self, d={}): + self._keys = d.keys() + dict.__init__(self, d) + "))) + (py-bug-tests-intern 'py-insert-super-python3-base arg teststring))) + +(defun py-insert-super-python3-base () + (save-excursion + (py-insert-super)) + (sit-for 0.2) + (assert (looking-at "super().__init__(d={})") nil "py-insert-super-python3-test failed")) + +(defun py-indent-after-assigment-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +##################################### +def foo( self, bar=False ): # version 12345 + title = self.barz.attrs['file'].split('.')[ -1 ] + if asdf: +"))) + (py-bug-tests-intern 'indent-after-assigment-base arg teststring))) + +(defun indent-after-assigment-base () + (goto-char 185) + (assert (eq 4 (py-compute-indentation)) nil "py-indent-after-assigment-test failed")) + +(defun leave-dict-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring " +foo = { + b\"yyyyt\": \"bxxk\", + \"bxxk\": { \"yyer\": [\"wxrddef\", \"yytem\", \"hym\",], + \"wfter\": [], \"xbject\": BxxkTwg, }, + \"yytem\": { \"yyer\": [], \"wfter\": [\"yytem\"], \"xbject\": ItemTwg, }, + \"hym\": { \"yyer\": [], \"wfter\": [\"hym\"], \"xbject\": ItemTwg, }, + \"yyfx\": { \"yyer\": [], \"wfter\": [\"yytem\", \"hym\"], \"xbject\": IfxTwg, }, + \"wxrddef\": { \"yyer\": [], \"wfter\": [\"yyfx\", \"yytem\", \"hym\"], \"xbject\": WxrddefTwg, }, +} +")) + (py-bug-tests-intern 'leave-dict-base arg teststring))) + +(defun leave-dict-base () + (goto-char (point-min)) + (py-end-of-statement) + (assert (eq 431 (point)) nil "leave-dict-test failed")) + +(defun eofs-attribut-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "def foo( baz ): # version + return baz.replace(\"\+\",\"§\").replace(\"_\", \" \").replace(\"fi\",\"fr\").replace( + \"fl\", \"fg\").replace(\"--\", \"ü\") +")) + (py-bug-tests-intern 'eofs-attribut-base arg teststring))) + +(defun eofs-attribut-base () + (forward-line -2) + (assert (eq 142 (py-end-of-statement)) nil "eofs-attribut-test failed")) + +(defun args-list-first-line-indent-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if foo: + bar.append( + ht( + T.a('Sorted Foo', href='#Blub', ), + ' -- foo bar baz--', + self.Tasdf( afsd ), + self.Tasdf( asdf ), + ) + ) +"))) + (py-bug-tests-intern 'args-list-first-line-indent-base arg teststring))) + +(defun args-list-first-line-indent-base () + (goto-char 72) + (assert (eq 4 (py-compute-indentation)) nil "args-list-first-line-indent-test failed")) + +(defun py-partial-expression-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if foo: + bar.append( + ht( + T.a('Sorted Foo', href='#Blub', ), + ' -- foo bar baz--', + self.Tasdf( afsd ), + self.Tasdf( asdf ), + ) + ) +"))) + (py-bug-tests-intern 'py-partial-expression-base arg teststring))) + +(defun py-partial-expression-base () + (goto-char 104) + (assert (eq 102 (py-beginning-of-partial-expression)) nil "py-partial-expression-test #1 failed") + (assert (eq 108 (py-end-of-partial-expression)) nil "py-partial-expression-test #2 failed") + (goto-char 178) + (assert (eq 177 (py-beginning-of-partial-expression)) nil "py-partial-expression-test #3 failed") + (assert (eq 195 (py-end-of-partial-expression)) nil "py-partial-expression-test #3 failed") + ) + +(defun py-execute-block-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "if True: + print \"asdf\"")) + (py-bug-tests-intern 'py-execute-block-base 2 teststring))) + +(defun py-execute-block-base () + (beginning-of-line) + (let ((py-shell-switch-buffers-on-execute-p nil) + (py-cleanup-temporary nil)) + (assert (py-execute-block) nil "py-execute-block-test failed"))) + +(defun multiline-list-indent-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "print [1, 2, + 3, 4]")) + (py-bug-tests-intern 'multiline-list-indent-base arg teststring))) + +(defun multiline-list-indent-base () + (assert (eq 7 (py-compute-indentation)) nil "multiline-list-indent-test failed")) + +(defun no-switch-no-split-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +print u'\\xA9' +"))) + (py-bug-tests-intern 'no-switch-no-split-base arg teststring))) + +(defun no-switch-no-split-base () + (let ((oldbuf (current-buffer)) + py-split-windows-on-execute py-shell-switch-buffers-on-execute-p) + (goto-char 49) + (push-mark) + (end-of-line) + (py-execute-region (line-beginning-position) (point)) + (assert (window-full-height-p) "no-switch-no-split-test failed") + (assert (eq (current-buffer) oldbuf)))) + +(defun close-block-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def main(): + if len(sys.argv)==1: + usage() + sys.exit() +if __name__==\"__main__\": + main() +"))) + (py-bug-tests-intern 'close-block-base arg teststring))) + +(defun close-block-base () + (goto-char 102) + (assert (eq 4 (py-close-block)) nil "close-block-test failed")) + +(defun py-shift-block-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +class OrderedDict1(dict): + \"\"\" + This implementation of a dictionary keeps track of the order + in which keys were inserted. + \"\"\" + + def __init__(self, d={}): + self._keys = d.keys() + dict.__init__(self, d) + "))) + (py-bug-tests-intern 'py-shift-block-base arg teststring))) + +(defun py-shift-block-base () + (let (py-smart-indentation) + (goto-char 237) + (assert (eq 12 (py-shift-block-right)) nil "py-shift-block-test #1 failed") + (assert (eq 8 (py-shift-block-left)) nil "py-shift-block-test #1 failed"))) + +(defun nesting-if-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if foo: + if bar: + pass + else: + pass +else: + pass + +"))) + (py-bug-tests-intern 'nesting-if-test-base arg teststring))) + +(defun nesting-if-test-base () + (goto-char 105) + (assert (eq 0 (py-compute-indentation)) nil "nesting-if-test failed")) + +(defun py-end-of-print-statement-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def usage(): + print \"\"\"Error: %s +somme errors +\"\"\" % ( + os.path.basename(sys.argv[0])) + +def usage(): + print '''Error: %s +somme errors +''' % ( + os.path.basename(sys.argv[0])) + +"))) + (py-bug-tests-intern 'py-end-of-print-statement-base arg teststring))) + +(defun py-end-of-print-statement-base () + (goto-char 66) + (sit-for 0.1) + (assert (eq 146 (py-end-of-statement)) nil "py-end-of-print-statement-test #1 failed") + + (assert (eq 160 (py-end-of-statement)) nil "py-end-of-print-statement-test #2 failed") + + (assert (eq 245 (py-end-of-statement)) nil "py-end-of-print-statement-test #3 failed") + + ) + +(defun nested-try-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +def main(argv): + grammar = \"foo.xml\" + try: + opts, args = getopt.getopt(argv, \"hg:d\", [\"help\", \"grammar=\"]) + except getopt.GetoptError: + usage() + try: + bla + except getopt.GetoptError: + asdf() + finally: + return \"blub\" + finally: + print \"asdf\" + +"))) + (py-bug-tests-intern 'nested-try-base arg teststring))) + +(defun nested-try-base () + (goto-char 306) + (assert (eq 8 (py-compute-indentation)) nil "nested-try-test failed")) + +(defun nested-if-test-1 (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +if abr: + if x > 0: + if foo: + print \"foo\" + elif bar: + print \"abasdf\" + elif baz: + for i in range(100): + print i + else: + print \\\"All done\\\" + elif x < 0: + print \\\"x is negative\\\" +else: + print \"asbd\" + +"))) + (py-bug-tests-intern 'nested-if-base-1 arg teststring))) + +(defun nested-if-base-1 () + (goto-char 299) + (assert (eq 8 (py-compute-indentation)) nil "nested-if-test-1 failed")) + +(defun nested-try-finally-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- + +# Example from: +# To: python-ideas@python.org +# From: Nikolaus Rath +# Date: Tue, 18 Oct 2011 22:14:56 -0400 +# Message-ID: <87pqhtafrz.fsf@vostro.rath.org> + +def my_fun(): + allocate_res1() + try: + # do stuff + allocate_res2() + try: + # do stuff + allocate_res3() + try: + do stuff + finally: + cleanup_res3() + finally: + cleanup_res2() + finally: + cleanup_res1() + + return + +"))) + (py-bug-tests-intern 'nested-try-finally-base arg teststring))) + +(defun nested-try-finally-base () + (goto-char 431) + (assert (eq 12 (py-compute-indentation)) nil "nested-try-finally-test failed")) + +(defun tqs-list-error-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +class foo(bar, baz): + \"\"\" + foo is an ABC for matrix containers; i.e., + \\\"\\\"\\\"containers of a finite number of orig +\"\"\" + pass +"))) + (py-bug-tests-intern 'tqs-list-error-base 2 teststring))) + +(defun tqs-list-error-base () + (goto-char 90) + (assert (eq 175 (py-end-of-statement)) nil "tqs-list-error-test failed")) + +(defun py-smart-indent-eight-test (&optional arg load-branch-function) + (interactive "p") + (let ((py-smart-indentation t) + (teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +for x in y: + for z in l: + for r in t: + pass + # <--- indents here. Pressing dedents eight spaces (i.e. you can go to column 0 in two presess) +"))) + (py-bug-tests-intern 'py-smart-indent-eight-base arg teststring))) + +(defun py-smart-indent-eight-base () + (goto-char 104) + (assert (eq 4 (py-guess-indent-offset)) nil "py-smart-indent-eight-test #1 failed") + (assert (eq 12 (py-compute-indentation)) nil "py-smart-indent-eight-test #2 failed") +) + +(defun py-install-directory-path-test (&optional arg) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +"))) + (py-bug-tests-intern 'py-install-directory-path-base arg teststring))) + +(defun py-install-directory-path-base () + "See if `py-install-directory' is set when required. " + (assert (py-install-directory-check) nil "`py-install-directory' not valid. See INSTALL. ")) + +;;; +(defun switch-windows-on-execute-p-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +print(\"I'm the switch-windows-on-execute-p-test\") +"))) + (py-bug-tests-intern 'switch-windows-on-execute-p-base arg teststring))) + +(defun switch-windows-on-execute-p-base () + (let ((py-shell-switch-buffers-on-execute-p t) + (erg (buffer-name))) + (assert (py-execute-buffer) nil "switch-windows-on-execute-p-test failed"))) + +(defun split-windows-on-execute-p-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +print(\"I'm the `split-windows-on-execute-p-test'\") +"))) + (py-bug-tests-intern 'split-windows-on-execute-p-base arg teststring))) + +(defun split-windows-on-execute-p-base () + (delete-other-windows) + (let ((py-split-windows-on-execute-p t) + (py-split-windows-on-execute-function 'split-window-vertically) + (py-shell-switch-buffers-on-execute-p t) + (erg (current-window-configuration))) + (py-execute-buffer) + (assert (not (window-full-height-p)) nil "split-windows-on-execute-p-test failed"))) + +;; this test is not valable, as python-mode-map often changes +(defun py-menu-pyshell-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +print(\"I'm the `py-menu-pyshell-test'\") +"))) + (py-bug-tests-intern 'py-menu-pyshell-base arg teststring))) + +(defun py-menu-pyshell-base () + (assert (string= "PyShell" (prin1-to-string + (car (nth 1 (cdr (nth 17 python-mode-map)))) + ;; (car (nth 2 (nth 1 (cdr python-mode-map)))) + )) nil "py-menu-pyshell-test failed")) + +(defun python-dedicated-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'python-dedicated-base arg teststring))) + +(defun python-dedicated-base () + (set-buffer (python-dedicated)) + (sit-for 0.1) + (assert (string-match "^\*Python-[:alnum:]+*" (buffer-name)) nil "python-dedicated-test failed")) + +(defun py-separator-char-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'py-separator-char-base arg teststring))) + +(defun py-separator-char-base () + (assert (stringp (py-separator-char)) nil "py-separator-char-test failed")) + +(defun py-shell-complete-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring (concat py-test-shebang " +# -*- coding: utf-8 -*- +impo"))) + (py-bug-tests-intern 'py-shell-complete-base 2 teststring))) + +(defun py-shell-complete-base () + (py-shell-complete) + (sit-for 0.1) + (assert (looking-back "import") nil "py-shell-complete-test failed")) + +(defun toggle-force-py-shell-name-p-test (&optional arg) + (interactive "p") + (let ((teststring "")) + (py-bug-tests-intern 'toggle-force-py-shell-name-p-base arg teststring))) + +(defun toggle-force-py-shell-name-p-base () + (let ((old py-force-py-shell-name-p)) + (assert (not (eq old (toggle-force-py-shell-name-p))) nil "toggle-force-py-shell-name-p-test failed") + (setq py-force-py-shell-name-p old))) + +(defun before-inline-comment-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +self._blah_blup = 0xe000 # aka: foo bar baz +self.nult = {} +self.nult['_foobar'] = [] +")) + (py-bug-tests-intern 'before-inline-comment-base arg teststring))) + +(defun before-inline-comment-base () + (goto-char 72) + (py-end-of-statement) + (sit-for 0.1) + (assert (eq 106 (point)) nil "before-inline-comment-test failed")) + +(defun py-end-of-def-inline-comment-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + + ##################################### +##################################### +def fooBaz( bar ): # version 2003/9/7 + if \"Foo:\" == bar \\ + or \"[Foo:]\" == bar \\ + or \"Foo:]\" == bar \\ + or \"Baz:\" == bar: + return False + return True +")) + (py-bug-tests-intern 'py-end-of-def-inline-comment-base arg teststring))) + +(defun py-end-of-def-inline-comment-base () + (let ((py-smart-indentation t)) + (goto-char 49) + (py-end-of-def-or-class) + (assert (eq 311 (point)) nil "py-end-of-def-inline-comment-test failed"))) + +(defun py-compute-indentation-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -\*- coding: utf-8 -\*- +with file(\"foo\" + zeit + \".ending\", 'w') as datei: + for i in range(anzahl): + bar.dosomething() + datei.write(str(baz[i]) + \"\\n\") + +def foo() +")) + (py-bug-tests-intern 'py-compute-indentation-base arg teststring))) + +(defun py-compute-indentation-base () + (goto-char 99) + (assert (eq 4 (py-compute-indentation)) nil "py-compute-indentation-test #1 failed") + (goto-char 127) + (assert (eq 8 (py-compute-indentation)) nil "py-compute-indentation-test #2 failed")) + +(defun py-end-of-statement-test-1 (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/python +# -*- coding: utf-8 -*- +print dir() +c = Cat() +c.hello() #causes error, but emacs tracking fails +import sys, os; os.remove('do/something/nasty') # lp:1025000 +")) + (py-bug-tests-intern 'py-end-of-statement-1-base arg teststring))) + +(defun py-end-of-statement-1-base () + (goto-char (point-min)) + (assert (eq 55 (py-end-of-statement)) nil "py-end-of-statement-test-1 #1 failed") + (assert (eq 65 (py-end-of-statement)) nil "py-end-of-statement-test-1 #2 failed") + (assert (eq 75 (py-end-of-statement)) nil "py-end-of-statement-test-1 #2 failed") + (assert (eq 131 (py-end-of-statement)) nil "py-end-of-statement-test-1 #3 failed") + (py-end-of-statement) + (assert (eq 163 (point)) nil "py-end-of-statement-test-1 #4 failed")) + +(defun py-end-of-statement-test-2 (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/python +# -*- coding: utf-8 -*- +pdb.set_trace() +# r'\\fB\$\{\\f([BI])([^}]+)\\f\1([^\\]+)\\fB}(.+)$') +result = w_behandlung(aus, i, line, klammer1=w.group(1), klammer2=w.group(2), klammer3=w.group(3), klammer4=w.group(4)) +aus.write(result + \"\\n\") +")) + (py-bug-tests-intern 'py-end-of-statement-2-base arg teststring))) + +(defun py-end-of-statement-2-base () + (goto-char 59) + (py-end-of-statement) + (assert (eq 225 (point)) nil "py-end-of-statement-test-2 #1 failed")) + +(defun key-binding-tests (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +")) + (py-bug-tests-intern 'key-binding-base arg teststring))) + +(defun key-binding-base () + (assert (eq (key-binding [(:)]) 'py-electric-colon) nil "py-electric-colon key-binding test failed") + + (assert (eq (key-binding [(\#)]) 'py-electric-comment) nil "py-electric-comment key-binding test failed") + (assert (eq (key-binding [(delete)]) 'py-electric-delete) nil "py-electric-delete key-binding test failed") + (assert (eq (key-binding [(backspace)]) 'py-electric-backspace) nil "py-electric-backspace key-binding test failed") + (assert (eq (key-binding [(control backspace)]) 'py-hungry-delete-backwards) nil "py-hungry-delete-backwards key-binding test failed") + (assert (eq (key-binding [(control c) (delete)]) 'py-hungry-delete-forward) nil "py-hungry-delete-forward key-binding test failed") + (assert (eq (key-binding [(control meta a)]) 'py-beginning-of-def-or-class) nil "py-beginning-of-def-or-class key-binding test failed") + (assert (eq (key-binding [(control meta e)]) 'py-end-of-def-or-class) nil "py-end-of-def-or-class key-binding test failed") + (assert (eq (key-binding [(control c)(control l)]) 'py-shift-left) nil "py-shift-left key-binding test failed") + (assert (eq (key-binding [(control c)(control r)]) 'py-shift-right) nil "py-shift-right key-binding test failed") + (assert (eq (key-binding [(control c)(<)]) 'py-shift-left) nil "py-shift-left key-binding test failed") + (assert (eq (key-binding [(control c)(>)]) 'py-shift-right) nil "py-shift-right key-binding test failed") + (assert (eq (key-binding [(control c)(tab)]) 'py-indent-region) nil "py-indent-region key-binding test failed") + (assert (eq (key-binding [(control c)(:)]) 'py-guess-indent-offset) nil "py-guess-indent-offset key-binding test failed") + + (assert (eq (key-binding [(control c)(control c)]) 'py-execute-buffer) nil "py-execute-buffer key-binding test failed") + (assert (eq (key-binding [(control c)(control m)]) 'py-execute-import-or-reload) nil "py-execute-import-or-reload key-binding test failed") + (assert (eq (key-binding [(control c)(control s)]) 'py-execute-string) nil "py-execute-string key-binding test failed") + (assert (eq (key-binding [(control c)(|)]) 'py-execute-region) nil "py-execute-region key-binding test failed") + (assert (eq (key-binding [(control meta x)]) 'py-execute-def-or-class) nil "py-execute-def-or-class key-binding test failed") + (assert (eq (key-binding [(control c)(!)]) 'py-shell) nil "py-shell key-binding test failed") + (assert (eq (key-binding [(control c)(control t)]) 'py-toggle-shell) nil "py-toggle-shell key-binding test failed") + (assert (eq (key-binding [(control meta h)]) 'py-mark-def-or-class) nil "py-mark-def-or-class key-binding test failed") + (assert (eq (key-binding [(control c)(control k)]) 'py-mark-block-or-clause) nil "py-mark-block-or-clause key-binding test failed") + + (assert (eq (key-binding [(control c)(\.)]) 'py-expression) nil "py-expression key-binding test failed") + + (assert (eq (key-binding [(control c)(control d)]) 'py-pdbtrack-toggle-stack-tracking) nil "py-pdbtrack-toggle-stack-tracking key-binding test failed") + (assert (eq (key-binding [(control c)(control f)]) 'py-sort-imports) nil "py-sort-imports key-binding test failed") + (assert (eq (key-binding [(control c)(\#)]) 'py-comment-region) nil "py-comment-region key-binding test failed") + (assert (eq (key-binding [(control c)(\?)]) 'py-describe-mode) nil "py-describe-mode key-binding test failed") + + (assert (eq (key-binding [(control c)(control e)]) 'py-help-at-point) nil "py-describe-symbol key-binding test failed") + (assert (eq (key-binding [(control c)(-)]) 'py-up-exception) nil "py-up-exception key-binding test failed") + (assert (eq (key-binding [(control c)(=)]) 'py-down-exception) nil "py-down-exception key-binding test failed") + (assert (eq (key-binding [(control x) (n) (d)]) 'py-narrow-to-defun) nil "py-narrow-to-defun key-binding test failed") + (assert (eq (key-binding [(control c)(control b)]) 'py-submit-bug-report) nil "py-submit-bug-report key-binding test failed") + (assert (eq (key-binding [(control c)(control v)]) 'py-version) nil "py-version key-binding test failed") + (assert (eq (key-binding [(control c)(control w)]) 'py-pychecker-run) nil "py-pychecker-run key-binding test failed") + (assert (eq (key-binding (kbd "TAB")) 'py-indent-line) nil "py-indent-line key-binding test failed") + (assert (eq (key-binding [(control c)(control p)]) 'py-beginning-of-statement) nil "py-beginning-of-statement key-binding test failed") + (assert (eq (key-binding [(control c)(control n)]) 'py-end-of-statement) nil "py-end-of-statement key-binding test failed") + (assert (eq (key-binding [(control j)]) 'py-newline-and-indent) nil "py-newline-and-indent key-binding test failed") + (assert (eq (key-binding (kbd "RET")) 'py-newline-and-indent) nil "py-newline-and-indent key-binding test failed")) + +(defun py-smart-operator-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +foo ")) + (py-bug-tests-intern 'py-smart-operator-base arg teststring))) + +(defun py-smart-operator-base () + (python-mode) + (let ((py-smart-operator-mode-p t)) + (py-smart-operator-mode-p-on) + (goto-char 52) + (save-excursion + (smart-operator-<)) + (assert (looking-at " < ") nil "smart-operator-test \"smart-operator-<\" failed") + (delete-region (point) (line-end-position)) + (save-excursion + (smart-operator->)) + (assert (looking-at " > ") nil "smart-operator-test \"smart-operator->\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-%)) + (assert (looking-at " % ") nil "smart-operator-test \"smart-operator-%\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-+)) + (assert (looking-at " \\+ ") nil "smart-operator-test \"smart-operator-+\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator--)) + (assert (looking-at " - ") nil "smart-operator-test \"smart-operator--\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-*)) + (assert (looking-at " * ") nil "smart-operator-test \"smart-operator-*\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-&)) + (assert (looking-at " & ") nil "smart-operator-test \"smart-operator-&\" failed") + ;; (delete-region (point) (line-end-position)) + ;; (save-excursion (smart-operator-!)) + ;; (assert (looking-at "! ") nil "smart-operator-test \"smart-operator-!\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-?)) + (assert (looking-at "? ") nil "smart-operator-test \"smart-operator-?\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-\,)) + (assert (looking-at ", ") nil "smart-operator-test \"smart-operator-\,\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-.)) + (assert (looking-at ".") nil "smart-operator-test \"smart-operator-.\" failed") + (when py-verbose-p (message "%s" "smart-operator-test passed")))) + +;; broken +(defun augmented-assigment-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +foo")) + (py-bug-tests-intern 'augmented-assigment-base arg teststring))) + +(defun augmented-assigment-base () + (let ((py-smart-operator-mode-p t)) + (smart-operator-mode-on) + (goto-char 52) + (save-excursion + (smart-operator-<) + (insert "=")) + + (assert (looking-at " <= ") nil "augmented-assigment-test \"smart-operator-<\" failed") + (delete-region (point) (line-end-position)) + (save-excursion + (smart-operator->)) + (assert (looking-at " >= ") nil "augmented-assigment-test \"smart-operator->\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-%)) + (assert (looking-at " %= ") nil "augmented-assigment-test \"smart-operator-%\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-+)) + (assert (looking-at " \\+= ") nil "augmented-assigment-test \"smart-operator-+\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator--)) + (assert (looking-at " -= ") nil "augmented-assigment-test \"smart-operator--\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-*)) + (assert (looking-at " \\*= ") nil "augmented-assigment-test \"smart-operator-*\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-&)) + (assert (looking-at " &= ") nil "augmented-assigment-test \"smart-operator-&\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-!)) + (assert (looking-at " != ") nil "augmented-assigment-test \"smart-operator-!\" failed") + (delete-region (point) (line-end-position)) + (save-excursion (smart-operator-?)) + (assert (looking-at " \\?= ") nil "augmented-assigment-test \"smart-operator-?\" failed") + ;; (delete-region (point) (line-end-position)) + ;; (save-excursion (smart-operator-\,)) + ;; (assert (looking-at " ,= ") nil "augmented-assigment-test \"smart-operator-\,\" failed") + ;; (delete-region (point) (line-end-position)) + ;; (save-excursion (smart-operator-.)) + ;; (assert (looking-at " .= ") nil "augmented-assigment-test \"smart-operator-.\" failed") + ;; (assert nil "smart-operator-test failed") + (when py-verbose-p (message "%s" "augmented-assigment-test passed")))) + +(defun py-smart-operator-repeat-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +foo ")) + (py-bug-tests-intern 'py-smart-operator-repeat-base arg teststring))) + +(defun py-smart-operator-repeat-base () + (let ((py-smart-operator-mode-p t)) + (py-smart-operator-mode-on) + (goto-char 52) + (setq last-command nil) + (save-excursion + (call-interactively 'smart-operator-> t) + (setq last-command 'smart-operator->) + (setq this-command 'smart-operator->) + ;; (message "%s" this-command-keys-vector) + (call-interactively 'smart-operator->)) + (assert (looking-at " >> ") nil "smart-operator-test \"smart-operator->\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion + (call-interactively 'smart-operator-<) + (setq last-command 'smart-operator-<) + (setq this-command 'smart-operator-<) + (call-interactively 'smart-operator-<)) + (assert (looking-at " << ") nil "smart-operator-test \"smart-operator-<\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-%)(setq this-command 'smart-operator-%)(setq last-command 'smart-operator-%)(smart-operator-%)) + (assert (looking-at " %% ") nil "smart-operator-test \"smart-operator-%\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-+)(setq this-command 'smart-operator-+)(setq last-command 'smart-operator-+)(smart-operator-+)) + (assert (looking-at " \\+\\+ ") nil "smart-operator-test \"smart-operator-+\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator--)(setq this-command 'smart-operator--)(setq last-command 'smart-operator--)(smart-operator--)) + (assert (looking-at " -- ") nil "smart-operator-test \"smart-operator--\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-*)(setq this-command 'smart-operator-*)(setq last-command 'smart-operator-*)(smart-operator-*)) + (assert (looking-at " ** ") nil "smart-operator-test \"smart-operator-*\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-&)(setq this-command 'smart-operator-&)(setq last-command 'smart-operator-&)(smart-operator-&)) + (assert (looking-at " && ") nil "smart-operator-test \"smart-operator-&\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-!)(setq this-command 'smart-operator-!)(setq last-command 'smart-operator-!)(smart-operator-!)) + (assert (looking-at "!! ") nil "smart-operator-test \"smart-operator-!\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-?)(setq this-command 'smart-operator-?)(setq last-command 'smart-operator-?)(smart-operator-?)) + (assert (looking-at "\\?\\? ") nil "smart-operator-test \"smart-operator-?\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-\,)(setq this-command 'smart-operator-\,)(setq last-command 'smart-operator-\,)(smart-operator-\,)) + (assert (looking-at ",, ") nil "smart-operator-test \"smart-operator-\,\" failed") + (delete-region (point) (line-end-position)) + (setq last-command nil) + (save-excursion (smart-operator-.)(setq this-command 'smart-operator-.)(setq last-command 'smart-operator-.)(smart-operator-.)) + (assert (looking-at "..") nil "smart-operator-test \"smart-operator-.\" failed") + (when py-verbose-p (message "%s" "py-smart-operator-test passed")))) + +(defun py-switch-imenu-index-function-test (&optional arg) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-switch-imenu-index-function-base arg teststring))) + +(defun py-switch-imenu-index-function-base () + (assert (listp imenu--index-alist) nil "py-switch-imenu-index-function-test failed") + (assert (py-switch-imenu-index-function) nil "py-switch-imenu-index-function-test failed") + (assert (listp imenu--index-alist) nil "py-switch-imenu-index-function-test failed")) + +(defun py-bol-moves-test (&optional arg load-branch-function) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-bol-moves-base arg teststring))) + +(defun py-bol-moves-base () + (message "comment-start: %s" comment-start) + (goto-char 592) + ;; (sit-for 0.1) + (assert (eq 561 (py-up-clause-bol)) nil "py-up-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-up-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 317 (py-up-block-or-clause-bol)) nil "py-up-block-or-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-up-block-or-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 234 (py-up-def-bol)) nil "py-up-def-bol-test of `py-moves-test' failed") + (message "%s" "py-up-def-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 1 (py-up-class-bol)) nil "py-up-class-bol-test of `py-moves-test' failed") + (message "%s" "py-up-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 234 (py-up-def-or-class-bol)) nil "py-up-def-or-class-bol-test of `py-moves-test' failed") + (message "%s" "py-up-def-or-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 317 (py-up-block-bol)) nil "py-up-block-bol-test of `py-moves-test' failed") + (message "%s" "py-up-block-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 317 (py-up-minor-block-bol)) nil "py-up-minor-block-bol-test of `py-moves-test' failed") + (message "%s" "py-up-minor-block-bol-test of `py-moves-test' done") + (goto-char 592) + ;; (sit-for 0.1) + (assert (eq 325 (py-up-block)) nil "py-up-block-test of `py-moves-test' failed") + (message "%s" "py-up-block-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 325 (py-up-minor-block)) nil "py-up-minor-block-test of `py-moves-test' failed") + (message "%s" "py-up-minor-block-test of `py-moves-test' done") + (goto-char 592) + ;; (sit-for 0.1) + (assert (eq 569 (py-up-clause)) nil "py-up-clause-test of `py-moves-test' failed") + (message "%s" "py-up-clause-test of `py-moves-test' done") + (goto-char 592) + ;; (sit-for 0.1) + (assert (eq 569 (py-up-block-or-clause)) nil "py-up-block-or-clause-test of `py-moves-test' failed") + (message "%s" "py-up-block-or-clause-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 238 (py-up-def)) nil "py-up-def-test of `py-moves-test' failed") + (message "%s" "py-up-def-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 1 (py-up-class)) nil "py-up-class-test of `py-moves-test' failed") + (message "%s" "py-up-class-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 238 (py-up-def-or-class)) nil "py-up-def-or-class-test of `py-moves-test' failed") + (message "%s" "py-up-def-or-class-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 0.1) + (assert (eq 317 (py-down-block-bol)) nil "py-down-block-bol-test of `py-moves-test' failed") + (message "%s" "py-down-block-bol-test of `py-moves-test' done") + (goto-char 561) + ;; (sit-for 0.1) + (assert (eq 594 (py-down-clause-bol)) nil "py-down-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-down-clause-bol-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 0.1) + (assert (eq 317 (py-down-block-or-clause-bol)) nil "py-down-block-or-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-down-block-or-clause-bol-test of `py-moves-test' done") + (goto-char (point-min)) + (assert (eq 142 (py-down-def-bol)) nil "py-down-def-bol-test of `py-moves-test' failed") + (message "%s" "py-down-def-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (not (py-down-class-bol)) nil "py-down-class-bol-test of `py-moves-test' failed") + (message "%s" "py-down-class-bol-test of `py-moves-test' done") + (goto-char (point-min)) + (assert (eq 142 (py-down-def-or-class-bol)) nil "py-down-def-or-class-bol-test of `py-moves-test' failed") + (message "%s" "py-down-def-or-class-bol-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 0.1) + (assert (eq 325 (py-down-block)) nil "py-down-block-test of `py-moves-test' failed") + (message "%s" "py-down-block-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 0.1) + (assert (eq 317 (py-down-block-bol)) nil "py-down-block-bol-test of `py-moves-test' failed") + (message "%s" "py-down-block-bol-test of `py-moves-test' done") + + (goto-char 264) + ;; (sit-for 0.1) + (assert (eq 325 (py-down-minor-block)) nil "py-down-minor-block-test of `py-moves-test' failed") + (message "%s" "py-down-minor-block-test of `py-moves-test' done") + (goto-char 264) + ;; (sit-for 0.1) + (assert (eq 317 (py-down-minor-block-bol)) nil "py-down-minor-block-bol-test of `py-moves-test' failed") + (message "%s" "py-down-minor-block-bol-test of `py-moves-test' done") + + (goto-char 569) + ;; (sit-for 0.1) + (assert (eq 602 (py-down-clause)) nil "py-down-clause-test of `py-moves-test' failed") + (message "%s" "py-down-clause-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 569 (py-down-block-or-clause)) nil "py-down-block-or-clause-test of `py-moves-test' failed") + (message "%s" "py-down-block-or-clause-test of `py-moves-test' done") + (goto-char (point-min)) + (assert (eq 146 (py-down-def)) nil "py-down-def-test of `py-moves-test' failed") + (message "%s" "py-down-def-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (not (py-down-class)) nil "py-down-class-test of `py-moves-test' failed") + (message "%s" "py-down-class-test of `py-moves-test' done") + (goto-char (point-min)) + (assert (eq 146 (py-down-def-or-class)) nil "py-down-def-or-class-test of `py-moves-test' failed") + (message "%s" "py-down-def-or-class-test of `py-moves-test' done") + + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 332 (py-beginning-of-statement-bol)) nil "py-beginning-of-statement-bol-test of `py-moves-test' failed") + (message "%s" "py-beginning-of-statement-bol-test of `py-moves-test' done") + (goto-char 410) + (sit-for 0.1) + (assert (eq 317 (py-beginning-of-block-bol)) nil "py-beginning-of-block-bol-test of `py-moves-test' failed") + (message "%s" "py-beginning-of-block-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 317 (py-beginning-of-clause-bol)) nil "py-beginning-of-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-beginning-of-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 317 (py-beginning-of-block-or-clause-bol)) nil "py-beginning-of-block-or-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-beginning-of-block-or-clause-bol-test of `py-moves-test' done") + (assert (eq 1 (py-beginning-of-class-bol)) nil "py-beginning-of-class-bol-test of `py-moves-test' failed") + (message "%s" "py-beginning-of-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 234 (py-beginning-of-def-or-class-bol)) nil "py-beginning-of-def-or-class-bol-test of `py-moves-test' failed") + (message "%s" "py-beginning-of-def-or-class-bol-test of `py-moves-test' done") + (message "%s" "py-end-of-block-bol-test of `py-moves-test' done") + (goto-char 576) + ;; (sit-for 0.1) + (assert (eq 594 (py-end-of-clause-bol)) nil "py-end-of-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-end-of-clause-bol-test of `py-moves-test' done") + (goto-char 576) + ;; (sit-for 0.1) + (assert (eq 594 (py-end-of-block-or-clause-bol)) nil "py-end-of-block-or-clause-bol-test of `py-moves-test' failed") + (message "%s" "py-end-of-block-or-clause-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 627 (py-end-of-def-bol)) nil "py-end-of-def-bol-test of `py-moves-test' failed") + (message "%s" "py-end-of-def-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 627 (py-end-of-class-bol)) nil "py-end-of-class-bol-test of `py-moves-test' failed") + (message "%s" "py-end-of-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 627 (py-end-of-def-or-class-bol)) nil "py-end-of-def-or-class-bol-test of `py-moves-test' failed") + (message "%s" "py-end-of-def-or-class-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 561 (py-end-of-statement-bol)) nil "py-end-of-statement-bol-test of `py-moves-test' failed") + (message "%s" "py-end-of-statement-bol-test of `py-moves-test' done") + (goto-char 410) + ;; (sit-for 0.1) + (assert (eq 234 (py-beginning-of-def-bol)) nil "py-beginning-of-def-bol-test of `py-moves-test' failed") + (message "%s" "py-beginning-of-def-bol-test of `py-moves-test' done") + ) + +(defun py-guess-indent-offset-test (&optional arg) + (interactive "p") + (let (py-smart-indentation + (teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + + ##################################### +##################################### +def fooBaz( bar ): # version 2003/9/7 + if \"Foo:\" == bar \\ + or \"[Foo:]\" == bar \\ + or \"Foo:]\" == bar \\ + or \"Baz:\" == bar: + return False + return True +")) + (py-bug-tests-intern 'py-guess-indent-offset-base arg teststring))) + +(defun py-guess-indent-offset-base () + (goto-char 49) + (assert (eq 4 (py-guess-indent-offset)) nil "py-guess-indent-offset-test #1 failed") + (message "%s" "py-guess-indent-offset-test #1 done") + (goto-char 168) + (assert (eq 2 (py-guess-indent-offset)) nil "py-guess-indent-offset-test #2 failed") + (message "%s" "py-guess-indent-offset-test #2 done") + (goto-char 251) + (assert (eq 4 (py-guess-indent-offset)) nil "py-guess-indent-offset-test #3 failed") + (message "%s" "py-guess-indent-offset-test #3 done") + (goto-char 280) + (assert (eq 4 (py-guess-indent-offset)) nil "py-guess-indent-offset-test #4 failed") + (message "%s" "py-guess-indent-offset-test #4 done") + (goto-char 298) + ;; indent might be eithe 4 or 2 + (assert (eq 2 (py-guess-indent-offset)) nil "py-guess-indent-offset-test #5 failed") + (message "%s" "py-guess-indent-offset-test #5 done")) + +(defun autopair-mode-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +")) + (py-bug-tests-intern 'autopair-on-base arg teststring))) + +(defun autopair-on-base () + (assert (py-autopair-mode-on) nil "autopair-mode-test #1 failed") + (message "%s" "autopair-mode-test #1 done") + (assert (not (py-toggle-autopair-mode)) nil "autopair-mode-test #2 failed")) + (message "%s" "autopair-mode-test #2 done") + +(defun py-smart-indentation-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +")) + (py-bug-tests-intern 'py-smart-indentation-base arg teststring))) + +(defun py-smart-indentation-base () + (assert (py-smart-indentation-on) nil "smart-indentation-test #1 failed") + (message "%s" "smart-indentation-test #1 done") + (assert (not (py-smart-indentation-off)) nil "smart-indentation-test #2 failed") + (message "%s" "smart-indentation-test #2 done") + (assert (py-toggle-smart-indentation) nil "smart-indentation-test #3 failed")) + (message "%s" "smart-indentation-test #3 done") + +(defun py-highlight-indentation-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +")) + (py-bug-tests-intern 'py-highlight-indentation-base arg teststring))) + +(defun py-highlight-indentation-base () + (py-highlight-indentation-on) + (assert highlight-indent-active nil "highlight-indentation-test #1 failed") + (message "%s" "highlight-indentation-test #1 done") + (py-highlight-indentation-off) + (assert (not highlight-indent-active) nil "highlight-indentation-test #2 failed") + (message "%s" "highlight-indentation-test #2 done") + (py-toggle-highlight-indentation) + (assert highlight-indent-active nil "highlight-indentation-test #3 failed")) + (message "%s" "highlight-indentation-test #3 done") + +(defun py-fill-string-django-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo() + ''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf''' +")) + (py-bug-tests-intern 'py-fill-string-django-base arg teststring))) + +(defun py-fill-string-django-base () + (sit-for 0.1) + (goto-char 99) + (py-fill-string-django) + (beginning-of-line) + (sit-for 0.1) + (assert (nth 8 (syntax-ppss)) t nil "py-fill-string-django-test #1 failed") + (message "%s" "py-fill-string-django-test #1 done") + (goto-char (nth 8 (syntax-ppss))) + (sit-for 1) + (assert (looking-at (concat py-string-delim-re "$")) t nil "py-fill-string-django-test #2 failed") + (message "%s" "$") +) + +(defun py-fill-string-onetwo-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo() + ''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf''' +")) + (py-bug-tests-intern 'py-fill-string-onetwo-base arg teststring))) + +(defun py-fill-string-onetwo-base () + (sit-for 0.1) + (goto-char 99) + (py-fill-string-onetwo) + (forward-line 2) + (assert (empty-line-p) nil "py-fill-string-onetwo-test #1 failed") + (message "%s" "py-fill-string-onetwo-test #1 done") + (goto-char (nth 8 (syntax-ppss))) + (assert (looking-at (concat py-string-delim-re "$")) nil "py-fill-string-onetwo-test #2 failed")) + (message "%s" "$") + +(defun py-fill-string-pep-257-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo() + ''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf''' +")) + (py-bug-tests-intern 'py-fill-string-pep-257-base arg teststring))) + +(defun py-fill-string-pep-257-base () + (sit-for 0.1) + (goto-char 99) + (py-fill-string-pep-257) + (forward-line 1) + (assert (nth 3 (syntax-ppss)) nil "py-fill-string-pep-257-test #1 failed") + (message "%s" "py-fill-string-pep-257-test #1 done") + (assert (empty-line-p) nil "py-fill-string-pep-257-test #2 failed")) + (message "%s" "py-fill-string-pep-257-test #2 done") + +(defun py-fill-string-pep-257-nn-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo() + ''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf''' +")) + (py-bug-tests-intern 'py-fill-string-pep-257-nn-base arg teststring))) + +(defun py-fill-string-pep-257-nn-base () + (sit-for 0.1) + (goto-char 99) + (py-fill-string-pep-257-nn) + (assert (nth 3 (syntax-ppss)) nil "py-fill-string-pep-257-nn-test #1 failed") + (message "%s" "py-fill-string-pep-257-nn-test #1 done") + (re-search-forward "py-string-delim-re" nil t 1) + (assert (not (empty-line-p)) nil "py-fill-string-pep-257-non-nil-test #2 failed")) + (message "%s" "py-fill-string-pep-257-non-nil-test #2 done") + +(defun py-fill-string-symmetric-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def foo(): + ''' asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf + +asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf asdf' asdf asdf asdf asdf asdfasdf asdfasdf a asdf asdf asdf asdfasdfa asdf asdf asdf asdf +''' + pass +")) + (py-bug-tests-intern 'py-fill-string-symmetric-base arg teststring))) + +(defun py-fill-string-symmetric-base () + (goto-char 84) + (py-fill-string-symmetric) + (sit-for 0.1) + (forward-line -4) + (assert (empty-line-p) nil "py-fill-string-symmetric-test failed") + (message "%s" "py-fill-string-symmetric-test done") + (re-search-forward py-string-delim-re nil t 3) + (goto-char (match-beginning 0)) + (assert (looking-at (concat py-string-delim-re "$")) nil "py-fill-string-symmetric-test failed") + (message "%s" "$") +) + +(defun py-electric-yank-test (&optional arg) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-electric-yank-base arg teststring))) + +(defun py-electric-yank-base () + (let ((py-electric-yank-active-p t) + (kill-new "asdf")) + (goto-char 610) + (py-electric-delete) + (assert (eq 8 (current-indentation)) nil "py-electric-yank-test #1 failed, `py-electric-delete' ") + (message "%s" "py-electric-yank-test #1 failed, `py-electric-delete' ") + (end-of-line) + (py-electric-yank) + (assert (eq 12 (current-indentation)) nil "py-electric-yank-test #2 failed"))) + (message "%s" "py-electric-yank-test #2 done") + +(defun py-down-statement-test (&optional arg) + (interactive "p") + (let ((teststring python-mode-teststring)) + (py-bug-tests-intern 'py-down-statement-base arg teststring))) + +(defun py-down-statement-base () + (goto-char (point-min)) + (assert (eq 31 (py-down-statement)) nil "py-down-statement-test failed")) + (message "%s" "py-down-statement-test done") + +(defun py-nested-block-or-clause-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +if foo: + if bar: + if True: + pass + elif False: + pass + else: + pass + elif baz: + pass +elif foo2: + if bar2: + pass + elif baz2: + pass + else: + pass +else: + pass + +")) + (py-bug-tests-intern 'py-nested-block-or-clause-base arg teststring))) + +(defun py-nested-block-or-clause-base () + (goto-char 48) + (assert (eq 299 (py-end-of-block)) nil "py-nested-block-or-clause-test #1 failed") + (message "%s" "py-nested-block-or-clause-test #1 done") + (goto-char 60) + (assert (eq 196 (py-end-of-block)) nil "py-nested-block-or-clause-test #2 failed") + (message "%s" "py-nested-block-or-clause-test #2 done") + (goto-char 76) + (assert (eq 169 (py-end-of-block)) nil "py-nested-block-or-clause-test #3 failed") + (message "%s" "py-nested-block-or-clause-test #3 done") + (goto-char 48) + (assert (eq 196 (py-end-of-clause)) nil "py-nested-block-or-clause-test #4 failed") + (message "%s" "py-nested-block-or-clause-test #4 done") + (goto-char 60) + (assert (eq 169 (py-end-of-clause)) nil "py-nested-block-or-clause-test #5 failed") + (message "%s" "py-nested-block-or-clause-test #5 done") + (goto-char 85) + (assert (eq 101 (py-end-of-clause)) nil "py-nested-block-or-clause-test #6 failed") + (message "%s" "py-nested-block-or-clause-test #6 done") + (goto-char 291) + (assert (eq 285 (py-beginning-of-clause)) nil "py-nested-block-or-clause-test #7 failed") + (message "%s" "py-nested-block-or-clause-test #7 done") + (sit-for 0.1) + (assert (eq 197 (py-beginning-of-clause)) nil "py-nested-block-or-clause-test #8 failed") + (message "%s" "py-nested-block-or-clause-test #8 done") + (assert (eq 48 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #9 failed") + (message "%s" "py-nested-block-or-clause-test #9 done") + (goto-char 284) + (assert (eq 266 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #10 failed") + (message "%s" "py-nested-block-or-clause-test #10 done") + (assert (eq 238 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #11 failed") + (message "%s" "py-nested-block-or-clause-test #11 done") + (assert (eq 212 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #12 failed") + (message "%s" "py-nested-block-or-clause-test #12 done") + (assert (eq 197 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #13 failed") + (message "%s" "py-nested-block-or-clause-test #13 done") + (goto-char 196) + (assert (eq 174 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #14 failed") + (message "%s" "py-nested-block-or-clause-test #14 done") + (goto-char 169) + (assert (eq 147 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #15 failed") + (message "%s" "py-nested-block-or-clause-test #15 done") + (assert (eq 110 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #16 failed") + (message "%s" "py-nested-block-or-clause-test #16 done") + (assert (eq 76 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #17 failed") + (message "%s" "py-nested-block-or-clause-test #17 done") + (assert (eq 60 (py-beginning-of-block-or-clause)) nil "py-nested-block-or-clause-test #18 failed") + (message "%s" "py-nested-block-or-clause-test #18 done") + ) + +(setq py-travel-current-indent-test-start 12) + +(defun py-travel-current-indent-test (&optional indent orig) + (interactive) + (let ((orig (point)) + (indent (or indent + py-travel-current-indent-test-start + (string-to-number (read-from-minibuffer "Indent to travel:"))))) + (py-travel-current-indent indent orig))) + +(defun docstring-style-switches-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- + +")) + (py-bug-tests-intern 'docstring-style-switches-base arg teststring))) + +(defun docstring-style-switches-base () + + (py-django-docstring-style-on) + (assert (eq 'django py-docstring-style) nil "django not py-docstring-style") + + (py-onetwo-docstring-style-on) + (assert (eq 'onetwo py-docstring-style) nil "onetwo not py-docstring-style") + + (py-pep-257-docstring-style-on) + (assert (eq 'pep-257 py-docstring-style) nil "pep-257 not py-docstring-style") + + (py-pep-257-nn-docstring-style-on) + (assert (eq 'pep-257-nn py-docstring-style) nil "pep-257-nn not py-docstring-style") + + (py-symmetric-docstring-style-on) + (assert (eq 'symmetric py-docstring-style) nil "symmetric not py-docstring-style") + +) + +(defun forward-sexp-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +def usage(): + print(\"\"\"Fehler: %s +Es muß die aufzurufende Ziehungszahl als Argument angegeben werden: +'python roulette.py 1, 'python roulette.py 2', ... 'python roulette.py n'. +\"\"\" % ( + os.path.basename(sys.argv[0]))) +")) + (py-bug-tests-intern 'forward-sexp-base arg teststring))) + +(defun forward-sexp-base () + ;; (message "forward-sexp-function: %s" forward-sexp-function) + (goto-char 71) + (sit-for 0.1) + (forward-sexp 1) + (sit-for 0.1) + (assert (eq 231 (point)) nil "forward-sexp-test failed")) + +(defun nested-if-test (&optional arg) + (interactive "p") + (let ((teststring "#! /usr/bin/env python +# -*- coding: utf-8 -*- +if foo: + bar = \"p\" +elif bar: + if baz == True: + print(\" \") +else: + bar = baz +")) + (py-bug-tests-intern 'nested-if-base arg teststring))) + +(defun nested-if-base () + (py-beginning-of-block) + (assert (eq 48 (point)) nil "nested-if-test #1 failed") + (goto-char 118) + (py-beginning-of-block) + (assert (eq 84 (point)) nil "nested-if-test #2 failed") + (py-beginning-of-block) + (assert (eq 48 (point)) nil "nested-if-test #3 failed")) + +(defun py-execute-region-error-test (&optional arg) + (interactive "p") + (let ((teststring "with file(\"roulette-\" + zeit + \".csv\", 'w') as datei: + for i in range(anzahl): + klauf.pylauf() + datei.write(str(spiel[i]) + \"\\n\") + print(F) +")) + (py-bug-tests-intern 'py-execute-region-base arg teststring))) + +(defun py-execute-region-base () + (goto-char 152) + (push-mark) + (end-of-line) + (py-execute-region (line-beginning-position) (line-end-position)) + (set-buffer "*Python*") + (goto-char (point-max)) + (switch-to-buffer (current-buffer)) + (assert (and (re-search-backward py-shell-prompt-regexp nil t 2) + (search-forward "line 5")) nil "py-execute-region-test failed")) + +(defun py-execute-statement-error-test (&optional arg) + (interactive "p") + (let ((teststring "with file(\"roulette-\" + zeit + \".csv\", 'w') as datei: + for i in range(anzahl): + klauf.pylauf() + datei.write(str(spiel[i]) + \"\\n\") + print(F) +")) + (py-bug-tests-intern 'py-execute-statement-base arg teststring))) + +(defun py-execute-statement-base () + (goto-char 152) + (push-mark) + (end-of-line) + (py-execute-statement) + (set-buffer "*Python*") + (goto-char (point-max)) + (switch-to-buffer (current-buffer)) + (assert (and (re-search-backward py-shell-prompt-regexp nil t 2) + (search-forward "line 5")) nil "py-execute-statement-test failed")) + + + +(provide 'python-mode-test) diff --git a/elpa/python-mode-6.1.3/test/python-mode-tests.sh b/elpa/python-mode-6.1.3/test/python-mode-tests.sh new file mode 100755 index 000000000..81b633f4e --- /dev/null +++ b/elpa/python-mode-6.1.3/test/python-mode-tests.sh @@ -0,0 +1,1459 @@ + #!/bin/bash + +# Author: Andreas Roehler + +# 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 . +# Commentary: + +# This script tests Emacs python-mode. + +# Caveats: +# +# needs being started in `test' directory +# optional shell argument PATH/TO/EMACS-SOURCE-DIRECTORY might be given +# +# If testing with emacs-24 please be aware of bug 11984 [0], for the +# time being the patch will need to be added manually. +# +# IPython 0.12 due to a bug in argparse requires a patch [1] to work. +# +# 0. http://debbugs.gnu.org/cgi/bugreport.cgi?bug=11984 +# 1. http://bugs.python.org/issue13720 + +# Code: + + +# if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then +# hash -r 2>/dev/null +# fi + +# needs being in `test' directory +# PCOT=`pwd` +PCOT=$PWD +# PDIR=".." +PDIR=$(cd ..; pwd) +# the directory that this file is in. +# TESTDIR="$(dirname "$0")" +# PDIR="$TESTDIR/.." + +# write PATH-TO-EMACS source code default directory here +EMACS_DEFAULT_DIR="/usr/share/emacs/24.2" + +EMACS_DIR= +if [ $1 ]; then + echo "\$1: $1" + EMACS_DIR=$1 +else + EMACS_DIR=$EMACS_DEFAULT_DIR +fi + +# else +# cat <s should be marked as strings. +# - None of the quote marks around O's should be marked as strings. +# - Quote marks that are between angle brackets (<...>) should be +# marked as strings. Think of "X" as a pair of angle brackets +# right next to one another. Also, quotes to the left of >s +# and the right of with other characters should not affect +# the fontificatin any; these characters were just used to make it +# easier to see what the intended colorization is.) + +# Some easy cases: +"O" 'O' "<'>" '<">' + "O" 'O' "<'>" '<">' + " O " ' O ' " < ' > " ' < " > ' +"""O""" '''O''' "<<<'>>>" '''<">''' + +# Some harder cases: +"""<">""" '''<'>''' + +# Some tricky cases with backslashes. +'''<'>''' '''<\'''>''' '''<\\''' + +# Some tricky cases with more than 3 quotes in a row. +"O""" "O" +"""">""" +"""">>""" +""""X">""" +""""X"">""" +"""O""""O" "" +"""O""""" "O" +"""O""""""<">""" +"""O"""""""X">""" +"""O""""""""X">""" +"""O""" "<<<>>>>" +"""""""""O""" "O" +"""O""""O""O""O""" +"""">""" """">>""" """">>>""" +""""">""" """"">>""" """"">>>""" +""""">>>""""O" """"">>>""""" +"""""""""<""X"X"">""" + +# One version had a bug with comments ending in string markers: " +"""O""" + + "" "" + +"""<">""" '''<'>''' + +# Spanning multiple lines: + +"< +>" + +'< +>' + +""" +< +< +< +< +' +X +X +X +" +> +> +""" diff --git a/init.el b/init.el index 0a7c47389..bc0a8a432 100644 --- a/init.el +++ b/init.el @@ -13,3 +13,19 @@ (package-refresh-contents)) (load "~/.emacs.d/user.el") +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(ansi-color-faces-vector [default bold shadow italic underline bold bold-italic bold]) + '(ansi-color-names-vector [zenburn-bg zenburn-red zenburn-green zenburn-yellow zenburn-blue zenburn-magenta zenburn-cyan zenburn-fg]) + '(custom-enabled-themes (quote (zenburn))) + '(custom-safe-themes (quote ("9e54a6ac0051987b4296e9276eecc5dfb67fdcd620191ee553f40a9b6d943e78" default))) + '(fci-rule-color "#2a2a2a")) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + )