# Python contribution layer for Spacemacs ![logo_python](img/python.png) ![logo_django](img/django.png) **Table of Contents** - [Python contribution layer for Spacemacs](#python-contribution-layer-for-spacemacs) - [Description](#description) - [Install](#install) - [Layer](#layer) - [Anaconda dependencies](#anaconda-dependencies) - [Automatic buffer formatting on save](#automatic-buffer-formatting-on-save) - [autoflake](#autoflake) - [Key Bindings](#key-bindings) - [Inferior REPL process](#inferior-repl-process) - [Running Python Script in shell](#running-python-script-in-shell) - [Testing in Python](#testing-in-python) - [Refactoring](#refactoring) - [Other Python commands](#other-python-commands) - [Django](#django) - [Fabric](#fabric) - [Files](#files) - [Interactive](#interactive) - [Server](#server) - [South/Syncdb](#southsyncdb) - [Test](#test) ## Description This layer adds support for the Python language. Features: - Auto-completion using [anaconda-mode][] - Code Navigation using [anaconda-mode][] - Documentation Lookup using [anaconda-mode][] and [pylookup][] - Test Runner using [nose.el][] - Virtual Environment using [pyvenv][] and [pyenv][] - semantic mode is enabled - Django support via [pony-mode][] - PEP8 compliant formatting via [YAPF][] - Suppression of unused import with [autoflake][] ## Install ### Layer To use this contribution add it to your `~/.spacemacs` ```elisp (setq-default dotspacemacs-configuration-layers '(python)) ``` ### 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: Blocking call to accept-process-output with quit inhibited!! To fix this, install the `anaconda-mode` [dependencies][anaconda-deps] by hand: pip install jedi==0.8.1 json-rpc==1.8.1 service_factory==0.1.2 Source: https://github.com/proofit404/anaconda-mode#issues ### Automatic buffer formatting on save To enable automatic buffer formatting on save with [YAPF][] set the variable `python-enable-yapf-format-on-save` to `t`. ```elisp (setq-default dotspacemacs-configuration-layers '( (python :variables python-enable-yapf-format-on-save t))) ``` ### autoflake To be able to suppress unused imports easily, install [autoflake][]: ```sh pip install autoflake ``` ## 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` **Note** With the universal argument SPC u you can enter a new compilation command. ### Testing in Python `Spacemacs` uses [nose][nose] as a test runner. An improved version of [nose.el][nose.el] is shipped with `Spacemacs`, this version adds: - windows support - test suite support The root of the project is detected with a `.git` directory or a `setup.cfg` file. Test commands (start with m t or m T): 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 SPC m t t | launch the current test (function) Debug | Description ---------------------|------------------------------------------------------------ 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 SPC m T t | launch the current test (function) in debug mode ### Refactoring Key Binding | Description ----------------------|------------------------------------------------------------ SPC m r i | remove unused imports with [autoflake][] ### Other Python commands Key Binding | Description ----------------------|------------------------------------------------------------ SPC m = | Reformat the buffer according to PEP8 using [YAPF][] SPC m d b | toggle a breakpoint SPC m g g | go to definition using `anaconda-mode-goto` (C-o to jump back) SPC m h d | look for documentation using `helm-pydoc` SPC m h h | quick documentation using anaconda SPC m h H | open documentation in `firefox` using [pylookup][pylookup] SPC m v | activate a virtual environment with [pyenv][pyenv] SPC m V | activate a virtual environment with [pyvenv][pyvenv] ### Django Django related key bindings uses [pony-mode][] and are behind the prefix SPC m j. Configuration options for pony-mode are documented at [deadpansincerity.com](http://www.deadpansincerity.com/docs/pony/configuration.html) Manage Django with SPC m j m. #### Fabric Key Binding | Description ----------------------|------------------------------------------------------------ mjaf | Run a fabric command mjad | Deploy project with `fab deploy` #### Files Key Binding | Description ----------------------|------------------------------------------------------------ mjfs | Open the `settings.py` for this project mjfc | Interactively display a setting value in the minibuffer mjft | Jump to template at point mjfr | Jump to the view file that the URL resolves to (experimental) #### Interactive Key Binding | Description ----------------------|------------------------------------------------------------ mjid | Run interpreter for this project's default database as an inferior process mjis | Open a Python shell with the current pony project's context loaded. If the project has the django_extras package installed, then use the excellent `shell_plus` command. Otherwise, fall back to `manage.py shell` #### Server Key Binding | Description ----------------------|------------------------------------------------------------ mjrd | Stop the dev server mjro | Open a tab at the dev server mjrr | Restart the dev server (works better with django_extras/werkzeug) mjru | Start or open the dev server mjrt | Open a second server with a "throwaway" host/port #### South/Syncdb Key Binding | Description ----------------------|------------------------------------------------------------ mjsc | Convert an existing app to south mjsh | Create migration for modification mjsi | Run the initial south migration for an app mjsm | Migrate an app mjss | Run syncdb on the current project #### Test Key Binding | Description ----------------------|------------------------------------------------------------ mjtd | Move down the traceback one level mjte | Go to the file and line of the last stack trace in a test buffer mjto | Open the file in a traceback at the line specified mjtt | Run the test(s) given by `command` mjtu | Move up the traceback one level [anaconda-mode]: https://github.com/proofit404/anaconda-mode [pyvenv]: https://github.com/jorgenschaefer/pyvenv [pyenv]: https://github.com/yyuu/pyenv [pylookup]: https://github.com/tsgates/pylookup [nose]: https://github.com/nose-devs/nose/ [nose.el]: https://github.com/syl20bnr/nose.el [pony-mode]: https://github.com/davidmiller/pony-mode [anaconda-deps]: https://github.com/proofit404/anaconda-mode/blob/master/requirements.txt [YAPF]: https://github.com/google/yapf [autoflake]: https://github.com/myint/autoflake