diff --git a/elpa/archives/gnu/archive-contents b/elpa/archives/gnu/archive-contents new file mode 100644 index 000000000..e20ecb962 --- /dev/null +++ b/elpa/archives/gnu/archive-contents @@ -0,0 +1,456 @@ +(1 + (ack . + [(1 3) + nil "Interface to ack-like source code search tools" tar + ((:keywords "tools" "processes" "convenience") + (:url . "https://github.com/leoliu/ack-el"))]) + (ada-mode . + [(5 1 5) + ((wisi + (1 0 5)) + (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"))]) + (adaptive-wrap . + [(0 5) + nil "Smart line-wrapping with wrap-prefix" single + ((:url . "http://elpa.gnu.org/packages/adaptive-wrap.html") + (:keywords))]) + (adjust-parens . + [(3 0) + nil "Indent and dedent Lisp code, automatically adjust close parens" tar + ((:url . "http://elpa.gnu.org/packages/adjust-parens.html"))]) + (all . + [(1 0) + nil "Edit all lines matching a given regexp" single + ((:url . "http://elpa.gnu.org/packages/all.html") + (:keywords "matching"))]) + (ascii-art-to-unicode . + [(1 9) + nil "a small artist adjunct" single + ((:url . "http://www.gnuvola.org/software/aa2u/") + (:keywords "ascii" "unicode" "box-drawing"))]) + (auctex . + [(11 87 7) + nil "Integrated environment for *TeX*" tar + ((:url . "http://www.gnu.org/software/auctex/"))]) + (aumix-mode . + [(7) + nil "run the aumix program in a buffer" single + ((:url . "http://user42.tuxfamily.org/aumix-mode/index.html") + (:keywords "multimedia" "mixer" "aumix"))]) + (caps-lock . + [(1 0) + nil "Caps-lock as a minor mode" single + ((:url . "http://elpa.gnu.org/packages/caps-lock.html") + (:keywords))]) + (chess . + [(2 0 4) + ((cl-lib + (0 5))) + "Play chess in GNU Emacs" tar + ((:keywords "games") + (:url . "http://elpa.gnu.org/packages/chess.html"))]) + (cl-lib . + [(0 5) + nil "Properly prefixed CL functions and macros" single + ((:url . "http://elpa.gnu.org/packages/cl-lib.html") + (:keywords))]) + (coffee-mode . + [(0 4 1 1) + nil "Major mode for CoffeeScript files" single + ((:url . "http://github.com/defunkt/coffee-mode") + (:keywords "coffeescript" "major" "mode"))]) + (company . + [(0 8 3) + ((emacs + (24 1)) + (cl-lib + (0 5))) + "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 + ((:url . "http://centaur.maths.qmul.ac.uk/Emacs/") + (:keywords "convenience"))]) + (debbugs . + [(0 6) + nil "SOAP library to access debbugs servers" tar + ((:keywords "comm" "hypermedia") + (:url . "http://elpa.gnu.org/packages/debbugs.html"))]) + (dict-tree . + [(0 12 8) + ((trie + (0 2 5)) + (tNFA + (0 1 1)) + (heap + (0 3))) + "Dictionary data structure" single + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "matching" "data structures trie" "tree" "dictionary" "completion" "regexp"))]) + (diff-hl . + [(1 6 0) + ((cl-lib + (0 2))) + "Highlight uncommitted changes" tar + ((:keywords "vc" "diff") + (:url . "https://github.com/dgutov/diff-hl"))]) + (dismal . + [(1 5) + ((cl-lib + (0))) + "Dis Mode Ain't Lotus: Spreadsheet program Emacs" tar + ((:url . "http://elpa.gnu.org/packages/dismal.html"))]) + (djvu . + [(0 5) + nil "Edit and view Djvu files via djvused" single + ((:url . "http://elpa.gnu.org/packages/djvu.html") + (:keywords "files" "wp"))]) + (docbook . + [(0 1) + nil "Info-like viewer for DocBook" single + ((:url . "http://elpa.gnu.org/packages/docbook.html") + (:keywords "docs" "help"))]) + (easy-kill . + [(0 9 3) + ((emacs + (24)) + (cl-lib + (0 5))) + "kill & mark things easily" tar + ((:keywords "killing" "convenience") + (:url . "https://github.com/leoliu/easy-kill"))]) + (ediprolog . + [(1 0) + nil "Emacs Does Interactive Prolog" single + ((:url . "http://elpa.gnu.org/packages/ediprolog.html") + (:keywords "languages" "processes"))]) + (eldoc-eval . + [(0 1) + nil "Enable eldoc support when minibuffer is in use." single + ((:url . "http://elpa.gnu.org/packages/eldoc-eval.html") + (:keywords))]) + (electric-spacing . + [(5 0) + nil "Insert operators with surrounding spaces smartly" single + ((:url . "http://elpa.gnu.org/packages/electric-spacing.html") + (:keywords))]) + (enwc . + [(1 0) + nil "The Emacs Network Client" tar + ((:keywords "enwc" "network" "wicd" "manager" "nm") + (:url . "http://elpa.gnu.org/packages/enwc.html"))]) + (epoch-view . + [(0 0 1) + nil "Minor mode to visualize epoch timestamps" single + ((:url . "http://elpa.gnu.org/packages/epoch-view.html") + (:keywords "data" "timestamp" "epoch" "unix"))]) + (ergoemacs-mode . + [(5 14 7 3) + ((emacs + (24 1)) + (undo-tree + (0 6 5))) + "Emacs mode based on common modern interface and ergonomics." tar + ((:keywords "convenience") + (:url . "https://github.com/ergoemacs/ergoemacs-mode"))]) + (f90-interface-browser . + [(1 1) + nil "Parse and browse f90 interfaces" single + ((:url . "http://github.com/wence-/f90-iface/") + (:keywords))]) + (flylisp . + [(0 2) + ((emacs + (24 1)) + (cl-lib + (0 4))) + "Color unbalanced parentheses and parentheses inconsistent with indentation" single + ((:url . "http://elpa.gnu.org/packages/flylisp.html") + (:keywords))]) + (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"))]) + (gnugo . + [(3 0 0) + ((ascii-art-to-unicode + (1 5)) + (xpm + (1 0 1)) + (cl-lib + (0 5))) + "play GNU Go in a buffer" tar + ((:keywords "games" "processes") + (:url . "http://www.gnuvola.org/software/gnugo/"))]) + (heap . + [(0 3) + nil "Heap (a.k.a. priority queue) data structure" single + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "data structures" "heap" "priority queue"))]) + (ioccur . + [(2 4) + nil "Incremental occur" single + ((:url . "http://elpa.gnu.org/packages/ioccur.html") + (:keywords))]) + (javaimp . + [(0 4) + nil "Add and reorder Java import statements in Maven projects" single + ((:url . "http://elpa.gnu.org/packages/javaimp.html") + (:keywords "java" "maven" "programming"))]) + (jgraph-mode . + [(1 0) + nil "Major mode for Jgraph files" single + ((:url . "http://elpa.gnu.org/packages/jgraph-mode.html") + (:keywords "tex" "wp"))]) + (js2-mode . + [(20140114) + ((emacs + (24 1))) + "Improved JavaScript editing mode" tar + ((:keywords "languages" "javascript") + (:url . "https://github.com/mooz/js2-mode/"))]) + (jumpc . + [(3 0) + nil "jump to previous insertion points" single + ((:url . "http://elpa.gnu.org/packages/jumpc.html") + (:keywords))]) + (lex . + [(1 1) + nil "Lexical analyser construction" tar + ((:url . "http://elpa.gnu.org/packages/lex.html"))]) + (lmc . + [(1 3) + nil "Little Man Computer in Elisp" single + ((:url . "http://elpa.gnu.org/packages/lmc.html") + (:keywords))]) + (load-dir . + [(0 0 3) + nil "Load all Emacs Lisp files in a given directory" single + ((:url . "http://elpa.gnu.org/packages/load-dir.html") + (:keywords "lisp" "files" "convenience"))]) + (markchars . + [(0 2 0) + nil "Mark chars fitting certain characteristics" single + ((:url . "http://elpa.gnu.org/packages/markchars.html") + (:keywords))]) + (memory-usage . + [(0 2) + nil "Analyze the memory usage of Emacs in various ways" single + ((:url . "http://elpa.gnu.org/packages/memory-usage.html") + (:keywords "maint"))]) + (metar . + [(0 1) + ((cl-lib + (0 5))) + "Retrieve and decode METAR weather information" single + ((:url . "http://elpa.gnu.org/packages/metar.html") + (:keywords "comm"))]) + (minimap . + [(1 2) + nil "Sidebar showing a \"mini-map\" of a buffer" single + ((:url . "http://elpa.gnu.org/packages/minimap.html") + (:keywords))]) + (muse . + [(3 20) + nil "Authoring and publishing tool for Emacs" tar + ((:keywords "hypermedia") + (:url . "http://mwolson.org/projects/EmacsMuse.html"))]) + (nhexl-mode . + [(0 1) + nil "Minor mode to edit files via hex-dump format" single + ((:url . "http://elpa.gnu.org/packages/nhexl-mode.html") + (:keywords "data"))]) + (nlinum . + [(1 5) + nil "Show line numbers in the margin" single + ((:url . "http://elpa.gnu.org/packages/nlinum.html") + (:keywords "convenience"))]) + (notes-mode . + [(1 30) + nil "Indexing system for on-line note-taking" tar + ((:url . "http://elpa.gnu.org/packages/notes-mode.html"))]) + (num3-mode . + [(1 2) + nil "highlight groups of digits in long numbers" single + ((:url . "http://elpa.gnu.org/packages/num3-mode.html") + (:keywords "faces" "minor-mode"))]) + (oauth2 . + [(0 10) + nil "OAuth 2.0 Authorization Protocol" single + ((:url . "http://elpa.gnu.org/packages/oauth2.html") + (:keywords "comm"))]) + (omn-mode . + [(1 0) + nil "Support for OWL Manchester Notation" single + ((:url . "http://elpa.gnu.org/packages/omn-mode.html") + (:keywords))]) + (org . + [(20140901) + nil "Outline-based notes management and organizer" tar nil]) + (osc . + [(0 1) + nil "Open Sound Control protocol library" single + ((:url . "http://elpa.gnu.org/packages/osc.html") + (:keywords "comm" "processes" "multimedia"))]) + (poker . + [(0 1) + nil "Texas hold'em poker" single + ((:url . "http://elpa.gnu.org/packages/poker.html") + (:keywords "games"))]) + (quarter-plane . + [(0 1) + nil "Minor mode for quarter-plane style editing" single + ((:url . "http://elpa.gnu.org/packages/quarter-plane.html") + (:keywords "convenience" "wp"))]) + (queue . + [(0 1 1) + nil "Queue data structure" single + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "data structures" "queue"))]) + (rainbow-mode . + [(0 9) + nil "Colorize color names in buffers" single + ((:url . "http://elpa.gnu.org/packages/rainbow-mode.html") + (:keywords "faces"))]) + (register-list . + [(0 1) + nil "Interactively list/edit registers" single + ((:url . "http://elpa.gnu.org/packages/register-list.html") + (:keywords "register"))]) + (rudel . + [(0 3) + nil "A collaborative editing framework for Emacs" tar + ((:keywords "rudel" "collaboration") + (:url . "http://rudel.sourceforge.net/"))]) + (shen-mode . + [(0 1) + nil "A major mode for editing shen source code" tar + ((:keywords "languages" "shen") + (:url . "http://elpa.gnu.org/packages/shen-mode.html"))]) + (sisu-mode . + [(3 0 3) + nil "Major mode for SiSU markup text" single + ((:url . "http://elpa.gnu.org/packages/sisu-mode.html") + (:keywords "text" "processes" "tools"))]) + (sml-mode . + [(6 5) + nil "Major mode for editing (Standard) ML" single + ((:url . "http://elpa.gnu.org/packages/sml-mode.html") + (:keywords "sml"))]) + (sokoban . + [(1 4) + nil "Implementation of Sokoban for Emacs." tar + ((:keywords "games") + (:url . "http://elpa.gnu.org/packages/sokoban.html"))]) + (svg-clock . + [(0 5) + nil "Analog clock using Scalable Vector Graphics" single + ((:url . "http://elpa.gnu.org/packages/svg-clock.html") + (:keywords "demo" "svg" "clock"))]) + (tNFA . + [(0 1 1) + ((queue + (0 1))) + "Tagged non-deterministic finite-state automata" single + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "matching" "data structures tnfa" "nfa" "dfa" "finite state automata" "automata" "regexp"))]) + (temp-buffer-browse . + [(1 2) + nil "temp buffer browse mode" single + ((:url . "http://elpa.gnu.org/packages/temp-buffer-browse.html") + (:keywords "convenience"))]) + (trie . + [(0 2 6) + ((tNFA + (0 1 1)) + (heap + (0 3))) + "Trie data structure" single + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "extensions" "matching" "data structures trie" "ternary search tree" "tree" "completion" "regexp"))]) + (undo-tree . + [(0 6 5) + nil "Treat undo history as a tree" single + ((:url . "http://www.dr-qubit.org/emacs.php") + (:keywords "convenience" "files" "undo" "redo" "history" "tree"))]) + (uni-confusables . + [(0 1) + nil "Unicode confusables table" tar + ((:url . "http://elpa.gnu.org/packages/uni-confusables.html"))]) + (vlf . + [(1 5) + nil "View Large Files" tar + ((:keywords "large files" "utilities") + (:url . "https://github.com/m00natic/vlfi"))]) + (w3 . + [(4 0 49) + nil "Fully customizable, largely undocumented web browser for Emacs" tar + ((:keywords "faces" "help" "comm" "news" "mail" "processes" "mouse" "hypermedia") + (:url . "http://elpa.gnu.org/packages/w3.html"))]) + (wcheck-mode . + [(2014 6 21) + nil "General interface for text checkers" single + ((:url . "https://github.com/tlikonen/wcheck-mode") + (:keywords "text" "spell" "check" "languages" "ispell"))]) + (web-server . + [(0 1 1) + ((emacs + (24 4))) + "Emacs Web Server" tar + ((:keywords "http" "server" "network") + (:url . "https://github.com/eschulte/emacs-web-server"))]) + (websocket . + [(1 3) + nil "Emacs WebSocket client and server" tar + ((:keywords "communication" "websocket" "server") + (:url . "http://elpa.gnu.org/packages/websocket.html"))]) + (windresize . + [(0 1) + nil "Resize windows interactively" single + ((:url . "http://elpa.gnu.org/packages/windresize.html") + (:keywords "window"))]) + (wisi . + [(1 0 5) + ((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"))]) + (wpuzzle . + [(1 1) + nil "find as many word in a given time" single + ((:url . "http://elpa.gnu.org/packages/wpuzzle.html") + (:keywords))]) + (xclip . + [(1 3) + nil "use xclip to copy&paste" single + ((:url . "http://elpa.gnu.org/packages/xclip.html") + (:keywords "convenience" "tools"))]) + (xpm . + [(1 0 3) + nil "edit XPM images" tar + ((:keywords "multimedia" "xpm") + (:url . "http://www.gnuvola.org/software/xpm/"))]) + (yasnippet . + [(0 8 0) + nil "Yet another snippet extension for Emacs." tar + ((:keywords "convenience" "emulation") + (:url . "http://github.com/capitaomorte/yasnippet"))])) 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 000000000..38812d4f1 Binary files /dev/null and b/elpa/cider-0.4.0/cider-client.elc differ 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 000000000..184d3fd3b Binary files /dev/null and b/elpa/cider-0.4.0/cider-eldoc.elc differ diff --git a/elpa/cider-0.4.0/cider-interaction.el b/elpa/cider-0.4.0/cider-interaction.el new file mode 100644 index 000000000..b05430634 --- /dev/null +++ b/elpa/cider-0.4.0/cider-interaction.el @@ -0,0 +1,1159 @@ +;;; cider-interaction.el --- IDE 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: + +;; 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 000000000..7302f0fb7 Binary files /dev/null and b/elpa/cider-0.4.0/cider-interaction.elc differ 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 000000000..42392282d Binary files /dev/null and b/elpa/cider-0.4.0/cider-macroexpansion.elc differ diff --git a/elpa/cider-0.4.0/cider-mode.el b/elpa/cider-0.4.0/cider-mode.el new file mode 100644 index 000000000..32b09c0b7 --- /dev/null +++ b/elpa/cider-0.4.0/cider-mode.el @@ -0,0 +1,123 @@ +;;; cider-mode.el --- Minor mode for 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: + +;; 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 000000000..b64e40c22 Binary files /dev/null and b/elpa/cider-0.4.0/cider-mode.elc differ 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 000000000..232d06b63 Binary files /dev/null and b/elpa/cider-0.4.0/cider-pkg.elc differ 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 000000000..279a79b1d Binary files /dev/null and b/elpa/cider-0.4.0/cider-repl.elc differ diff --git a/elpa/cider-0.4.0/cider-selector.el b/elpa/cider-0.4.0/cider-selector.el new file mode 100644 index 000000000..22b7e76d2 --- /dev/null +++ b/elpa/cider-0.4.0/cider-selector.el @@ -0,0 +1,152 @@ +;;; cider-selector.el --- Buffer selection command inspired by SLIME's selector + +;; 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: + +;; 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 000000000..822d0f94b Binary files /dev/null and b/elpa/cider-0.4.0/cider-selector.elc differ diff --git a/elpa/cider-0.4.0/cider-util.el b/elpa/cider-0.4.0/cider-util.el new file mode 100644 index 000000000..e6fe66a6d --- /dev/null +++ b/elpa/cider-0.4.0/cider-util.el @@ -0,0 +1,57 @@ +;;; cider-util.el --- Common utility functions that don't belong anywhere else + +;; 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: + +;; 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 000000000..b536a6d43 Binary files /dev/null and b/elpa/cider-0.4.0/cider-util.elc differ 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 000000000..0b4942cfc Binary files /dev/null and b/elpa/cider-0.4.0/cider-version.elc differ 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 000000000..5e8a70c24 Binary files /dev/null and b/elpa/cider-0.4.0/cider.elc differ 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 000000000..5d3ffa9e3 Binary files /dev/null and b/elpa/cider-0.4.0/nrepl-client.elc differ diff --git a/elpa/cider-0.7.0/cider-mode.elc b/elpa/cider-0.7.0/cider-mode.elc deleted file mode 100644 index 612113c2f..000000000 Binary files a/elpa/cider-0.7.0/cider-mode.elc and /dev/null differ diff --git a/elpa/concurrent-0.3.2/concurrent-autoloads.el b/elpa/concurrent-0.3.2/concurrent-autoloads.el new file mode 100644 index 000000000..964cb6bb5 --- /dev/null +++ b/elpa/concurrent-0.3.2/concurrent-autoloads.el @@ -0,0 +1,18 @@ +;;; concurrent-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads nil nil ("concurrent-pkg.el" "concurrent.el") (21566 +;;;;;; 24343 526351 225000)) + +;;;*** + +(provide 'concurrent-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; concurrent-autoloads.el ends here diff --git a/elpa/concurrent-0.3.2/concurrent-pkg.el b/elpa/concurrent-0.3.2/concurrent-pkg.el new file mode 100644 index 000000000..f451966f1 --- /dev/null +++ b/elpa/concurrent-0.3.2/concurrent-pkg.el @@ -0,0 +1 @@ +(define-package "concurrent" "0.3.2" "Concurrent utility functions for emacs lisp" (quote ((deferred "0.3.1")))) diff --git a/elpa/concurrent-0.3.2/concurrent-pkg.elc b/elpa/concurrent-0.3.2/concurrent-pkg.elc new file mode 100644 index 000000000..2bec5e568 Binary files /dev/null and b/elpa/concurrent-0.3.2/concurrent-pkg.elc differ 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 000000000..978f24003 Binary files /dev/null and b/elpa/concurrent-0.3.2/concurrent.elc differ 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 000000000..1d21a8340 Binary files /dev/null and b/elpa/ctable-0.1.2/ctable-pkg.elc differ 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 000000000..8371cfd69 Binary files /dev/null and b/elpa/ctable-0.1.2/ctable.elc differ 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 000000000..601741846 Binary files /dev/null and b/elpa/deferred-0.3.2/deferred-pkg.elc differ 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 000000000..4b7a1a81d Binary files /dev/null and b/elpa/deferred-0.3.2/deferred.elc differ 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 000000000..b4caf9e6e Binary files /dev/null and b/elpa/epc-0.1.1/epc-pkg.elc differ diff --git a/elpa/epc-0.1.1/epc.el b/elpa/epc-0.1.1/epc.el new file mode 100644 index 000000000..c76012416 --- /dev/null +++ b/elpa/epc-0.1.1/epc.el @@ -0,0 +1,774 @@ +;;; epc.el --- A RPC stack for the Emacs Lisp + +;; Copyright (C) 2011, 2012 Masashi Sakurai + +;; Author: SAKURAI Masashi +;; 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 000000000..740c4bdd1 Binary files /dev/null and b/elpa/epc-0.1.1/epc.elc differ diff --git a/elpa/flycheck-0.20/flycheck-autoloads.el b/elpa/flycheck-0.20/flycheck-autoloads.el new file mode 100644 index 000000000..87f8fad8e --- /dev/null +++ b/elpa/flycheck-0.20/flycheck-autoloads.el @@ -0,0 +1,151 @@ +;;; flycheck-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads (flycheck-define-error-level flycheck-info flycheck-def-option-var +;;;;;; flycheck-def-config-file-var global-flycheck-mode flycheck-mode) +;;;;;; "flycheck" "flycheck.el" (21566 24384 704949 755000)) +;;; Generated autoloads from flycheck.el + +(autoload 'flycheck-mode "flycheck" "\ +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} + +\(fn &optional ARG)" t nil) + +(defvar global-flycheck-mode nil "\ +Non-nil if Global-Flycheck mode is enabled. +See the command `global-flycheck-mode' for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-flycheck-mode'.") + +(custom-autoload 'global-flycheck-mode "flycheck" nil) + +(autoload 'global-flycheck-mode "flycheck" "\ +Toggle Flycheck mode in all buffers. +With prefix ARG, enable Global-Flycheck mode if ARG is positive; +otherwise, disable it. If called from Lisp, enable the mode if +ARG is omitted or nil. + +Flycheck mode is enabled in all buffers where +`flycheck-mode-on-safe' would do it. +See `flycheck-mode' for more information on Flycheck mode. + +\(fn &optional ARG)" t nil) + +(autoload 'flycheck-def-config-file-var "flycheck" "\ +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'. + +\(fn SYMBOL CHECKER &optional FILE-NAME &rest CUSTOM-ARGS)" nil t) + +(put 'flycheck-def-config-file-var 'lisp-indent-function '3) + +(autoload 'flycheck-def-option-var "flycheck" "\ +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'. + +\(fn SYMBOL INIT-VALUE CHECKER DOCSTRING &rest CUSTOM-ARGS)" nil t) + +(put 'flycheck-def-option-var 'lisp-indent-function '3) + +(put 'flycheck-def-option-var 'doc-string-elt '4) + +(autoload 'flycheck-info "flycheck" "\ +Open the Flycheck manual. + +\(fn)" t nil) + +(autoload 'flycheck-define-error-level "flycheck" "\ +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'. + +\(fn LEVEL &rest PROPERTIES)" nil nil) + +(put 'flycheck-define-error-level 'lisp-indent-function '1) + +;;;*** + +;;;### (autoloads nil nil ("flycheck-pkg.el") (21566 24384 720637 +;;;;;; 44000)) + +;;;*** + +(provide 'flycheck-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; flycheck-autoloads.el ends here diff --git a/elpa/flycheck-0.20/flycheck-pkg.el b/elpa/flycheck-0.20/flycheck-pkg.el new file mode 100644 index 000000000..6a4f5a74d --- /dev/null +++ b/elpa/flycheck-0.20/flycheck-pkg.el @@ -0,0 +1,10 @@ +(define-package "flycheck" "0.20" "Modern on-the-fly syntax checking for GNU Emacs" + '((dash "2.4.0") + (pkg-info "0.4") + (cl-lib "0.3") + (emacs "24.1")) + :url "https://flycheck.readthedocs.org" :keywords + '("convenience" "languages" "tools")) +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/elpa/flycheck-0.20/flycheck.el b/elpa/flycheck-0.20/flycheck.el new file mode 100644 index 000000000..abe3578f9 --- /dev/null +++ b/elpa/flycheck-0.20/flycheck.el @@ -0,0 +1,6201 @@ +;;; flycheck.el --- Modern on-the-fly syntax checking for GNU Emacs -*- lexical-binding: t; -*- + +;; Copyright (c) 2012, 2013, 2014 Sebastian Wiesner +;; 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 000000000..26ef0d5fe Binary files /dev/null and b/elpa/flycheck-0.20/flycheck.elc differ 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 000000000..636a0c2c2 Binary files /dev/null and b/elpa/ipython-2927/ipython-pkg.elc differ diff --git a/elpa/ipython-2927/ipython.el b/elpa/ipython-2927/ipython.el new file mode 100644 index 000000000..69ff652cf --- /dev/null +++ b/elpa/ipython-2927/ipython.el @@ -0,0 +1,494 @@ +;;; ipython.el --- Adds support for IPython to python-mode.el + +;; Copyright (C) 2002, 2003, 2004, 2005 Alexander Schmolck +;; Author: Alexander Schmolck +;; Keywords: ipython python languages oop +;; URL: http://ipython.scipy.org +;; Version: 2927 +;; Compatibility: Emacs21, XEmacs21 +;; FIXME: #$@! INPUT RING +(defconst ipython-version "$Revision: 2927 $" + "VC version number.") + +;;; Commentary +;; This library makes all the functionality python-mode has when running with +;; the normal python-interpreter available for ipython, too. It also enables a +;; persistent py-shell command history across sessions (if you exit python +;; with C-d in py-shell) and defines the command `ipython-to-doctest', which +;; can be used to convert bits of a ipython session into something that can be +;; used for doctests. To install, put this file somewhere in your emacs +;; `load-path' [1] and add the following line to your ~/.emacs file (the first +;; line only needed if the default (``"ipython"``) is wrong):: +;; +;; (setq ipython-command "/SOME-PATH/ipython") +;; (require 'ipython) +;; +;; Ipython will be set as the default python shell, but only if the ipython +;; executable is in the path. For ipython sessions autocompletion with +;; 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 000000000..109dbdf8a Binary files /dev/null and b/elpa/ipython-2927/ipython.elc differ 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 000000000..d189a5b6b Binary files /dev/null and b/elpa/jedi-0.1.2/jedi.elc differ diff --git a/elpa/jedi-0.1.2/jediepcserver.py b/elpa/jedi-0.1.2/jediepcserver.py new file mode 100644 index 000000000..57351bbfe --- /dev/null +++ b/elpa/jedi-0.1.2/jediepcserver.py @@ -0,0 +1,302 @@ +""" +Jedi EPC server. + +Copyright (C) 2012 Takafumi Arakaki + +Author: Takafumi Arakaki + +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 000000000..e294cec69 Binary files /dev/null and b/elpa/python-mode-6.1.3/completion/pycomplete.elc differ 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 000000000..99914c371 Binary files /dev/null and b/elpa/python-mode-6.1.3/extensions/column-marker.elc differ 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 000000000..c0e36b43f Binary files /dev/null and b/elpa/python-mode-6.1.3/extensions/highlight-indentation.elc differ diff --git a/elpa/python-mode-6.1.3/python-mode-autoloads.el b/elpa/python-mode-6.1.3/python-mode-autoloads.el new file mode 100644 index 000000000..da1640e9d --- /dev/null +++ b/elpa/python-mode-6.1.3/python-mode-autoloads.el @@ -0,0 +1,18 @@ +;;; python-mode-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + + +;;;### (autoloads nil nil ("python-mode-pkg.el" "python-mode.el") +;;;;;; (21566 24823 229424 248000)) + +;;;*** + +(provide 'python-mode-autoloads) +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; python-mode-autoloads.el ends here diff --git a/elpa/python-mode-6.1.3/python-mode-pkg.el b/elpa/python-mode-6.1.3/python-mode-pkg.el new file mode 100644 index 000000000..b50930be2 --- /dev/null +++ b/elpa/python-mode-6.1.3/python-mode-pkg.el @@ -0,0 +1,2 @@ +(define-package "python-mode" "6.1.3" + "An Emacs mode for editing Python code") diff --git a/elpa/python-mode-6.1.3/python-mode-pkg.elc b/elpa/python-mode-6.1.3/python-mode-pkg.elc new file mode 100644 index 000000000..d00f674b6 Binary files /dev/null and b/elpa/python-mode-6.1.3/python-mode-pkg.elc differ diff --git a/elpa/python-mode-6.1.3/python-mode.el b/elpa/python-mode-6.1.3/python-mode.el new file mode 100644 index 000000000..07718782c --- /dev/null +++ b/elpa/python-mode-6.1.3/python-mode.el @@ -0,0 +1,26765 @@ +;; python-mode.el --- Towards an Python-IDE in Emacs + +;; Maintainer: Andreas Röhler +;; 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 000000000..0910f605a Binary files /dev/null and b/elpa/python-mode-6.1.3/python-mode.elc differ 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 000000000..e7ba38a10 Binary files /dev/null and b/elpa/python-mode-6.1.3/test/doctest-mode.elc differ diff --git a/elpa/python-mode-6.1.3/test/pars-part-output.el b/elpa/python-mode-6.1.3/test/pars-part-output.el new file mode 100644 index 000000000..de0753933 --- /dev/null +++ b/elpa/python-mode-6.1.3/test/pars-part-output.el @@ -0,0 +1,100 @@ +;;; pars-part-output.el --- `parse-partial-sexp' and `syntax-ppss' + + +;; Author: Andreas Roehler , 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 000000000..64fa1bb36 Binary files /dev/null and b/elpa/python-mode-6.1.3/test/pars-part-output.elc differ 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 000000000..ea31a951b Binary files /dev/null and b/elpa/python-mode-6.1.3/test/py-bug-numbered-tests.elc differ 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 000000000..ba8f5f7dd Binary files /dev/null and b/elpa/python-mode-6.1.3/test/py-shell-completion-tests.elc differ diff --git a/elpa/python-mode-6.1.3/test/python-executes-test.el b/elpa/python-mode-6.1.3/test/python-executes-test.el new file mode 100644 index 000000000..f508fad45 --- /dev/null +++ b/elpa/python-mode-6.1.3/test/python-executes-test.el @@ -0,0 +1,123 @@ +;;; python-executes-test.el --- 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-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 000000000..5b612f7c4 Binary files /dev/null and b/elpa/python-mode-6.1.3/test/python-executes-test.elc differ 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 000000000..5e6a74931 Binary files /dev/null and b/elpa/python-mode-6.1.3/test/python-extended-executes-test.elc differ 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 000000000..9a5b1657a Binary files /dev/null and b/elpa/python-mode-6.1.3/test/python-mode-ert-tests.elc differ diff --git a/elpa/python-mode-6.1.3/test/python-mode-test.el b/elpa/python-mode-6.1.3/test/python-mode-test.el new file mode 100644 index 000000000..b1544f895 --- /dev/null +++ b/elpa/python-mode-6.1.3/test/python-mode-test.el @@ -0,0 +1,2399 @@ +;;; python-mode-test.el --- tests for Emacs python-mode.el + +;; Copyright (C) 2011 Andreas Roehler + +;; Author: Andreas Roehler +;; 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. + )