--- Begin Message ---
Subject: |
23.1.50; [PATCH] todo-mode.el |
Date: |
Wed, 28 Oct 2009 13:20:07 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux) |
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 <stephen.berman@gmx.net>
* 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)
txtVajFBBQyOQ.txt
Description: todo-mode.el patch
--- End Message ---