.. _tricked_out_emacs:

===================================
Tricked out emacs for python coding
===================================

Various ways to configure your emacs that you might find useful.

See emacs_python_mode_ for a good summary.

.. _rst_emacs:

ReST mode
---------

For editing ReST documents like this one.  You may need a recent
version of the rst.el_ file from the docutils_ site.

.. _rst.el: http://docutils.sourceforge.net/tools/editors/emacs/rst.el

``rst`` mode automates many important ReST tasks like building and updating
table-of-contents, and promoting or demoting section headings.  Here
is the basic ``.emacs`` configuration::

    (require 'rst)
    (setq auto-mode-alist
          (append '(("\\.txt$" . rst-mode)
                    ("\\.rst$" . rst-mode)
                    ("\\.rest$" . rst-mode)) auto-mode-alist))

Some helpful functions::

    C-c TAB - rst-toc-insert

      Insert table of contents at point

    C-c C-u - rst-toc-update

        Update the table of contents at point

    C-c C-l rst-shift-region-left

        Shift region to the left

    C-c C-r rst-shift-region-right

        Shift region to the right

.. note::

   On older Debian-based releases, the default ``M-x rst-compile`` command
   uses ``rst2html.py`` whereas the command installed is ``rst2html``.
   Symlink was required as a quick fix.


doctest mode
-------------

This useful mode for writing doctests (``doctest-mode.el``) cames with
``python-mode`` package on Debian-based systems.  Otherwise see doctest-mode_ project page.

code checkers
-------------

Code checkers within emacs can be useful to check code for errors,
unused variables, imports and so on.  Alternatives are pychecker_,
pylint_ and pyflakes_. Note that rope_ (below) also does some code
checking.  pylint_ and pyflakes_ work best with emacs flymake_,
which usually comes with emacs.

pychecker_
``````````

This appears to be plumbed in with ``python-mode``, just do ``M-x
py-pychecker-run``.  If you try this, and pychecker_ is not installed,
you will get an error.  You can install it using your package manager
(``pychecker`` on Debian-based systems) or from the pychecker_ webpage.

pylint_
```````

Install pylint_.  Debian packages pylint_ as ``pylint``. Put the
`flymake .emacs snippet`_ in your ``.emacs`` file.  You will see, in the
emacs_python_mode_ page, that you will need to save this::

    #!/usr/bin/env python3
    
    import re
    import sys
    
    from subprocess import *
    
    p = Popen("pylint -f parseable -r n --disable-msg-cat=C,R %s" %
              sys.argv[1], shell = True, stdout = PIPE).stdout
    
    for line in p.readlines():
        match = re.search("\\[([WE])(, (.+?))?\\]", line)
        if match:
            kind = match.group(1)
            func = match.group(3)

	    if kind == "W":
	       msg = "Warning"
	    else:
	       msg = "Error"
    
            if func:
                line = re.sub("\\[([WE])(, (.+?))?\\]",
                              "%s (%s):" % (msg, func), line)
            else:
                line = re.sub("\\[([WE])?\\]", "%s:" % msg, line)
        print line,
    
    p.close()

as ``epylint`` somewhere on your system path, and test that ``epylint
somepyfile.py`` works.

pyflakes
````````
Install pyflakes_.  Maybe your package manager again? (``apt-get
install pyflakes``).  Install the `flymake .emacs snippet`_ in your
``.emacs`` file. 

flymake .emacs snippet
``````````````````````

Add this to your .emacs file::

  ;; code checking via flymake
  ;; set code checker here from "epylint", "pyflakes"
  (setq pycodechecker "pyflakes")
  (when (load "flymake" t)
    (defun flymake-pycodecheck-init ()
      (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))))
	(list pycodechecker (list local-file))))
    (add-to-list 'flymake-allowed-file-name-masks
		 '("\\.py\\'" flymake-pycodecheck-init)))

and set which of pylint_ ("epylint") or pyflakes_ ("pyflakes") you
want to use.

You may also consider using the ``flymake-cursor`` functions, see the
``pyflakes`` section of the emacs_python_mode_ page for details.

ropemacs_
---------

rope_  is a python refactoring library, and ropemacs_ is an emacs
interface to it, that uses pymacs_.  pymacs_ is an interface between
emacs lisp and python that allows emacs to call into python and python
to call back into emacs.

Install
````````
- rope_ - by downloading from the link, and running ``python setup.py
  install`` in the usual way.
- pymacs_ - probably via your package manager - for example ``apt-get
  install pymacs``
- ropemacs_ - download from link, ``python setup.py install``

You may need to make sure your gnome etc sessions have the correct
python path settings - for example settings in ``.gnomerc`` as well as
the usual ``.bashrc``.

Make sure you can `import ropemacs` from python (which should drop you
into something lispey).  Add these lines somewhere in your `.emacs` file::

  (require 'pymacs)
  (pymacs-load "ropemacs" "rope-")

and restart emacs.  When you open a python file, you should have a
``rope`` menu. Note `C-c g` - the excellent `goto-definition` command.

Switching between modes
-----------------------

You may well find it useful to be able to switch fluidly between
python mode, doctest mode, ReST mode and flymake mode (pylint_).  You
can attach these modes to function keys in your ``.emacs`` file with
something like::

  (global-set-key [f8]      'flymake-mode)
  (global-set-key [f9]      'python-mode)
  (global-set-key [f10]      'doctest-mode)
  (global-set-key [f11]      'rst-mode)


emacs code browser
------------------

Not really python specific, but a rather nice set of windows for
browsing code directories, and code - see the ECB_ page.  Again, your
package manager may help you (``apt-get install ecb``).

.. include:: ../../links_names.txt
