From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stephen Berman Newsgroups: gmane.emacs.bugs,gmane.emacs.pretest.bugs Subject: bug#4820: 23.1.50; [PATCH] todo-mode.el Date: Wed, 28 Oct 2009 13:20:07 +0100 Message-ID: <874opjd820.fsf@escher.local.home> Reply-To: Stephen Berman , 4820@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1256732859 19778 80.91.229.12 (28 Oct 2009 12:27:39 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 28 Oct 2009 12:27:39 +0000 (UTC) To: emacs-pretest-bug@gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Oct 28 13:27:31 2009 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1N37cg-0004dn-KU for geb-bug-gnu-emacs@m.gmane.org; Wed, 28 Oct 2009 13:27:31 +0100 Original-Received: from localhost ([127.0.0.1]:38174 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N37cg-0002aT-1y for geb-bug-gnu-emacs@m.gmane.org; Wed, 28 Oct 2009 08:27:30 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1N37cZ-0002ZQ-9z for bug-gnu-emacs@gnu.org; Wed, 28 Oct 2009 08:27:23 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1N37cT-0002TJ-1y for bug-gnu-emacs@gnu.org; Wed, 28 Oct 2009 08:27:22 -0400 Original-Received: from [199.232.76.173] (port=43226 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1N37cS-0002TB-Rn for bug-gnu-emacs@gnu.org; Wed, 28 Oct 2009 08:27:16 -0400 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:40724) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1N37cS-0004Pl-7J for bug-gnu-emacs@gnu.org; Wed, 28 Oct 2009 08:27:16 -0400 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id n9SCREOK008148; Wed, 28 Oct 2009 05:27:14 -0700 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.14.3/8.14.3/Submit) id n9SCP5kg007704; Wed, 28 Oct 2009 05:25:05 -0700 Resent-Date: Wed, 28 Oct 2009 05:25:05 -0700 X-Loop: owner@emacsbugs.donarmstrong.com Resent-From: Stephen Berman Original-Sender: steve@escher.local.home Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs 2Resent-Date: Wed, 28 Oct 2009 12:25:04 +0000 Resent-Message-ID: Resent-Sender: owner@emacsbugs.donarmstrong.com X-Emacs-PR-Message: report 4820 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by submit@emacsbugs.donarmstrong.com id=B.12567324207439 (code B ref -1); Wed, 28 Oct 2009 12:25:04 +0000 Original-Received: (at submit) by emacsbugs.donarmstrong.com; 28 Oct 2009 12:20:20 +0000 X-Spam-Bayes: score:0.5 Bayes not run. spammytokens:Tokens not available. hammytokens:Tokens not available. Original-Received: from fencepost.gnu.org (fencepost.gnu.org [140.186.70.10]) by rzlab.ucr.edu (8.14.3/8.14.3/Debian-5) with ESMTP id n9SCKHNR007426 for ; Wed, 28 Oct 2009 05:20:19 -0700 Original-Received: from mx10.gnu.org ([199.232.76.166]:34206) by fencepost.gnu.org with esmtp (Exim 4.67) (envelope-from ) id 1N37Vh-0002iE-7I for emacs-pretest-bug@gnu.org; Wed, 28 Oct 2009 08:20:17 -0400 Original-Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1N37Ve-0003IB-3D for emacs-pretest-bug@gnu.org; Wed, 28 Oct 2009 08:20:16 -0400 Original-Received: from mail.gmx.net ([213.165.64.20]:46780) by monty-python.gnu.org with smtp (Exim 4.60) (envelope-from ) id 1N37Vd-0003Gf-CW for emacs-pretest-bug@gnu.org; Wed, 28 Oct 2009 08:20:13 -0400 Original-Received: (qmail invoked by alias); 28 Oct 2009 12:20:08 -0000 Original-Received: from i59F56217.versanet.de (EHLO escher.local.home) [89.245.98.23] by mail.gmx.net (mp021) with SMTP; 28 Oct 2009 13:20:08 +0100 X-Authenticated: #20778731 X-Provags-ID: V01U2FsdGVkX1+pbPwWNyWp/CFCZepax6LR9n+sLA1FCabGapXUsj cke6Q/+MV0Bk2R Original-Received: by escher.local.home (Postfix, from userid 1000) id DBADE1D184F; Wed, 28 Oct 2009 13:20:07 +0100 (CET) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux) X-Y-GMX-Trusted: 0 X-FuHaFi: 0.54 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Resent-Date: Wed, 28 Oct 2009 08:27:22 -0400 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:32261 gmane.emacs.pretest.bugs:25147 Archived-At: --=-=-= 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 * 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) --=-=-= Content-Disposition: attachment Content-Description: todo-mode.el patch *** 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 " ") (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 " ") (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. --=-=-=--