]>
git.neil.brown.name Git - edlib.git/log
NeilBrown [Fri, 11 Dec 2015 06:15:32 +0000 (17:15 +1100)]
First step to plugable event loops.
attach libevent via an plugin command.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 04:30:41 +0000 (15:30 +1100)]
Use new notifiers for lib-view
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 04:21:30 +0000 (15:21 +1100)]
use new notifiers to notify changes to render-lines.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 03:25:55 +0000 (14:25 +1100)]
Use new notifiers for render-hex.
This makes the he_data redundant. I'll leave it there as I'll
probably find a need for it later.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 03:15:15 +0000 (14:15 +1100)]
Use DEF_LOOKUP_CMD in render-hex.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 03:13:57 +0000 (14:13 +1100)]
More fixed for closing popup windows.
I think I need refcounting on panes :-(
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 02:44:32 +0000 (13:44 +1100)]
popup: Close doc more directly.
I want this to all go eventually with auto-close documents.
But destroying a doc via some pane is problematic as the
pane might have disappeared already. So do it more directly.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 02:43:14 +0000 (13:43 +1100)]
Disconnect pane where possible before closing children.
This limits multiple closes due to recursion to some extent.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 02:41:07 +0000 (13:41 +1100)]
Introduce DAMAGED_CLOSED
This gets set when a pane is being closed, and prevents repeated
close when a child tried to close a parent.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 00:43:43 +0000 (11:43 +1100)]
Use new notifiers to close a popup when target disappears.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 00:39:06 +0000 (11:39 +1100)]
Use new notifications to support search_again
That than the old doc notifer.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 11 Dec 2015 00:21:52 +0000 (11:21 +1100)]
Start changing rules about ->focus and ->home
I'm still thinking this through....
'home' must always be the pane where the command was found.
'focus' should be where the action happens.
Previously 'home' would always end up being a parent of 'focus' but
sometimes, particularly calls from popup to target, we want something else.
So allow the caller to set 'focus' to themselves and 'home' to where
to start looking for the command.
If either is home is not set, focuses it moved out to a leaf first.
This still seems a bit clumsy...
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 07:11:49 +0000 (18:11 +1100)]
Use new notifiers to send notification when document changes.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 07:03:30 +0000 (18:03 +1100)]
Unify doc_notify_change and point_notify_change more.
In particular: export only one interface.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 06:48:13 +0000 (17:48 +1100)]
Use new notifier to close all views on a document when destroyed.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 06:00:28 +0000 (17:00 +1100)]
Add infrastructure to allow panes to get notifications from other panes.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 22:45:15 +0000 (09:45 +1100)]
Make struct cmd_info mostly read-only
I want this to be treated readonly except for a few
places where explicit write access is requested.
Partly because it used to be changed a lot and I want to stop that.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 04:17:55 +0000 (15:17 +1100)]
Remove doc_from_pane
No more callers.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 04:15:56 +0000 (15:15 +1100)]
Change line-count to use a pane rather than a doc.
Now all those pane-based functions are available...
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 04:11:14 +0000 (15:11 +1100)]
Introduce vmark_new to avoid direct acess to doc_new_mark
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 03:21:58 +0000 (14:21 +1100)]
Define doc:set-attr and use in line-count.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 03:00:18 +0000 (14:00 +1100)]
Introduce pane_mark_attr.
This searches panes for an attribute at a mark.
This removes another doc_from_pane call.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 02:55:17 +0000 (13:55 +1100)]
search: used Move-File rather than mark_reset to go to start.
this removes another doc_from_pane call.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 02:42:16 +0000 (13:42 +1100)]
Use attributes to get name of document instead of direct access.
This removes another doc_from_pane() call.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 02:33:30 +0000 (13:33 +1100)]
Use pane_attr_get to get linecount attributes for 'view'.
This reduced need for 'doc'.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 02:20:35 +0000 (13:20 +1100)]
Introduce doc_following_pane and change many mark_next/mark_prev to _pane
still tring to get 'doc' references out of non-core/doc code.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 02:15:44 +0000 (13:15 +1100)]
All ed->commands to be accessed by key_handle
This makes sense and means we don't need to find the 'ed'.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 01:49:42 +0000 (12:49 +1100)]
Introduce mark_next_pane and mark_prev_pane
Use these to remove the need for 'doc_from_pane' from search_add.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 01:29:34 +0000 (12:29 +1100)]
Rationalise prev/next mark function.
- don't need the 'safe' version any more
- don't need to pass 'doc'.
- consistent names: doc_{prev,next}_mark_{all,view}
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 01:21:18 +0000 (12:21 +1100)]
Change hlist to make the head directlry recognisable.
Store a least-significant-bit in the pointer in the 'head'
so that we can recognise the start of the list without carrying
around the pointer to the head.
This allows free movement around marks without holding the doc.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 00:54:05 +0000 (11:54 +1100)]
Remove 'doc' arg from next_mark.
It doesn't need it.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 00:52:00 +0000 (11:52 +1100)]
Remove mark_same calls from non-core/doc code.
These should use mark_same_pane.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 00:47:20 +0000 (11:47 +1100)]
Remove 'd' from render_complete_line
It isn't used.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 00:45:35 +0000 (11:45 +1100)]
Change doc_destroy to take a pane.
This starts to reduce the number of doc_from_pane() callers.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 00:06:17 +0000 (11:06 +1100)]
Python: return number from 'call'.
Return value is now more meaningful, so need to pass it back.
Probably should do something better with negative values.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 00:03:17 +0000 (11:03 +1100)]
python_call: don't accept return values for storage in 'ci'.
That approach is no longer supported.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 10 Dec 2015 00:00:36 +0000 (11:00 +1100)]
Use callback to return marks from doc:vmark-get
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 23:54:56 +0000 (10:54 +1100)]
Use callback to return pane for call_pane()
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 23:45:17 +0000 (10:45 +1100)]
Use a call-back to return pane from "display-ncurses".
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 23:41:39 +0000 (10:41 +1100)]
Use callbacks to return pane from "doc-*"
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 23:35:44 +0000 (10:35 +1100)]
Use callbacks to return string from Complete:prefix.
Also fix up freeing of strings.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 09:48:05 +0000 (20:48 +1100)]
Mark the '42' hack in render-complete as such.
And hide it from future attempts to make 'ci' read-only.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 09:34:57 +0000 (20:34 +1100)]
Return value from doc:add-view directly
Just like doc:find-view
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 09:25:57 +0000 (20:25 +1100)]
Remove assignment to ci->mark in doc_file.
It isn't needed, and I want to make ci read-only.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 09:00:02 +0000 (20:00 +1100)]
complete: remove the finding of the render-lines pane.
If we just make render-lines use "key_handle_focus", it is OK
for render-complete to be placed on top of the stack.
This makes things a lot cleaner.
We now need to let move-line through too.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 9 Dec 2015 08:38:58 +0000 (19:38 +1100)]
Change "render-line" to return line via a callback.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 06:54:26 +0000 (17:54 +1100)]
render-lines: don't set ci->hy unnecessarily.
I want 'ci' to be read-only inside commands.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 06:53:42 +0000 (17:53 +1100)]
Use REDEF_CMD to predeclate keymap_attach_func.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 06:32:28 +0000 (17:32 +1100)]
Use callbacks to return pane from render-*-attach commands.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 06:22:13 +0000 (17:22 +1100)]
use callbacks to return a pane from 'attach' commands.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 03:52:27 +0000 (14:52 +1100)]
Use callback to return string from doc:get-str
This way it is clear how ownership of the string is managed.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 03:36:16 +0000 (14:36 +1100)]
Use a callback to return string from doc:get-attr
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 02:01:47 +0000 (13:01 +1100)]
Use a callback to return mark for mark_at_point.
This might seem a bit forced, but I really think callbacks
like this are the best generic approach. I hope.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 01:54:17 +0000 (12:54 +1100)]
Unify calls to doc:dup-point.
All these calls can use mark_to_point - so do that.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 01:32:13 +0000 (12:32 +1100)]
Change Complete:prefix to return count directly.
with an offset of '1' to avoid returning '0'.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 01:28:14 +0000 (12:28 +1100)]
Change text-search to return result directly.
-2 is cannot find
-1 is incomplete regex
0 is no such commnd
N is match of length N-1 found.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 00:41:56 +0000 (11:41 +1100)]
Change doc:replace to return result directly.
There isn't must result here - just a flag to say "yes, a change was made".
But it was being handled completely wrongly!
I think it is fixed now.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 00:38:01 +0000 (11:38 +1100)]
Change doc:mark-same to return result directlry.
'1' means they are the same.
any other +ve number means they are different.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 00:33:08 +0000 (11:33 +1100)]
Change doc:step to return character directly.
Don't use ci for returing things.
As a char could be zero and WEOF could appear negative,
use high bits to make the number look positive.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 00:10:18 +0000 (11:10 +1100)]
Change doc:find-view to return value directly.
I'm moving away from using the cmd_info to return stuff.
So for numbers, just return them directly.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 8 Dec 2015 00:01:18 +0000 (11:01 +1100)]
Update README file
Lots has happened since this was written...
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 4 Dec 2015 05:42:12 +0000 (16:42 +1100)]
python: make standard globals available to python scripts.
Also make 'editor' and 'edlib' available to subsequent function calls
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 4 Dec 2015 05:38:05 +0000 (16:38 +1100)]
Make symbols in loaded libraries global.
I don't really like doing this, but python needs it for
"import gtk" to work.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 4 Dec 2015 01:05:02 +0000 (12:05 +1100)]
Fix various issues with python
Now that I've started testing a bit more...
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 4 Dec 2015 01:03:50 +0000 (12:03 +1100)]
Remove 'buf' from pane_text
It isn't used.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 23:47:26 +0000 (10:47 +1100)]
python: Add 'init' function for panes.
This calls pane_register.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 22:52:16 +0000 (09:52 +1100)]
Python: add interface for pane_focus and pane_refresh.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 22:48:35 +0000 (09:48 +1100)]
Create a command for defining new named commands.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 22:47:50 +0000 (09:47 +1100)]
Initialise doc_default_cmd earlier.
It needs to be initialised before the very first doc is created.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 22:38:28 +0000 (09:38 +1100)]
pane_refresh: always refresh whole display.
Anything else doesn't make sense.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 22:21:29 +0000 (09:21 +1100)]
pane_refresh: allow post-order "Refresh" calls, by request.
This allows the display to flush out updates at the end,
without needing the '0-timeout' hack.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 21:56:20 +0000 (08:56 +1100)]
Discard concept of persistent key modifiers.
I'm not using them and I no longer think they make sense.
The goal they were meant to serve is better served by
setting a new "global-set-keymap".
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Thu, 3 Dec 2015 21:51:06 +0000 (08:51 +1100)]
separate keyboard-input state into separate module.
This localises the concept and makes it possible to access
the state by sending commands.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 09:44:59 +0000 (20:44 +1100)]
Fix search bug: not finding longest match.
We need to keep going while we have a partial match (len=-1)
and record the last good match.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 09:28:39 +0000 (20:28 +1100)]
search: fix but with dot matching newlines.
Also default to case-insensitive until I get that configurable.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 09:21:11 +0000 (20:21 +1100)]
Search: note in prefix when search has wrapped.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 09:14:10 +0000 (20:14 +1100)]
use ->home->data, not ->focus->data
->focus isn't guaranteed to be the local pane. Home is.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 09:12:01 +0000 (20:12 +1100)]
Search: move to 'search start' when finishing the search.
This ensures the final search is from the current starting point.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 07:54:15 +0000 (18:54 +1100)]
Better handling of formatting with render-complete.
We highlight the common prefix and stripe all highlights
and quoting before using the string.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 07:35:54 +0000 (18:35 +1100)]
Fix bug causing render-complete to show a non-matching first line.
That "Move-to" needs to get through.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 03:51:16 +0000 (14:51 +1100)]
search: make sure point is visible when search is aborted.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 03:40:23 +0000 (14:40 +1100)]
render-format: allow '<' characters in format fields.
These need to be quoted.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 03:22:33 +0000 (14:22 +1100)]
Use the © copyright character is copyright messages.
Because I can...
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 03:19:07 +0000 (14:19 +1100)]
Add lib-messageline.
This places a line on the bottom on the display and displayed messages there.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 02:26:07 +0000 (13:26 +1100)]
ncurses: allow use of full screen.
If we want to trim a line off the bottom, do it separately.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 02:23:58 +0000 (13:23 +1100)]
Save search string for later re-use.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 02:11:24 +0000 (13:11 +1100)]
Disable recursive popups except by permission.
So trying to search in a file-file buffer now doesn't work.
This might need work for searching in a completion list??
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 01:56:07 +0000 (12:56 +1100)]
tile: fix 'next' to walk through all pop-ups.
Still need to work on 'prev'!
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 01:05:06 +0000 (12:05 +1100)]
Move root popups to the tile-root.
Having popups always attached to tiles seems clean and will make
pane-movement easier.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Wed, 2 Dec 2015 00:02:14 +0000 (11:02 +1100)]
Page up/down now move cursor to EOF when appropriate.
emacs doesn't do this, but I think it looks better... maybe.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 1 Dec 2015 22:46:28 +0000 (09:46 +1100)]
Fix page-up/down in directory listings.
If the target for cursorXY is in the header line, we need to adjust.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 1 Dec 2015 22:11:32 +0000 (09:11 +1100)]
Introduce some 'call*' functions to call command.
This simplifies lots of code.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 1 Dec 2015 20:53:00 +0000 (07:53 +1100)]
Quote regex chars when they are included from doc into search string.
Also handle unicode search properly.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 1 Dec 2015 20:43:18 +0000 (07:43 +1100)]
text: fix bug with adding at end of allocation.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 1 Dec 2015 20:35:02 +0000 (07:35 +1100)]
Rename comm_ncurses to display_ncurses
"comm_" is part of an old deprecated naming scheme.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Tue, 1 Dec 2015 20:19:43 +0000 (07:19 +1100)]
NeilBrown [Sun, 29 Nov 2015 21:50:58 +0000 (08:50 +1100)]
Move the authoritative 'point' out of the pane and into the doc_data.
This seems a more sensible location.
The point still exists in the pane as it is very useful, but this is
now just a 'borrowed' pointer.
This required changing doc_attr to only examine a single pane.
Probably makes sense for now.
Next patch will make changes to how points in panes are managed.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Sun, 29 Nov 2015 21:50:01 +0000 (08:50 +1100)]
Fix up entry of multi-byte UTF-8
I wasn't handling wide characters on text-entry, and
text_round_len was wrong.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Sun, 29 Nov 2015 21:49:16 +0000 (08:49 +1100)]
Initial python support.
Add a new loadable module 'lang-python' which provides a
"python-load" command which will run a python script.
This has access to panes and marks and can send and receive commands...
At least it can in principle - only limited testing so far.
I think it is a good starting point for python support.
Signed-off-by: NeilBrown <neil@brown.name>
NeilBrown [Fri, 27 Nov 2015 05:06:08 +0000 (16:06 +1100)]
Add another check for a NULL string.
This allows render_line_prev to make more sense at end-of-doc.
Signed-off-by: NeilBrown <neil@brown.name>