Next:

- editablediffmodel: undo/redo works
- ncurses: undo/redo keyboard shortcuts
- ncurses: ask whether to quit if there are unsaved changes
- Fix bug where loading a file which contains only empty lines displays the
  contents of the other file

- release

- ncurses: Can edit lines
  + Change status message when you enter edit mode
  + Show a single-column cursor
  - Tests for edit mode
  - Move when you press arrow keys
  - Insert char when you press a key
  - Backspace when you backspace
  - Delete when you Del
- ncurses: Can edit lines even if you can't use arrow keys
- ncurses: Can edit long lines because they wrap or scroll

- release

- ncurses: Jump to beginning, end and line num (of the file the cursor is in)
- ncurses: Search
- ncurses: Handle screen resizes - currently you can crash it by resizing

- release

- ncurses: Can see long lines at bottom? (not short lines)
- ncurses: Long lines at bottom are scrollable
- ncurses: Don't crash when displaying help screen on a small terminal
- git: create a script suitable for use as GIT_EXTERNAL_DIFF
- editablediffmodel: allow locking one or both files as non-writeable
- general: return the correct values as used by git?
- ncurses: Can escape from edit mode even if you can't use ESC key
- diff: improve diff code (use difflib?) so similar lines are shown
  side-by-side.

Next:
- ncurses: SHIFT-UP and DOWN, CTRL-LEFT and RIGHT? - curses.meta( 1 )
- ncurses: Special characters to indicate the line continues to the left/right
- ncurses: Highlight added and removed parts of the line in a DIFFERENT row.
- ncurses: Show line number in status bar
- ncurses: Allow moving the vertical divider
- diffmodel: Change line.left and line.right into line.strs[LEFT] etc.
- ncurses: Confirm exit when there are unsaved changes
- filemanager: save to backup files
- filemanager: save to temporary file then rename when finished
- filemanager: handle save failed e.g. file is not writeable

Big:

- general: Allow supplying a diff on stdin.  This might mean we can work as a
  GIT_PAGER?  To be really great, we would need to find the filenames in the
  supplied diff (git-style and normal) and look for those files, and use them
  to provide context if they exist.  If they don't exist, use whatever context
  is in the file, and show "... skip x lines ..." for any gaps.
  We would also need to handle multi-file diffs.  Showing all files as one
  side-by-side diff could potentially make us a much better complement to git?

- Create a scalability test case
- Make scalable to big files.  DiffModel would only cache a certain number of
  lines, and call into the parser whenever it needed to get some other lines.
  Preferably, we should call the underlying diff program and send its output
  to a fifo, so it's ready if/when we need it.

- Make scalable to long lines?

- Make scalable to large numbers of edits/undos?

- Don't use unified diffs internally since they are not quite as reliable
  as context diffs?  (Because of +++ line problem.)

- Support "align manually" on diffs

- ncurses: allow free editing rather than one line at a time?

- GTK interface

Later/Never:

- If you edit a line and don't actually change it (but other parts of
  your edit do change things) don't mark the unchanged line as changed.
  See test_editabkediffmodel.py:edit_doesnt_change_line.
- editablediffmodel: Cache results instead of recalculating each time?
- git: highlight whitespace at end of lines, and other git diffisms
- ncurses: toggle showing line number
- ncurses: Support different colour schemes: white-on-black, black-on-white?
- ncurses: Allow specifying tab width
- unified diffs: Ignore lines that do not start with a space in unified diffs
- ncurses: Don't redraw whole screen when we are only scrolling one line
- unified diffs: Treat lines beginning +++ that are not hunk beginnings
  (i.e. don't match exactly the +++ file-name date-format regular
  expression) as + lines
- listview: write lines one by one instead of returning a string
- ncurses: redefine keys?
- ncurses: pressing s saves the modified file wherever your cursor is?


