Skip to content
Python Development Emacs Environment
Emacs Lisp Python Shell HTML Common Lisp Ruby Other
Find file
Failed to load latest commit information.
Pymacs #11, which-function-mode sluggish
completion Urs Fleisch 2016-01-20 Fix test_pycomplete merged
devel Remove redundant
doc Docu updated
extensions #11, which-function-mode sluggish
obsolete Rope bindings moved from pdee-bindings.el into pdee-init.el
python-libs Starting to develop unittesting
scripts Further editing on
snippets/django Some yasnippets for Django templates (html-mode).
test `py-hide-indent', `py-show-indent'
.gitignore Remove redundant
.travis.yml travis again
COPYING added license
CREDITS py--create-new-shell sets py-exception-buffer incorrectly, lp:1456415
ChangeLog Updated readme and changelog with the new feature
EXTENSIONS keep just one PDEE main directory
INSTALL keep just one PDEE main directory
INSTALL-INFO-FILES info-lookup-symbol, lp:1281950
IPYTHON keep just one PDEE main directory
NEWS `py-hide-indent', `py-show-indent' `py-split-window-on-execute-p' renamed `py-split-window-on-execute' added Provide Richard Stanton's comment at py-ert-function-tests.el rewrite extended `py-fast-process' fixed Remove redundant
auto-complete-pycomplete.el keep just one PDEE main directory #11, which-function-mode sluggish
company-pycomplete.el keep just one PDEE main directory
index.docbook keep just one PDEE main directory
makeElpa renamed: Makefile -> makeElpa
pdee-completion.el Don't add hooks that operate on non-existent variables
pdee-editing.el fixes issue #29
pdee-init.el wrong-coloring, lp:1315186
pdee-pkg.el Add package metadata files for ELPA packkage format and Marmalade add…
pycomplete+.el keep just one PDEE main directory #11, which-function-mode sluggish
pymacs.el Reduce compiler warnings
python-abbrev-propose.el #11, which-function-mode sluggish
python-components-auto-fill.el auto-fill fixed
python-components-backward-forms.el Handle multiple decorators
python-components-beginning-forms.el Some cleanup
python-components-beginning-position-forms.el `py-hide-indent', `py-show-indent'
python-components-booleans-beginning-forms.el `py-hide-indent', `py-show-indent'
python-components-booleans-end-forms.el #1, select by indentation
python-components-bounds-forms.el Some cleanup
python-components-comment.el #1, `py-comment-indent', new command
python-components-completion_flymake.el remove obsolete, risky forms
python-components-copy-forms.el `py-hide-indent', `py-show-indent'
python-components-copy.el Set `py-install-directory' if empty
python-components-create-menu.el Menu updated
python-components-dedicated-shells.el keep just one PDEE main directory
python-components-delete-forms.el #1, select by indentation
python-components-delete.el email updated
python-components-edit.el #13, fill-paragraph with raw docstring
python-components-electric.el `py-python-shell-mode', use current process
python-components-end-forms.el Some cleanup
python-components-end-position-forms.el #1, `py-comment-indent', new command
python-components-exec-forms.el executes reconsidered
python-components-execute-file.el email updated
python-components-execute-region.el Execute-region forms reconsidered
python-components-execute.el lp:1519859, provide `indent-rigidly-pop-undo', backward compatibility
python-components-extensions.el Unused `py--match-paren-indented-empty' removed
python-components-fast-complete.el py-help-at-point should close buffer , #4
python-components-fast-forms.el `py-fast-process' fixed
python-components-foot.el #17, derive from `prog-mode'
python-components-forms-code.el #1, select by indentation
python-components-forms.el Some alias moved into python-components-foot.el
python-components-forward-forms.el `py--beginning-of-line-form', hand over argument erg
python-components-help.el #13, fill-paragraph with raw docstring
python-components-hide-show.el `py-hide-indent', `py-show-indent'
python-components-imenu.el email updated
python-components-intern.el #1, `py-comment-indent', new command
python-components-kill-forms.el Menu docstrings minor-fix
python-components-mark-forms.el #1, select by indentation
python-components-menu.el Menu fixed
python-components-misc-forms.el `py-beginning-of-for-block', lp:1367424
python-components-mode.el #13, fill-paragraph with raw docstring
python-components-move.el #1, `py-comment-indent', new command
python-components-named-shells.el Revert "Revert "Named shell window-management, fixed""
python-components-narrow.el Set `py-install-directory' if empty
python-components-paragraph.el #13, fill-paragraph with raw docstring
python-components-pdb.el with-current-buffer vs. set-buffer issues
python-components-re-forms.el Some cleanup
python-components-section-forms.el email updated
python-components-send.el Set `py-install-directory' if empty
python-components-shell-complete.el `py-indent-or-complete' , lp:1508179
python-components-shell-menu.el email updated
python-components-shift-forms.el `py-shift-indent-left', `py-shift-indent-right'
python-components-switches.el Reduce compiler warnings
python-components-unified-completion.el keep just one PDEE main directory
python-components-up-down.el #1, select by indentation
python-components-versioned.el * beg-end.el: again
python-components-virtualenv.el Redundant definitions removed
python-dedicated-shells.el keep just one PDEE main directory
python-edit-forms.el `py-beginning-of-for-block', lp:1367424
python-end-forms.el `py-beginning-of-for-block', lp:1367424
python-extended-executes.el #1, select by indentation keep just one PDEE main directory
python-mode-send.el keep just one PDEE main directory
python-mode-utils.el keep just one PDEE main directory
python-named-shells.el keep just one PDEE main directory
python-shell-complete.el keep just one PDEE main directory
python-shell-install-example-buffer.el keep just one PDEE main directory minor change #11, which-function-mode sluggish
thing-at-point-utils.el keep just one PDEE main directory
thingatpt-python-expressions.el keep just one PDEE main directory
thingatpt-utils-base.el keep just one PDEE main directory


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)

Selecting a Python shell:

Customize default Python shell as `py-shell-name’

`py-shell-name’ might be an installed default executable as shell command `type’ would display, but also a PATH/TO/EXECUTABLE

If different flavours of Python are installed, customize py-python-command - python2 py-python3-command py-ipython-command

py-python-command-args py-python3-command-args py-ipython-command-args

You might run code by another installed (I)Python-version than default.

Normally this would happen if a shebang in buffer specifies it. Shebang precedes default py-shell-name.

In case you will run code by default-shell, ignoring shebang, set `py-force-py-shell-name-p’ to. This might be done also via menu Python/…/Switches

Another way to enforce a different shell is specifiyng a path –interactively C-u prompts for that– or using commands which end in version like `py-execute-statement-python3’ See menu Python/Interpreter/Other/Ignoring Defaults

Invoking an (I)Python interactive shell

Commands related to a specific shell start with it’s name as `ipython-complete’. Open an installed shell by


This calls py-shell with its default arguments


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))

Invoking versioned Python shells in interactive mode:

M-x py-shell RET ==> ”Python” M-x python RET ==> ”Python” M-x ipython RET ==> ”IPython” M-x python3 RET ==> ”Python3

When Path/To/Executable is given C-u python RET ==> ”PTE Python

Prefix conventions

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-’

Execution code

Python code might be processed by an

  • interactive Python shell (DEFAULT)
  • non-interactive Python (`py-fast-process-p’) The latter, while design for large output, seems more reliable - see also

Both processes might run in

  • session, i.e. start from possible previous state (DEFAULT)
  • dedicated, (`py-dedicated-process-p’) run in separate process

There is also

  • python-mode-v5-behavior


Access is provided to a couple of known checkers like Flake8, pep8, pylint Need to be installed for example calling “pip install pep8” from a shell command-line Get flycheck from

Displaying Output

`py-execute-…’-commands arrive in buffer created by `py-shell’. It’s name is composed WRT to Python version used, it’s path etc.

Result of commands ending “-fast” arrives in `py-fast-output-buffer’

Window management

Variables in question:

** py-keep-windows-configuration

Default is nil. When non-nil, it takes precedence over `py-split-window-on-execute’ and `py-switch-buffers-on-execute-p’ settings

Useful, if a pre-designed set of python-shells/buffers should be maintained

** py-split-window-on-execute

When non-nil split windows according to value set.

Default is ‘just-two: when code is send to interpreter, split screen into source-code buffer and current py-shell result. Other buffers will be hidden that way.

When set to `t’, python-mode tries to reuse existing windows and will split only if needed.

With ‘always, results will displayed in a new window.

** py-switch-buffers-on-execute-p

Put focus into the output buffer: this will display buffer in any case


At the end of a word TAB by default calls completion.

Auto-completion should be available via

(require ‘auto-complete-config) (ac-config-default)

or for company:

(autoload ‘company-mode “company” nil t)

There is also a Pymacs based auto-completion mode see

Either use Pymacs and `company-mode’ with `pycomplete.el’ etc. –load stuff from folder completion–

or switch `py-auto-completion-mode-p’ - which relies on `py-shell-complete’, i.e. calls the current Python process.

Extern tools like jedi-server/mode should work too.


Beside common moves like `defun’, `statement’, block called via py-end-of-…, py-beginning-… 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


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

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.


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

** pdb doesn’t work at Windows Richard Stanton commented:

Running M-x pdb doesn’t work on my Windows machine, primarily because Windows (at least using the default shell) doesn’t automatically know what to do when you give it a .py command at the command line.

For example, here’s the suggested command when I run pdb on a file c:\projects/


If I accept this, I get an error “Spawning child process: Invalid argument”

A work-around to get it to work is to replace the suggested command with

c:\python27\python -i c:/python27/Lib/ c:/projects/

(note that I not only have to add the python command, but also fully qualify the script file, since otherwise it complains it can’t find the file).

Something went wrong with that request. Please try again.