all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Stephen Berman <stephen.berman@gmx.net>
To: emacs-pretest-bug@gnu.org
Subject: bug#4820: 23.1.50; [PATCH] todo-mode.el
Date: Wed, 28 Oct 2009 13:20:07 +0100	[thread overview]
Message-ID: <874opjd820.fsf@escher.local.home> (raw)

[-- Attachment #1: Type: text/plain, Size: 2909 bytes --]

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)


[-- Attachment #2: todo-mode.el patch --]
[-- Type: text/plain, Size: 4322 bytes --]

*** emacs/lisp/calendar/todo-mode.el.~1.76.~	2009-10-28 11:07:53.000000000 +0100
--- emacs/lisp/calendar/todo-mode.el	2009-10-28 12:55:58.000000000 +0100
***************
*** 505,518 ****
  (defun todo-edit-item ()
    "Edit current TODO list entry."
    (interactive)
!   (let ((item (todo-item-string)))
!     (if (todo-string-multiline-p item)
!         (todo-edit-multiline)
!       (let ((new (read-from-minibuffer "Edit: " item)))
!         (todo-remove-item)
!         (insert new "\n")
!         (todo-backward-item)
!         (message "")))))
  (defalias 'todo-cmd-edit 'todo-edit-item)
  
  (defun todo-edit-multiline ()
--- 505,520 ----
  (defun todo-edit-item ()
    "Edit current TODO list entry."
    (interactive)
!   (if (< (point-min) (point-max))
!       (let ((item (todo-item-string)))
! 	(if (todo-string-multiline-p item)
! 	    (todo-edit-multiline)
! 	  (let ((new (read-from-minibuffer "Edit: " item)))
! 	    (todo-remove-item)
! 	    (insert new "\n")
! 	    (todo-backward-item)
! 	    (message ""))))
!     (error "No TODO list entry to edit")))
  (defalias 'todo-cmd-edit 'todo-edit-item)
  
  (defun todo-edit-multiline ()
***************
*** 745,778 ****
                        (regexp-quote todo-prefix) " " todo-category-sep "\n")
              (concat todo-category-end "\n"))))
          beg end)
-     (todo-show)
      (save-excursion
        (save-restriction
!         (widen)
!         (copy-to-buffer todo-print-buffer-name (point-min) (point-max))
!         (set-buffer todo-print-buffer-name)
!         (goto-char (point-min))
!         (when (re-search-forward (regexp-quote todo-header) nil t)
! 	  (beginning-of-line 1)
! 	  (delete-region (point) (line-end-position)))
!         (while (re-search-forward       ;Find category start
!                 (regexp-quote (concat todo-prefix todo-category-beg))
!                 nil t)
!           (setq beg (+ (line-end-position) 1)) ;Start of first entry.
!           (re-search-forward cat-end nil t)
!           (setq end (match-beginning 0))
!           (replace-match todo-category-break)
!           (narrow-to-region beg end)    ;In case we have too few entries.
!           (goto-char (point-min))
!           (if (zerop nof-priorities)      ;Traverse entries.
!               (goto-char end)            ;All entries
!             (todo-forward-item nof-priorities))
!           (setq beg (point))
!           (delete-region beg end)
!           (widen))
!         (and (looking-at "\f") (replace-match "")) ;Remove trailing form-feed.
!         (goto-char (point-min))         ;Due to display buffer
!         ))
      ;; Could have used switch-to-buffer as it has a norecord argument,
      ;; which is nice when we are called from e.g. todo-print.
      ;; Else we could have used pop-to-buffer.
--- 747,781 ----
                        (regexp-quote todo-prefix) " " todo-category-sep "\n")
              (concat todo-category-end "\n"))))
          beg end)
      (save-excursion
+       (todo-show)
        (save-restriction
! 	(save-current-buffer
! 	  (widen)
! 	  (copy-to-buffer todo-print-buffer-name (point-min) (point-max))
! 	  (set-buffer todo-print-buffer-name)
! 	  (goto-char (point-min))
! 	  (when (re-search-forward (regexp-quote todo-header) nil t)
! 	    (beginning-of-line 1)
! 	    (delete-region (point) (line-end-position)))
! 	  (while (re-search-forward       ;Find category start
! 		  (regexp-quote (concat todo-prefix todo-category-beg))
! 		  nil t)
! 	    (setq beg (+ (line-end-position) 1)) ;Start of first entry.
! 	    (re-search-forward cat-end nil t)
! 	    (setq end (match-beginning 0))
! 	    (replace-match todo-category-break)
! 	    (narrow-to-region beg end)    ;In case we have too few entries.
! 	    (goto-char (point-min))
! 	    (if (zerop nof-priorities)      ;Traverse entries.
! 		(goto-char end)            ;All entries
! 	      (todo-forward-item nof-priorities))
! 	    (setq beg (point))
! 	    (delete-region beg end)
! 	    (widen))
! 	  (and (looking-at "\f") (replace-match "")) ;Remove trailing form-feed.
! 	  (goto-char (point-min))         ;Due to display buffer
! 	  )))
      ;; Could have used switch-to-buffer as it has a norecord argument,
      ;; which is nice when we are called from e.g. todo-print.
      ;; Else we could have used pop-to-buffer.

             reply	other threads:[~2009-10-28 12:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <k5hbtg9u8u.fsf@fencepost.gnu.org>
2009-10-28 12:20 ` Stephen Berman [this message]
2009-10-31  2:30   ` bug#4820: marked as done (23.1.50; [PATCH] todo-mode.el) Emacs bug Tracking System
2009-11-03 22:26   ` bug#4820: 23.1.50; [PATCH] todo-mode.el Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=874opjd820.fsf@escher.local.home \
    --to=stephen.berman@gmx.net \
    --cc=4820@emacsbugs.donarmstrong.com \
    --cc=emacs-pretest-bug@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.