.. role:: code(strong)
.. role:: file(literal)

================================
A simple example of Pymacs usage
================================

.. contents::
.. sectnum::

This page documents the :file:`contrib/Winkler/` subdirectory of the
Pymacs distribution.

The problem
===========

This problem has been submitted by Paul Winkler, and the text below has
been reformatted from our email exchanges.

Let's say I have a module, call it :file:`manglers.py`, containing this
simple python function::

  def break_on_whitespace(some_string):
      words = some_string.split()
      return '\n'.join(words)

The goal is telling Emacs about this function so that I can call it on a
region of text and replace the region with the result of the call.  And
bind this action to a key, of course, let's say :code:`[f7]`.

The Emacs buffer ought to be handled in some way.  If this is not on the
Emacs Lisp side, it has to be on the Python side, but we cannot escape
handling the buffer.  So, there is an equilibrium in the work to do for
the user, that could be displaced towards Emacs Lisp or towards Python.

Python side
===========

Here is a first draft for the Python side of the problem::

  from Pymacs import lisp

  def break_on_whitespace():
      start = lisp.point()
      end = lisp.mark(True)
      if start > end:
          start, end = end, start
      text = lisp.buffer_substring(start, end)
      words = text.split()
      replacement = '\n'.join(words)
      lisp.delete_region(start, end)
      lisp.insert(replacement)

  interactions = {break_on_whitespace: ''}

For various stylistic reasons, this could be rewritten into::

  from Pymacs import lisp
  interactions = {}

  def break_on_whitespace():
      start, end = lisp.point(), lisp.mark(True)
      words = lisp.buffer_substring(start, end).split()
      lisp.delete_region(start, end)
      lisp.insert('\n'.join(words))

  interactions[break_on_whitespace] = ''

The above relies, in particular, on the fact that for those Emacs Lisp
functions used here, ``start`` and ``end`` may be given in any order.

Emacs side
==========

On the Emacs side, one would do::

  (pymacs-load "manglers")
  (global-set-key [f7] 'manglers-break-on-whitespace)
