2015-12-02 14:23:39 +00:00
#+TITLE : Python layer
2015-11-08 18:04:44 +00:00
#+HTML_HEAD_EXTRA : <link rel="stylesheet" type="text/css" href="../../../css/readtheorg.css" />
2015-06-10 16:44:30 +00:00
2015-07-04 03:52:33 +00:00
[[file:img/python.png ]]
2015-06-10 16:44:30 +00:00
2015-10-30 11:20:58 +00:00
* Table of Contents :TOC_4_org:noexport:
- [[Description ][Description ]]
2016-01-06 19:48:18 +00:00
- [[Features ][Features ]]
2015-10-30 11:20:58 +00:00
- [[Install ][Install ]]
- [[Layer ][Layer ]]
- [[Test runner ][Test runner ]]
- [[Anaconda dependencies ][Anaconda dependencies ]]
- [[Automatic buffer formatting on save ][Automatic buffer formatting on save ]]
- [[autoflake ][autoflake ]]
- [[pylookup ][pylookup ]]
2016-01-06 19:48:18 +00:00
- [[Management of Python versions and virtual environments ][Management of Python versions and virtual environments ]]
- [[Manage virtual environments with pyvenv ][Manage virtual environments with pyvenv ]]
- [[Manage multiple Python versions with pyenv ][Manage multiple Python versions with pyenv ]]
- [[Automatic activation of local pyenv version ][Automatic activation of local pyenv version ]]
2015-10-30 11:20:58 +00:00
- [[Key Bindings ][Key Bindings ]]
- [[Inferior REPL process ][Inferior REPL process ]]
- [[Running Python Script in shell ][Running Python Script in shell ]]
- [[Testing ][Testing ]]
- [[Refactoring ][Refactoring ]]
2015-10-29 08:42:37 +00:00
- [[Live coding ][Live coding ]]
2015-10-30 11:20:58 +00:00
- [[Other Python commands ][Other Python commands ]]
- [[Configuration ][Configuration ]]
- [[Fill column ][Fill column ]]
2015-06-10 16:44:30 +00:00
* Description
This layer adds support for the Python language.
2016-01-06 19:48:18 +00:00
** Features
2015-06-19 18:05:13 +00:00
- Auto-completion using [[https://github.com/proofit404/anaconda-mode ][anaconda-mode ]]
- Code Navigation using [[https://github.com/proofit404/anaconda-mode ][anaconda-mode ]]
2015-06-10 16:44:30 +00:00
- Documentation Lookup using [[https://github.com/proofit404/anaconda-mode ][anaconda-mode ]] and [[https://github.com/tsgates/pylookup ][pylookup ]]
- Test Runners using [[https://github.com/syl20bnr/nose.el ][nose.el ]] or [[https://github.com/ionrock/pytest-el ][pytest ]]
- Virtual Environment using [[https://github.com/jorgenschaefer/pyvenv ][pyvenv ]] and [[https://github.com/yyuu/pyenv ][pyenv ]]
- semantic mode is enabled
- PEP8 compliant formatting via [[https://github.com/google/yapf ][YAPF ]]
- Suppression of unused import with [[https://github.com/myint/autoflake ][autoflake ]]
2015-09-21 00:56:37 +00:00
- Use the ~%~ key to jump between blocks with [[https://github.com/redguardtoo/evil-matchit ][evil-matchit ]]
2015-06-10 16:44:30 +00:00
2015-10-30 11:20:58 +00:00
* Install
2015-06-10 16:44:30 +00:00
** Layer
2016-01-06 05:21:55 +00:00
To use this configuration layer, add it to your =~/.spacemacs= . You will need to
add =python= to the existing =dotspacemacs-configuration-layers= list in this
file.
2015-06-10 16:44:30 +00:00
** Test runner
Both =nose= and =pytest= are supported. By default =nose= is used.
To choose your test runner set the layer variable =python-test-runner= to
either =nose= or =pytest= .
The root of the project is detected with a =.git= directory or a =setup.cfg= file.
#+BEGIN_SRC emacs-lisp
(setq-default dotspacemacs-configuration-layers
'((python :variables python-test-runner 'pytest)))
#+END_SRC
** Anaconda dependencies
=anaconda-mode= tries to install the dependencies itself but sometimes
it does not work and you may encounter the following message when
opening a python buffer:
2015-10-30 11:20:58 +00:00
#+begin_example
2015-06-10 16:44:30 +00:00
Blocking call to accept-process-output with quit inhibited!!
2015-10-30 11:20:58 +00:00
#+end_example
2015-06-10 16:44:30 +00:00
To fix this, install the =anaconda-mode= [[https://github.com/proofit404/anaconda-mode/blob/master/requirements.txt ][anaconda-deps ]] by hand:
#+begin_src sh
pip install jedi==0.8.1 json-rpc= =1.8.1 service_factory= =0.1.2
#+end_src
Source: https://github.com/proofit404/anaconda-mode#issues
2015-06-19 18:05:13 +00:00
If you are facing errors such as "Unable to run anaconda-mode server", try
setting your ~PYTHONPATH~ as explained at
https://github.com/proofit404/anaconda-mode#pythonpath
2015-06-23 03:16:30 +00:00
2015-06-10 16:44:30 +00:00
** Automatic buffer formatting on save
To enable automatic buffer formatting on save with [[https://github.com/google/yapf ][YAPF ]] set the variable
=python-enable-yapf-format-on-save= to =t= .
#+BEGIN_SRC emacs-lisp
(setq-default dotspacemacs-configuration-layers '(
(python :variables python-enable-yapf-format-on-save t)))
#+END_SRC
** autoflake
To be able to suppress unused imports easily, install [[https://github.com/myint/autoflake ][autoflake ]]:
#+BEGIN_SRC sh
pip install autoflake
#+END_SRC
2015-10-06 10:18:33 +00:00
** pylookup
To use =pylookup= on ~SPC m h H~ , make sure you update the database first, using
2016-02-07 13:39:54 +00:00
~SPC SPC pylookup-update~ .
2015-10-06 10:18:33 +00:00
2016-01-06 19:48:18 +00:00
* Management of Python versions and virtual environments
** Manage virtual environments with pyvenv
A virtual environment provides isolation of your Python package versions. For a
general overview see [[http://docs.python-guide.org/en/latest/dev/virtualenvs/ ][this site ]]. [[http://virtualenvwrapper.readthedocs.org/en/latest/index.html ][Virtualenvwrapper ]] which is also explained in the
previous link, is a program which manages your virtual environments in a central
location set by the ~WORKON_HOME~ environment variable.
Spacemacs integration of virtual environments and virtualenvwrapper is provided
by the [[https://github.com/jorgenschaefer/pyvenv ][pyvenv ]] package. It provides the following keybindings:
| Key Binding | Description |
|-------------+-------------------------------------------------|
| ~SPC m V a~ | activate a virtual environment in any directory |
| ~SPC m V d~ | deactivate active virtual environment |
2016-01-09 03:37:35 +00:00
| ~SPC m V w~ | work on virtual environment in ~WORKON_HOME~ |
2016-01-06 19:48:18 +00:00
** Manage multiple Python versions with pyenv
If you need multiple Python versions (e.g. Python 2 and Python 3) then take a
look at [[https://github.com/yyuu/pyenv ][pyenv ]]. It enables the installation and managment of multiple
Python versions.
[[https://www.brianthicks.com/2015/04/10/pyenv-your-python-environment-automated/ ][This blogpost ]] gives a good overview on how to use the tool. Spacemacs
integration is provided by [[https://github.com/proofit404/pyenv-mode ][pyenv mode ]] which has the following keybindings.
| Key Binding | Description |
|-------------+--------------------------------------|
| ~SPC m v s~ | set a pyenv environment with [[https://github.com/yyuu/pyenv][pyenv]] |
| ~SPC m v u~ | unset a pyenv environment with [[https://github.com/yyuu/pyenv][pyenv]] |
Pyenv can also manage virtual environments for each of the Python versions it
has installed. Those will be listed alongside your Python versions.
*** Automatic activation of local pyenv version
A project-specific pyenv version may be written to a file called
2016-01-25 23:00:19 +00:00
=.python-version= using the [[https://github.com/yyuu/pyenv/blob/master/COMMANDS.md#pyenv-local ][pyenv local ]] command.
2016-01-06 19:48:18 +00:00
Spacemacs can search in parent directories for this file, and automatically set
the pyenv version. The behavior can be set with the variable
=python-auto-set-local-pyenv-version= to:
- =on-visit= (default) set the version when you visit a python buffer,
- =on-project-switch= set the version when you switch projects,
- =nil= to disable.
2015-06-10 16:44:30 +00:00
* Key Bindings
** Inferior REPL process
Start a Python or iPython inferior REPL process with ~SPC m s i~ .
If =ipython= is available in system executable search paths, =ipython=
will be used to launch python shell; otherwise, default =python=
interpreter will be used. You may change your system executable
search path by activating a virtual environment.
Send code to inferior process commands:
| Key Binding | Description |
|-------------+-------------------------------------------------|
| ~SPC m s b~ | send buffer and keep code buffer focused |
| ~SPC m s B~ | send buffer and switch to REPL in insert mode |
| ~SPC m s f~ | send function and keep code buffer focused |
| ~SPC m s F~ | send function and switch to REPL in insert mode |
| ~SPC m s i~ | start inferior REPL process |
| ~SPC m s r~ | send region and keep code buffer focused |
| ~SPC m s R~ | send region and switch to REPL in insert mode |
| ~CTRL+j~ | next item in REPL history |
| ~CTRL+k~ | previous item in REPL history |
** Running Python Script in shell
To run a Python script like you would in the shell press ~SPC m c c~
to start the Python script in comint mode. This is useful when working with
multiple Python files since the REPL does not reload changes made in other
modules.
| Key Binding | Description |
|-------------+---------------------------------------------------------------------------|
| ~SPC m c c~ | Execute current file in a comint shell |
| ~SPC m c C~ | Execute current file in a comint shell and switch to it in =insert state= |
2015-06-10 21:16:01 +00:00
*Note:* With the universal argument ~SPC u~ you can enter a new
2015-06-10 16:44:30 +00:00
compilation command.
** Testing
2015-10-27 10:15:36 +00:00
Test commands start with ~m t~ :
2015-06-10 16:44:30 +00:00
| No Debug | Description |
|-------------+----------------------------------------------------------|
| ~SPC m t a~ | launch all tests of the project |
| ~SPC m t b~ | launch all tests of the current buffer (same as module) |
| ~SPC m t m~ | launch all tests of the current module |
| ~SPC m t s~ | launch all tests of the current suite (only with =nose=) |
| ~SPC m t t~ | launch the current test (function) |
| Debug | Description |
|-------------+------------------------------------------------------------------------|
2015-08-25 01:23:48 +00:00
| ~SPC m t A~ | launch all tests of the project in debug mode |
| ~SPC m t B~ | launch all tests of the current buffer (module) in debug mode |
| ~SPC m t M~ | launch all tests of the current module in debug mode |
| ~SPC m t S~ | launch all tests of the current suite in debug mode (only with =nose=) |
| ~SPC m t T~ | launch the current test (function) in debug mode |
2015-06-10 16:44:30 +00:00
** Refactoring
| Key Binding | Description |
|-------------+--------------------------------------|
| ~SPC m r i~ | remove unused imports with [[https://github.com/myint/autoflake][autoflake]] |
2015-10-29 08:42:37 +00:00
** Live coding
Live coding is provided by the [[https://github.com/donkirkby/live-py-plugin ][live-py-plugin. ]]
| Key Binding | Description |
|-------------+---------------------|
| ~SPC m l~ | Toggle live-py-mode |
2015-06-10 16:44:30 +00:00
** Other Python commands
2015-09-07 20:13:42 +00:00
| Key Binding | Description |
|-------------+------------------------------------------------------------------------------|
| ~SPC m =~ | Reformat the buffer according to PEP8 using [[https://github.com/google/yapf][YAPF]] |
| ~SPC m d b~ | toggle a breakpoint |
| ~SPC m g g~ | go to definition using =anaconda-mode-find-definitions= (~C-o~ to jump back) |
| ~SPC m g a~ | go to assignment using =anaconda-mode-find-assignments= (~C-o~ to jump back) |
2015-11-25 09:21:44 +00:00
| ~SPC m g b~ | jump back |
2015-09-07 20:13:42 +00:00
| ~SPC m g u~ | navigate between usages with =anaconda-mode-find-references= |
| ~SPC m h d~ | look for documentation using =helm-pydoc= |
| ~SPC m h h~ | quick documentation using anaconda |
2015-10-18 18:13:11 +00:00
| ~SPC m h H~ | open documentation in =firefox= using [[https://github.com/tsgates/pylookup][pylookup]] |
2016-01-06 19:48:18 +00:00
| ~SPC m v s~ | set a pyenv environment with [[https://github.com/yyuu/pyenv][pyenv]] |
| ~SPC m v u~ | unset a pyenv environment with [[https://github.com/yyuu/pyenv][pyenv]] |
| ~SPC m V w~ | work on virtual environment in ~WORKON_HOME~ |
| ~SPC m V a~ | activate a virtual environment in any directory |
| ~SPC m V d~ | deactivate active virtual environment |
2015-09-21 23:29:23 +00:00
* Configuration
** Fill column
2016-01-06 19:48:18 +00:00
If you want to customize the fill column value, use something like this inside
the ~user-init~ function in your ~.spacemacs~ :
2015-09-21 23:29:23 +00:00
#+BEGIN_SRC elisp
(setq python-fill-column 99)
#+END_SRC