Subject: 23.1.50; [PATCH] todo-mode.el

From: Stephen Berman <[email-masked]>
Date: Wed, 28 Oct 2009 13:20:07 +0100

Here are two bugs in todo-mode.el; a patch is attached.

1. emacs -Q with no existing file as the value of todo-file-do
2. M-x todo-show
3. Type `e' (todo-edit-item)
=> Args out of range: 60, 61

This is because there is no todo item, so when todo-edit-item calls
todo-item-string, todo-item-start returns (point-min), which is 61, and
todo-item-end returns (1- (line-beginning-position)), i.e. 60, which
raises the args-out-of-range error on buffer-substring in
todo-item-string.  The attached fix to todo-edit-item checks whether
there is a todo item to edit and throws an error if not.  This is
consistent with other Todo mode commands, e.g. todo-{raise, lower,
delete, file}-item.

1. emacs -Q
2. M-x todo-show
3. Type `i' and at the prompt a todo item, e.g "test", then RET to
   display the item in the TODO buffer in the category "Todo"; note that
   narrowing is in effect, as required by Todo mode.
4. Type `t' to display the Todo top priorities list in a window below
   the window displaying the TODO buffer.
5. In the TODO buffer type `E' on the item to put it in Todo Edit mode
   in the buffer *TODO Edit*.
6. Type C-x k to kill *TODO Edit* and return to the TODO buffer, which
   remains unchanged.
7. In the TODO buffer type `t' again.
=> Now narrowing is no longer in effect in the TODO buffer.

This is because todo-top-priorities, although it calls widen within
save-restriction, subsequently calls set-buffer, with the result, after
the call to make-indirect-buffer in todo-edit-multiline (step 5 above),
that narrowing is not restored.  The causal chain here is not quite
clear to me: in (elisp)Current Buffer there is a warning to use
set-buffer within save-current-buffer or save-excursion to guarantee
restoration, and in fact in todo-top-priorities set-buffer is within
save-excursion, but that is outside of the save-restriction.  If the
order of save-excursion and save-restriction is switched, then narrowing
is correctly restored after step 7 above; however, this order is
discouraged in (elisp)Narrowing.  But putting save-current-buffer
between save-restriction and set-buffer also restores narrowing, so this
is what the attached patch does.  (I don't know why the failure to
restore narrowing is conditioned by make-indirect-buffer; I asked about
this on emacs-devel but have not yet gotten any response.)  In addition,
the use of save-excursion appears to be gratuitous here: point is
already moved by the preceding call to todo-show, and subsequent code
concerns the temporary top priorities buffer.  But moving todo-show
inside save-excursion does prevent point from being relocated, so I made
this change as well in the patch.

2009-10-28  Stephen Berman  <[email-masked]>

	* calendar/todo-mode.el (todo-edit-item): Signal an error if there
	is no item to edit. (Bug#XXXX)
	(todo-top-priorities): Restore point and restore narrowing in Todo
	buffer. (Bug#XXXX)