Provided by: elpa-elpy_1.32.0-2_all bug

NAME

       elpy - Elpy Documentation

       Elpy  is  the Emacs Python Development Environment. It aims to provide an easy to install,
       fully-featured environment for Python development.

INTRODUCTION

   Overview
       Elpy is an extension for the  Emacs  text  editor  to  work  with  Python  projects.  This
       documentation  explains how to use Elpy to work on Python project using Emacs, but it does
       not aim to be an introduction to either Emacs or Python.

       You can read a quick tour of Emacs, or read the built-in tutorial by running C-h t in  the
       editor.  That  is,  you  hold  down  the  control key and hit h (the canonical help key in
       Emacs), release both, and hit t (for tutorial).

       For Python, you can read the basic tutorial. If you already know Python, you should  check
       out some best practices.

       Once you have these basics, you can go on to install Elpy.

   Installation
   With use-package
       Simply add the following lines to you .emacs (or .emacs.d/init.el, or equivalent):

          (use-package elpy
            :ensure t
            :init
            (elpy-enable))

       Or if you want to defer Elpy loading:

          (use-package elpy
            :ensure t
            :defer t
            :init
            (advice-add 'python-mode :before 'elpy-enable))

   From apt (Debian ≥10 an Ubuntu ≥18.10)
       Users  of  Debian  ≥10  or Ubuntu ≥18.10 can skip the instructions above this line and may
       simply install Elpy and all of its recommended dependencies with the following command::

          sudo apt install elpa-elpy

       Elpy can then be activated by running M-x elpy-enable.  This  can  be  made  automatic  by
       adding the following to your .emacs:

          (elpy-enable)

       In  order  to  use  all the features (such as navigation with M-.), you'll need to install
       some python libraries.  You can  do  that  easily  by  typing  M-x  elpy-config  RET,  and
       following the instructions.

   Manually from Melpa
       The main Elpy package is installed via the Emacs package interface, package.el. First, you
       have to add Elpy's package archive to your list of archives,  though.  Add  the  following
       code to your .emacs file and restart Emacs:

          (require 'package)
          (add-to-list 'package-archives
                       '("melpa-stable" . "https://stable.melpa.org/packages/"))

       Now  you  can  run  M-x  package-refresh-contents  to download a fresh copy of the archive
       contents, and M-x package-install RET elpy RET to install elpy. If you want to enable Elpy
       by default, you can simply add the following to your .emacs:

          (package-initialize)
          (elpy-enable)

       Congratulations, Elpy is now successfully installed!

   Manually from sources
       If  you want to test a specific branch or a PR that has not been merged yet, you will have
       to install Elpy from sources.

       • First, clone the repository containing the branch you are interested in:

          git clone https://github.com/USER/elpy.git
          cd elpy

       Then check out the branch associated to the PR you want to try:

          git checkout BRANCH_NAME

       • Now switch to Emacs and add Elpy's sources to the load path:

          (add-to-list 'load-path "/path/to/elpy")

       • Finally, load Elpy files:

          (load "elpy")
          (load "elpy-rpc")
          (load "elpy-shell")
          (load "elpy-profile")
          (load "elpy-refactor")
          (load "elpy-django")

   Configuration
       You can easily configure Elpy to your own preferences. All options are available through a
       unified interface, accessible with the following command:

       M-x elpy-config
              Show  the  current  Elpy  configuration, point out possible problems, and provide a
              quick interface to relevant customization options.

              Packages needed by Elpy can be installed and updated from this interface.

QUICKSTART

       Once installed, Elpy will automatically provide code completion, syntax error highlighting
       and function signature (in the modeline) for python files.

   Useful keybindings
       Elpy  has  quite  a lot of keybindings, but the following ones should be enough to get you
       started:

       C-c C-c (elpy-shell-send-region-or-buffer)
              Evaluate the current script (or region if something is selected) in an  interactive
              python shell.  The python shell is automatically displayed aside of your script.

       C-RET (elpy-shell-send-statement-and-step)
              Evaluate  the  current  statement  (current  line plus the following nested lines).
              Useful for evaluating a function or class definition or a for loop.

       C-c C-z (elpy-shell-switch-to-shell)
              Switch between your script and the interactive shell.

       C-c C-d (elpy-doc)
              Display documentation for  the  thing  under  cursor  (function  or  module).   The
              documentation will pop in a different buffer, that can be closed with q.

   Go further
       Elpy  offers  a  lot of features, including code navigation, debugging, testing, profiling
       and support for virtual environments.  Feel free to explore the documentation,  everything
       is there !

EDITING

   Emacs Basics
       Elpy  is  an extension to Emacs, and as such the standard bindings in Emacs are available.
       This manual is not meant to be an introduction to  Emacs,  but  this  section  will  still
       highlight some features in Emacs that are especially useful for Python editing.

       Movement  keys  in  Emacs  often  use fbnp for forward, backward, next (down) and previous
       (up). k and backspace (DEL) are for deleting. These are combined with  the  Control,  Meta
       and  Control-Meta  modifiers. Control generally refers to the simplest form. C-f moves one
       character forward. Meta changes this to affect words, that is,  consecutive  sequences  of
       alphanumeric characters.  The Control-Meta combination then affects whole expressions.

       In the following table, | refers to the position of point.

                                 ┌─────────────┬───────┬──────────────┐
                                 │Before       │ Key   │ After        │
                                 ├─────────────┼───────┼──────────────┤
                                 │|hello_worldC-fh|ello_world │
                                 ├─────────────┼───────┼──────────────┤
                                 │|hello_worldM-fhello|_world │
                                 ├─────────────┼───────┼──────────────┤
                                 │|hello_worldC-M-fhello_world| │
                                 └─────────────┴───────┴──────────────┘

       Expression-based commands will also work on strings, tuples, dictionaries, or any balanced
       groups of parentheses. This works for all movement keys  (f,  b,  n,  p),  with  next  and
       previous  moving  to the next or previous group of parens.  It also works with forward and
       backward deletion (d and DEL/<backspace>, respectively) for character and word groups, but
       not  for  expressions. To delete the expression after point, use C-M-k. For the expression
       before point, you can use C-M-b C-M-k.

       If you enable subword-mode, Emacs will also consider CamelCase to be two words instead  of
       one for the purpose of these operations.

       In  addition to the above, Emacs also supports moving up or down inside nested parentheses
       groups. C-M-d will move down into the next enclosed group of parentheses, while C-M-u will
       move up to the directly enclosing group of parentheses.

       Finally, a lot of Elpy's commands change their behavior when the prefix argument is given.
       That is, hit C-u before the command. In Elpy,  the  prefix  argument  often  disables  any
       attempt by the command at being smart, in case it would get it wrong.

   Moving By Indentation
       C-down (elpy-nav-forward-block)

       C-up (elpy-nav-backward-block)
              These  commands  are  used  to  navigate between lines with same indentation as the
              current line. Point should be placed on the first non-whitespace character  of  the
              line and then use C-down to move forward or C-up to move backward.

       C-left (elpy-nav-backward-indent)

       C-right (elpy-nav-forward-indent)
              These commands are used to navigate between indentation levels.  C-left moves point
              to previous indent level or over previous word.  C-right moves point to next indent
              level or over the next word.

   Moving the Current Region
       M-down (elpy-nav-move-line-or-region-down)

       M-up (elpy-nav-move-line-or-region-up)

       M-left (elpy-nav-indent-shift-left)

       M-right (elpy-nav-indent-shift-right)
              Elpy can move the selected region (or the current line if no region is selected) by
              using the cursor keys with meta. Left and right will dedent  or  indent  the  code,
              while up and down will move it line-wise up or down, respectively.

IDE FEATURES

   Projects
       Elpy  supports  the  notion  of  projects,  a  related  collection of files under a common
       directory. This common directory is called the project root. A number of  Elpy's  commands
       work on all files inside the project root.

       C-c C-f (elpy-find-file)
              Find  a  file  in the current project. This uses a search-as-you-type interface for
              all files under the project root.

              A prefix argument enables "do what I mean" mode. On an import  statement,  it  will
              try  to  open  the  module  imported.  Elsewhere  in  a  file,  it will look for an
              associated test or implementation file, and if found, open  that.  If  this  fails,
              either way, it will fall back to the normal find file in project behavior.

              If  the  current  file is called foo.py, then this will search for a test_foo.py in
              the same directory, or in a test or tests subdirectory.  If  the  current  file  is
              already called test_foo.py, it will try and find a foo.py nearby.

              This  command  uses  projectile or find-file-in-project under the hood, so you need
              one of them to be installed.

       C-c C-s (elpy-rgrep-symbol)
              Search the files in the current project for a string. By  default,  this  uses  the
              symbol at point. With a prefix argument, it will prompt for a regular expression to
              search.

              This is basically a grep -r through the project.

       In addition to these two commands, elpy-check also supports optionally checking all  files
       in the current project.

       Elpy's idea of the project root and which files belong to a project and which don't can be
       influenced as well.

       M-x elpy-set-project-root
              Set the current project root directory. This directory  should  contain  all  files
              related to the current project.

       elpy-project-ignored-directories (Customize Option)
              When  Elpy  searches  for  files  in  the  current project, it will ignore files in
              directories listed here.

       elpy-project-root-finder-functions (Customize Option)
              To find the project root, Elpy can utilize  a  number  of  heuristics.   With  this
              option, you can configure which are used.

       To  configure  Elpy  specifically  for  a  single  project,  you  can use Emacs' Directory
       Variables. Elpy provides a simple interface to this.

       M-x elpy-set-project-variable
              Set or change the value of a project-wide variable. With  a  prefix  argument,  the
              value for the variable is removed.

              This only takes effect in new buffers.

   Completion
       When  you  type Python code, Elpy will try and figure out possible completions and provide
       them in a suggestion window. If Elpy doesn't do so automatically,  you  can  force  it  to
       complete right where you are.

       M-TAB (elpy-company-backend)
              Provide completion suggestions for a completion at point.

       You  can  use  cursor  keys  or  M-n and M-p to scroll through the options, RET to use the
       selected completion, or TAB to complete the common part.

       On any completion option, C-d or <f1> will display a temporary window with  documentation.
       C-w  will display a temporary window showing the source code of the completion to get some
       context.

       Elpy uses Company Mode for the completion interface, so its documentation is a good  place
       for further information.

       elpy-get-info-from-shell (Customize Option)
              If  t,  use  the shell to gather docstrings and completions. Normally elpy provides
              completion and documentation using static code  analysis  (from  jedi).  With  this
              option,  elpy  will  add  the  completion  candidates  and  the docstrings from the
              associated python shell; This activates fallback completion  candidates  for  cases
              when the static code analysis fails.

   Navigation
       Elpy supports advanced navigation features.

       M-. (elpy-goto-definition)
              Go  to  the  location  where the identifier at point is defined. This is not always
              easy to make out, so the result can be wrong. Also, the  backends  can  not  always
              identify what kind of symbol is at point. Especially after a few indirections, they
              have basically no hope of guessing right, so they don't.

       C-x 4 M-. (elpy-goto-definition-other-window)
              Same as elpy-go-to-definition (with the same caveats) but goes to the definition of
              the symbol at point in other window, if defined.

       M-* (pop-tag-mark)
              Go  back to the last place where M-. was used, effectively turning M-. and M-* into
              a forward and backward motion for definition lookups.

       C-c C-o (elpy-occur-definitions)
              Search the buffer for a list of definitions of classes and functions.

       If you use an Emacs version superior to 25, Elpy will define the  necessary  backends  for
       the xref package.

       M-. (xref-find-definitions)
              Find the definition of the identifier at point.

       C-x 4 . (xref-find-definition-other-window)
              Like M-. but switch to the other window.

       C-x 5 . (xref-find-definition-other-frame)
              Like M-. but switch to the other frame.

       M-, (xref-pop-marker-stack)
              Go  back to the last place where M-. was used, effectively turning M-. and M-, into
              a forward and backward motion for definition lookups.

       M-? (xref-find-references)
              Find references for an identifier of the current buffer.

       C-M-. (xref-find-apropos)
              Find all meaningful symbols that match a given pattern.

   Interactive Python
       Emacs can run a Python interpreter in a special buffer, making it much easier to send code
       snippets  over. Elpy provides additional functionality to seamlessly work with interactive
       Python in a style similar to ESS.

   Interpreter Setup
       Elpy uses the Python interpreter setup from the Emacs python package. This section briefly
       summarizes  some  common  setups;  add the one you need to your .emacs file. Note that the
       code below (and Elpy in general) require at least Emacs 24.4.

       Use the Python standard interpreter (default):

          (setq python-shell-interpreter "python"
                python-shell-interpreter-args "-i")

       Use Jupyter console (recommended for interactive Python):

          (setq python-shell-interpreter "jupyter"
                python-shell-interpreter-args "console --simple-prompt"
                python-shell-prompt-detect-failure-warning nil)
          (add-to-list 'python-shell-completion-native-disabled-interpreters
                       "jupyter")

       Use IPython:

          (setq python-shell-interpreter "ipython"
                python-shell-interpreter-args "-i --simple-prompt")

       Note that various issues with plotting have been reported when running IPython 5 in  Emacs
       under Windows. We recommend using Jupyter console instead.

       If  you have an older version of IPython and the above code does not work for you, you may
       also try:

          (setenv "IPY_TEST_SIMPLE_PROMPT" "1")
          (setq python-shell-interpreter "ipython"
                python-shell-interpreter-args "-i")

          As an IPython_ user, you might be interested in the `Emacs IPython
          Notebook`_ or an `Elpy layer`_ for Spacemacs_, too.

   The Shell Buffer
       C-c C-z (elpy-shell-switch-to-shell)
              Switch to buffer with a Python interpreter running, starting one if necessary.

              By default, Elpy tries to find the root directory of the current project (git,  svn
              or  hg  repository,  python  package  or  projectile project) and starts the python
              interpreter  here.   This   behaviour   can   be   suppressed   with   the   option
              elpy-shell-starting-directory.

       elpy-shell-starting-directory (Customize Option)
              Govern  the directory in which Python shells will be started.  Can be 'project-root
              (default) to use the current project root, 'current-directory  to  use  the  buffer
              current directory, or a string indicating a specific path.

       M-x elpy-shell-toggle-dedicated-shell
              By  default,  python  buffers are all attached to a same python shell (that lies in
              the *Python* buffer), meaning that all buffers and code fragments will be  send  to
              this  shell.   elpy-shell-toggle-dedicated-shell  attaches a dedicated python shell
              (not shared with the other python buffers) to the current python buffer.   To  make
              this  the  default behavior (like the deprecated option elpy-dedicated-shells did),
              use the following snippet:

          (add-hook 'elpy-mode-hook (lambda () (elpy-shell-toggle-dedicated-shell 1)))

       M-x elpy-shell-set-local-shell
              Attach the current python buffer to a specific python shell (whose  name  is  asked
              with  completion).  You can use this function to have one python shell per project,
              with:

          (add-hook 'elpy-mode-hook (lambda () (elpy-shell-set-local-shell (elpy-project-root))))

       C-c C-k (elpy-shell-kill)
              Kill the associated python shell.

       C-c C-K (elpy-shell-kill-all)
              Kill all active python shells.

   Evaluating code fragments
       Elpy provides commands to send the current Python statement (e), function definition  (f),
       class  definition  (c), top-level statement (s), group of Python statements (g), cell (w),
       region (r), or buffer (b) to the Python shell for evaluation. These commands are bound  to
       prefix  C-c C-y, followed by the single character indicating what to send; e.g., C-c C-y e
       sends the Python statement at point.

       Each of the commands to send code fragments to the shell has four variants, one  for  each
       combination  of:  whether or not the point should move after sending ("step"), and whether
       or not the Python shell should be focused after sending ("go"). Step is activated  by  C-,
       go by S-. For example:

       C-c C-y e (elpy-shell-send-statement)
              Send  the  current  statement  to  the  Python  shell and keep point position. Here
              statement refers to the Python statement the point  is  on,  including  potentially
              nested  statements.  If  point  is  on  an  if/elif/else  clause send the entire if
              statement (with all its elif/else clauses). If point is on  a  decorated  function,
              send the decorator as well.

       C-c C-y C-e (elpy-shell-send-statement-and-step)
              Send  the  current statement to the Python shell and move point to first subsequent
              statement.

              Also bound to C-RET.

       C-c C-y E (elpy-shell-send-statement-and-go)
              Send the current statement to the Python shell, keeping point position, and  switch
              focus to the Python shell buffer.

       C-c C-y C-S-E (elpy-shell-send-statement-and-step-and-go)
              Send  the  current  statement  to  the Python shell, move point to first subsequent
              statement, and switch focus to the Python shell buffer.

       Elpy provides support for sending multiple statements to the shell.

       C-c C-y O (elpy-shell-send-group-and-step)
              Send the current or next group of top-level statements  to  the  Python  shell  and
              step.  A  sequence  of top-level statements is a group if they are not separated by
              empty lines. Empty lines within each top-level statement are ignored.

              If the point  is  within  a  statement,  send  the  group  around  this  statement.
              Otherwise, go to the top-level statement below point and send the group around this
              statement.

       C-c C-y W (elpy-shell-send-codecell-and-step)
              Send the current code cell to the Python shell and step. A code cell is a piece  of
              code  surrounded by special separator lines; see below. For example, you can insert
              two lines starting with ## to quickly send the code in-between.

       elpy-shell-codecell-beginning-regexp (Customize Option)
              Regular expression for matching a line indicating the beginning of a code cell.  By
              default,  ##.*  is  treated  as  a  beginning  of a code cell, as are the code cell
              beginnings in Python files exported from IPython  or  Jupyter  notebooks  (e.g.,  #
              <codecell> or # In[1]:).

       elpy-shell-cell-boundary-regexp (Customize Option)
              Regular expression for matching a line indicating the boundary of a cell (beginning
              or ending). By default, ##.* is treated as a cell boundary, as are  the  boundaries
              in Python files exported from IPython or Jupyter notebooks (e.g., # <markdowncell>,
              # In[1]:, or # Out[1]:).

              Note that elpy-shell-codecell-beginning-regexp must also match the cell  boundaries
              defined here.

       The  functions  for sending the entire buffer have special support for avoiding accidental
       code execution, e.g.:

       C-c C-y r (elpy-shell-send-region-or-buffer)
              Send the the active region (if any) or the entire buffer (otherwise) to the  Python
              shell and keep point position.

              When  sending  the  whole  buffer, this command will also escape any uses of the if
              __name__ == '__main__' idiom, to prevent accidental execution of a script.  If  you
              want this to be evaluated, pass a prefix argument with C-u.

              Also bound to C-c C-c.

       elpy-shell-add-to-shell-history (Customize Option)
              If  t,  Elpy will make the code sent available in the shell history. This allows to
              use comint-previous-input (C-up) in the python shell to get back the pieces of code
              sent by Elpy.

       The list of remaining commands to send code fragments is:

       C-c C-y s (elpy-shell-send-top-statement)

       C-c C-y S (elpy-shell-send-top-statement-and-go)

       C-c C-y f (elpy-shell-send-defun)

       C-c C-y F (elpy-shell-send-defun-and-go)

       C-c C-y c (elpy-shell-send-defclass)

       C-c C-y C (elpy-shell-send-defclass-and-go)

       C-c C-y o (elpy-shell-send-group)

       C-c C-y O (elpy-shell-send-group-and-go)

       C-c C-y w (elpy-shell-send-codecell)

       C-c C-y W (elpy-shell-send-codecell-and-go)

       C-c C-y R (elpy-shell-send-region-or-buffer-and-go)

       C-c C-y b (elpy-shell-send-buffer)

       C-c C-y B (elpy-shell-send-buffer-and-go)

       C-c C-y C-s (elpy-shell-send-top-statement-and-step)

       C-c C-y C-S-S (elpy-shell-send-top-statement-and-step-and-go)

       C-c C-y C-f (elpy-shell-send-defun-and-step)

       C-c C-y C-S-F (elpy-shell-send-defun-and-step-and-go)

       C-c C-y C-c (elpy-shell-send-defclass-and-step)

       C-c C-y C-S-C (elpy-shell-send-defclass-and-step-and-go)

       C-c C-y C-S-O (elpy-shell-send-group-and-step-and-go)

       C-c C-y C-W (elpy-shell-send-codecell-and-step-and-go)

       C-c C-y C-r (elpy-shell-send-region-or-buffer-and-step)

       C-c C-y C-S-R (elpy-shell-send-region-or-buffer-and-step-and-go)

       C-c C-y C-b (elpy-shell-send-buffer-and-step)

       C-c C-y C-S-B (elpy-shell-send-buffer-and-step-and-go)

   Shell feedback
       When  package eval-sexp-fu is loaded and eval-sexp-fu-flash-mode is active, the statements
       sent to the shell are  briefly  flashed  after  running  an  evaluation  command,  thereby
       providing visual feedback.

       elpy-shell-echo-input (Customize Option)
              Whenever  a code fragment is sent to the Python shell, Elpy prints it in the Python
              shell buffer (i.e., it looks as if it was actually  typed  into  the  shell).  This
              behavior can be turned on and off via the custom variable elpy-shell-echo-input and
              further  customized  via   elpy-shell-echo-input-cont-prompt   (whether   to   show
              continuation  prompts for multi-line inputs) and elpy-shell-echo-input-lines-head /
              elpy-shell-echo-input-lines-tail (how much to cut when input is long).

       elpy-shell-echo-output (Customize Option)
              Elpy shows the output produced by a code fragment sent to the  shell  in  the  echo
              area  when the shell buffer is currently invisible. This behavior can be controlled
              via elpy-shell-echo-output (never, always, or only when  shell  invisible).  Output
              echoing      is      particularly     useful     if     the     custom     variable
              elpy-shell-display-buffer-after-send is set to nil (the default  value).  Then,  no
              window  is needed to display the shell (thereby saving screen real estate), but the
              outputs can still be seen in the echo area.

       elpy-shell-display-buffer-after-send (Customize Option)
              Whether to display the Python shell after sending something to it (default nil).

   Syntax Checking
       Whenever you save a file, Elpy will run a syntax check and highlight  possible  errors  or
       warnings inline.

       C-c C-n (elpy-flymake-next-error)

       C-c C-p (elpy-flymake-previous-error)
              You can navigate between any error messages with these keys. The current error will
              be shown in the minibuffer.

       Elpy uses the built-in Flymake library to find syntax errors on the fly, so see there  for
       more configuration options.

       C-c C-v (elpy-check)
              Alternatively,  you  can run a syntax check on the current file where the output is
              displayed in a new buffer, giving you an overview and allowing you to jump  to  the
              errors from there.

              With  a prefix argument, this will run the syntax check on all files in the current
              project.

       python-check-command (Customize Option)
              To change which command is used for syntax checks, you can customize  this  option.
              By default, Elpy uses the flake8 program, which you have to install separately. The
              elpy-config command will prompt you to do this if Elpy can't find the program.

              It is possible to create a single virtual env for the sole  purpose  of  installing
              flake8 in there, and then simply link the command script to a directory inside your
              PATH, meaning you do  not  need  to  install  the  program  in  every  virtual  env
              separately.

   Documentation
       Elpy provides a single interface to documentation.

       C-c C-d (elpy-doc)
              When  point  is  on  a  symbol,  Elpy  will try and find the documentation for that
              object, and display that. If it can't find the documentation for  whatever  reason,
              it will try and look up the symbol at point in pydoc. If it's not there, either, it
              will prompt the user for a string to look up in pydoc.

              With a prefix argument, Elpy will skip all the guessing and just  prompt  the  user
              for a string to look up in pydoc.

       If  the  autodoc  module  is  enabled  (not by default) the documentation is automatically
       updated with the symbol at point or the currently selected company candidate.

       elpy-autodoc-delay (Customize Option)
              The idle delay in seconds until documentation is updated automatically.

   Snippets
       Elpy uses yasnippet to provide code templates that helps writing  common  pieces  of  code
       faster.   You  can  access a template by typing a "template key" and hitting TAB to expand
       it.  You may then be asked to fill some fields in the template, just hit TAB when you  are
       done to proceed to the next field.

       The sequel presents a list of templates provided by Elpy.

   Special methods
       Elpy  provides  a  large range of templates for special class methods (__init__, __call__,
       __add__, ...).  To call them, simply type _ followed  by  the  method  name  (for  example
       _init) and hit TAB.

   Other useful snippetsenc: Encoding statement

       • env: Hashbang statement

       • from: Import statement

       • pdb: Snippet to run pdb at the current script position

       • super: Super statement to call parent methods

       • def: Function definition

       • class: Class definition

       • defs: Class method definition

   Debugging
       Elpy  provides an interface to pdb, the builtin Python debugger.  Note that this interface
       is only available for Emacs 25 and above.

       C-c C-u d (elpy-pdb-debug-buffer)
              Run  pdb  on  the  current  buffer.  If  no  breakpoints   has   been   set   using
              elpy-pdb-toggle-breakpoint-at-point,  the  debugger  will pause at the beginning of
              the buffer. Else, the debugger will pause at the  first  breakpoint.  Once  pdb  is
              started,  the  pdb  commands  can  be  used  to step through and look into the code
              evaluation.

              With a prefix argument  C-u,  ignore  the  breakpoints  and  always  pause  at  the
              beginning of the buffer.

       C-c C-u b (elpy-pdb-toggle-breakpoint-at-point)
              Add  (or  remove)  a  breakpoint on the current line. Elpy adds a red circle to the
              fringe  to  indicate  the  presence   of   a   breakpoint.   You   can   then   use
              elpy-pdb-debug-buffer to start pdb and pause at each of the breakpoints.

              With a prefix argument C-u, remove all the breakpoints.

       C-c C-u p (elpy-pdb-break-at-point)
              Run pdb on the current buffer and pause at the cursor position.

       C-c C-u e (elpy-pdb-debug-last-exception)
              Run post-mortem pdb on the last exception.

   Testing
       Testing is an important part of programming. Elpy provides a central interface to testing,
       which allows for a good workflow for tests.

       Elpy's test interface is built around Emacs' compilation framework.  Elpy  will  run  test
       commands as a compilation job, with all the advantages this brings.

       C-c C-t (elpy-test)
              Start  a  test  run. This uses the currently configured test runner to discover and
              run tests. If point is inside a test case, the test runner will  run  exactly  that
              test case. Otherwise, or if a prefix argument is given, it will run all tests.

       M-x elpy-set-test-runner
              This changes the current test runner. Elpy supports the standard unittest discovery
              runner, the Django discovery runner, nose, green, py.test and  Twisted  trial.  You
              can also write your own, as described in Writing Test Runners.

              Note on Django runners: Elpy tries to find manage.py within your project structure.
              If it's unable to find it, it falls back to  django-admin.py.   You  must  set  the
              environment variable DJANGO_SETTINGS_MODULE accordingly.

       This  enables a good workflow. You write a test and use C-c C-t to watch it fail. You then
       go to your implementation file, for example using C-u C-c C-f, and make the test pass. You
       can  use a key bound to recompile (I use <f5> for this) to just re-run that one test. Once
       that passes, you can use C-c C-t again to run all tests to make  sure  they  all  pass  as
       well. Repeat.

       For  an  even  more  automated  way,  you can use tdd.el, which will run your last compile
       command whenever you save a file.

   Refactoring
       C-c C-e (elpy-multiedit-python-symbol-at-point)
              Edit all occurrences of the symbol at point at once. This will highlight  all  such
              occurrences,  and  editing one of them will edit all. This is an easy way to rename
              identifiers.

              If the backend does not support finding occurrences (currently only Jedi does),  or
              if  a  prefix  argument  is  given, this will edit syntactic occurrences instead of
              semantic ones. This can match more occurrences than it should, so be  careful.  You
              can  narrow  the  current  buffer to the current function using C-x n d to restrict
              where this matches.

              Finally, if there is a region active, Elpy will edit all occurrences of the text in
              the region.

       C-c C-r f (elpy-format-code)
              Format code using the available formatter.

              This  command  formats code using the first formatter found amongst yapf , autopep8
              and black.  If a region is selected, only  that  region  is  formatted.   Otherwise
              current buffer is formatted.

              yapf  and  autopep8  can  be configured with style files placed in the project root
              directory (determined by elpy-project-root).

   Profiling
       Elpy allows one to profile python scripts asynchronously using cProfile.

       M-x elpy-profile-buffer-or-region
              Send the current buffer or region to the  profiler  and  display  the  result  with
              elpy-profile-visualizer.   The  default  visualizer  is  snakeviz,  a browser-based
              graphical  profile  viewer  that  can  be  installed  with  pip  install  snakeviz.
              RunSnakeRun  (Python-2  only  GTK  GUI)  and  pyprof2calltree  (uses QCacheGrind or
              KCacheGrind for display) are supported alternatives and can be similarly  installed
              with pip.

   Django
       Elpy  has  basic Django support such as parsing either manage.py or django-admin.py (If it
       does not  find  manage.py  it  falls  back  to  django-admin.py)  for  command  completion
       assistance.   Can  also  start  runserver automatically and you can give an ip address and
       port.

       C-c C-x c (elpy-django-command)
              Choose what command you'd like to run via  django-admin.py  or  manage.py.   Please
              note  that for compatibility reasons, the shell command will use python (instead of
              ipython by default).

       C-c C-x r (elpy-django-runserver)
              Start the development server command, runserver. Default  arguments  are  127.0.0.1
              for    ip    address    and   8000   for   port.   These   can   be   changed   via
              elpy-django-server-ipaddr and elpy-django-server-port.

CONCEPTS

   The RPC Process
       Elpy works by starting a Python process  in  the  background  and  communicating  with  it
       through  a basic Remote Procedure Call (RPC) interface. Ideally, you should never see this
       process and not worry about it, but when things don't work as expected, it's good to  know
       what's going on in the background.

       Every  project  and  virtual env combination gets their own RPC process.  You can see them
       both in the process list (M-x list-process) as well as in the buffer  list  (C-x  C-b)  as
       buffers named *elpy-rpc[...]*.

       RPC processes are used to provide code completion, documentation and other features. To do
       so, they use python packages (jedi, yapf, rope, ...)  that are installed  in  a  dedicated
       virtualenv  (.emacs.d/elpy/rpc-venv by default). Those packages can be updated through the
       configuration panel (accessible with M-x elpy-config).

       By default, Elpy will also find the library root of the current file and pass that to  the
       RPC  functions.  The  library  root  is  the  directory from which the current file can be
       imported.

       There are a few options and commands related to the RPC process.

       M-x elpy-rpc-restart
              Close all running RPC processes. Elpy will re-start them  on  demand  with  current
              settings.

       elpy-rpc-python-command (Customize Option)
              The  Python  interpreter  Elpy  should use to run the RPC process. This defaults to
              "python", which should be correct for most cases.

              Please do note that this is not an interactive interpreter, so do not set  this  to
              "ipython", "jupyter" or similar.

              As  the  RPC should be independent of any virtual environment, Elpy will try to use
              the system interpreter if  it  exists.  If  you  wish  to  use  a  specific  python
              interpreter  (from  a  virtual  environment  for  example),  set  this  to the full
              interpreter path.

       elpy-rpc-virtualenv-path (Customize Option)
              Path to the virtualenv used by the RPC.

              Can be 'default (create a  dedicated  virtualenv  .emacs.d/elpy/rpc-venv),  'system
              (use  the  system  environment), 'current (use the currently active environment), a
              virtualenv path or a function returning a virtualenv path.

              If the default virtual environment  does  not  exist,  it  will  be  created  using
              elpy-rpc-python-command    and    populated   with   the   needed   packages   from
              elpy-rpc--get-package-list.

       elpy-rpc-large-buffer-size (Customize Option)
              The size in character starting from which Elpy will transfer  buffer  contents  via
              temporary files instead of via the normal RPC mechanism.

              When  Elpy  communicates  with the RPC process, it often needs to tell Python about
              the contents of the current buffer. As the RPC protocol encodes all data  in  JSON,
              this  can  be  a  bit slow for large buffers. To speed things up, Elpy can transfer
              file contents in temporary files, which is  a  lot  faster  for  large  files,  but
              slightly slower for small ones.

       elpy-rpc-pythonpath (Customize Option)
              A directory to add to the PYTHONPATH for the RPC process.  This should point to the
              directory where the elpy module is installed. Usually, there is no need  to  change
              this.

   Backends
       For  introspection  and  analysis  of Python sources, Elpy mainly relies on Jedi, a python
       package for static code analysis.

       Due to the dynamic nature of python and its minimalist structure syntax, python  code  can
       be  difficult  to understand in certain situations.  Jedi documentation provides some tips
       to make jedi job easier.

   Virtual Envs
       Elpy has full support for Python's virtual envs. Every RPC process is  associated  with  a
       specific virtual env and completions are done based on that environment.

       Outside  of RPC processes, though, it is not easy to have more than one virtual env active
       at the same time. Elpy allows you to set  a  single  global  virtual  env  and  change  it
       whenever you like, though.

       M-x pyvenv-workon

       M-x pyvenv-activate

       M-x pyvenv-deactivate
              These  commands  are  the  main  interaction point with virtual envs, mirroring the
              normal activate and deactivate commands of virtual envs and the workon  command  of
              virtualenvwrapper.sh.

              The  pyvenv-workon  command will allow auto-completion of existing virtual envs and
              also supports virtualenvwrapper's setup hooks to set environment variables.

       Elpy won't pollute your Emacs command namespaces, but it might be an  idea  to  create  an
       alias for the workon command:

          (defalias 'workon 'pyvenv-workon)

   Modules
       As  the  last concept, Elpy has a number of optional features you can enable or disable as
       per your preferences.

       elpy-modules (Customize Option)
              The list of modules to activate by default. See the section on Writing Modules  for
              details on how to write your own modules.

EXTENDING ELPY

   Writing Modules
       Modules  are  a way of easily extending Elpy with modular extensions. In essence, a module
       is a function which is called once to initialize itself globally,  then  once  every  time
       elpy-mode is enabled or disabled, and also once if elpy is disabled globally.

       To  achieve  this, a module function receives one or more arguments, the first of which is
       the command specifier symbol, which can be one of the following:

       global-init
              Called once, when Elpy is enabled using elpy-enable.

       global-stop
              Called once, when Elpy is disabled using elpy-disable.

       buffer-init
              Called in a buffer when elpy-mode is enabled.

       buffer-stop
              Called in a buffer when elpy-mode is disabled.

       To activate a module, the user has to add the function to elpy-modules.

   Writing Test Runners
       A test runner is a function that receives four arguments, described in  the  docstring  of
       elpy-test-at-point. If only the first argument is given, the test runner should find tests
       under this directory and run them. If the others are given, the test runner should run the
       specified test only, or as few as it can.

       Test  runners should use an interactive spec of (interactive (elpy-test-at-point)) so they
       can be called directly by the user.  For their main work, they can use the helper function
       elpy-test-run. See the elpy-test-discover-runner for an example.

       To  make  it  possible  to  set  the  test  runner as a file-, directory- or project-local
       variable, the function symbol should get the elpy-test-runner property with a value of t.

   Running Tests:
       You can set up a working environment for Elpy using pip and cask. After  installing  Cask,
       create a new virtual environment and run the setup script in it:

          virtualenv ~/.virtualenvs/elpy
          source ~/.virtualenvs/elpy/bin/activate
          ./scripts/setup

       You can now run ./scripts/test to run Elpy's test suite.

       If you cannot (or do not want to) use virtual environments on your system, you can set the
       environment  variable  ELPY_TEST_DONT_USE_VIRTUALENV  to  skip  tests  involving   virtual
       environments: ELPY_TEST_DONT_USE_VIRTUALENV=t ./scripts/test.

CUSTOMIZATION TIPS

   Use flycheck instead of flymake
          (when (load "flycheck" t t)
            (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
            (add-hook 'elpy-mode-hook 'flycheck-mode))

   Enable emacs 26 flymake indicators in an otherwise light modeline
          (setq elpy-remove-modeline-lighter t)

          (advice-add 'elpy-modules-remove-modeline-lighter
                      :around (lambda (fun &rest args)
                                (unless (eq (car args) 'flymake-mode)
                                  (apply fun args))))

       See also the associated issue

   An alternative to elpy-goto-definition
       You  may  sometimes  find  when  you  try  to navigate to a function/class definition with
       elpy-goto-definition (M-.), that instead of jumping to the definition, you get the message
       "No  definition found". If you see this error often (because of the nature of the code you
       work  on),  you   can   use   the   following   function   instead   of/in   addition   to
       elpy-goto-definition:

          (defun elpy-goto-definition-or-rgrep ()
            "Go to the definition of the symbol at point, if found. Otherwise, run `elpy-rgrep-symbol'."
              (interactive)
              (ring-insert find-tag-marker-ring (point-marker))
              (condition-case nil (elpy-goto-definition)
                  (error (elpy-rgrep-symbol
                             (concat "\\(def\\|class\\)\s" (thing-at-point 'symbol) "(")))))

       This   function   will   try  to  find  the  definition  of  the  symbol  at  point  using
       elpy-goto-definition, but will do elpy-rgrep-symbol  instead, if the former function fails
       to  return  a result. You can bind this function to the key combination of your choice, or
       you can bind it to M-. to use it as a replacement  for  the  the  default  goto-definition
       function:

          (define-key elpy-mode-map (kbd "M-.") 'elpy-goto-definition-or-rgrep)

   Enable full font locking of inputs in the python shell
          (advice-add 'elpy-shell--insert-and-font-lock
                      :around (lambda (f string face &optional no-font-lock)
                                (if (not (eq face 'comint-highlight-input))
                                    (funcall f string face no-font-lock)
                                  (funcall f string face t)
                                  (python-shell-font-lock-post-command-hook))))

          (advice-add 'comint-send-input
                      :around (lambda (f &rest args)
                                (if (eq major-mode 'inferior-python-mode)
                                    (cl-letf ((g (symbol-function 'add-text-properties))
                                              ((symbol-function 'add-text-properties)
                                               (lambda (start end properties &optional object)
                                                 (unless (eq (nth 3 properties) 'comint-highlight-input)
                                                   (funcall g start end properties object)))))
                                      (apply f args))
                                  (apply f args))))

       See       details      in      https://github.com/jorgenschaefer/elpy/issues/1428      and
       https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32344.

FAQ

   Q: Can I tell elpy not to load one of the minor modes it enables by default?
       A: You can simply remove the appropriate symbol from elpy-modules.

   Q: How do I make Elpy work well with org-mode?
       A: You can try the following customization by @mankoff:

          (setq python-shell-interpreter "ipython"
                python-shell-interpreter-args "--pylab=osx --pdb --nosep --classic"
                python-shell-prompt-regexp ">>> "
                python-shell-prompt-output-regexp ""
                python-shell-completion-setup-code "from IPython.core.completerlib import module_completion"
                python-shell-completion-module-string-code "';'.join(module_completion('''%s'''))\n"
                python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")

       See #191 for a discussion and background.

   Q: Can I get documentation as pop-ups next to the completion pop-up?
       A: Not by default  with  company-mode,  but  there’s  expez’  excellent  company-quickhelp
       package you can install for this feature. It’s available from MELPA.

   Q: How to solve company, yasnippet conflicts?
       A: Add this snippet to your emacs configuration to avoid that.

          (defun company-yasnippet-or-completion ()
            "Solve company yasnippet conflicts."
            (interactive)
            (let ((yas-fallback-behavior
                   (apply 'company-complete-common nil)))
              (yas-expand)))

          (add-hook 'company-mode-hook
                    (lambda ()
                      (substitute-key-definition
                       'company-complete-common
                       'company-yasnippet-or-completion
                       company-active-map)))

   Q: How do I install development version of elpy?
       A: Remove existing elpy if you already installed it.

          rm -rf ~/.emacs.d/elpa/elpy*

       Install dependencies

          (package-install 'company)
          (package-install 'yasnippet)
          (package-install 'pyvenv)
          (package-install 'highlight-indentation)
          (package-install 's)

       Get latest code from github

          mkdir ~/Projects
          cd ~/Projects
          git clone https://github.com/jorgenschaefer/elpy

       Add the following to your ~/.emacs.d/init.el or ~/.emacs:

          (add-to-list 'load-path "~/Projects/elpy")
          (load "elpy" nil t)
          (elpy-enable)

       To update, run git pull --rebase, M-x load-library RET elpy RET and M-x elpy-rpc-reload.

       • genindex

       • search

AUTHOR

       Jorgen Schäfer

COPYRIGHT

       2020, Jorgen Schäfer