Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 4824D431FAE for ; Wed, 16 Apr 2014 14:22:12 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0.201 X-Spam-Level: X-Spam-Status: No, score=0.201 tagged_above=-999 required=5 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_ENVFROM_END_DIGIT=1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3QEg4dbMyX7i for ; Wed, 16 Apr 2014 14:22:06 -0700 (PDT) Received: from mail-ee0-f51.google.com (mail-ee0-f51.google.com [74.125.83.51]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 6FF00431FBD for ; Wed, 16 Apr 2014 14:22:06 -0700 (PDT) Received: by mail-ee0-f51.google.com with SMTP id c13so9305363eek.38 for ; Wed, 16 Apr 2014 14:22:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ogfNeT/6I436Njxbadw6FF11sp30sY+nXYVTsfgFkyk=; b=a1z+I3G9v1MQ56tptaZVv4V1g+OoWXmTXEWXtejmu0co+xuT3V0Rvs22S5iHxbYzOm 5CsXteteEZcesEdI9Bl22wNS3SU0kjsvBtqOvtCHjjXbExpXLG0BDoi6yhNj/cWo4U8/ QGvTum+pD9Nl39OY2v82Wxf6W8gXV2Oo3WNF2EiOcyEQmKyX8fB+5hM43SqhQeXLTZzS m70gf0YLufJnFZsQz07IfxfPk4ukXZZRylx6fW1VztPgBjQZlDg/omG2vlM5qPWXml3r 2sJ04QCHEpNvcc6m1AxA7g87EEP1VIQct/8reokUD3T9JBR+gHVVjcsFN6J6tGq09vL+ zdwQ== X-Received: by 10.14.194.133 with SMTP id m5mr8020242een.38.1397683324120; Wed, 16 Apr 2014 14:22:04 -0700 (PDT) Received: from localhost ([217.17.137.178]) by mx.google.com with ESMTPSA id o4sm61326273eef.20.2014.04.16.14.22.03 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 16 Apr 2014 14:22:03 -0700 (PDT) From: Mark Walters To: notmuch@notmuchmail.org Subject: [PATCH 1/1] emacs: hello: bugfix for saved searches defcustom Date: Wed, 16 Apr 2014 22:21:53 +0100 Message-Id: <1397683313-28268-2-git-send-email-markwalters1009@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1397683313-28268-1-git-send-email-markwalters1009@gmail.com> References: <1397683313-28268-1-git-send-email-markwalters1009@gmail.com> X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Apr 2014 21:22:12 -0000 The recent changes for saved searches introduced a bug when notmuch was loaded after the saved search was defined. This was caused by a utility function not being defined when the defcustom was loaded. Fix this by moving some code around: the defcustom is moved into notmuch-hello (which is a more natural place anyway), and the utility functions are moved before the defcustom in notmuch-hello. We are rather constrained as the defcustom for saved searches is the first variable in the notmuch-hello customize window; to avoid moving this customize the defcustom needs to be the first defcustom in notmuch-hello, and the utility functions come before that. This patch also renames one of the utility functions from notmuch--saved-searches-to-plist to notmuch-hello--saved-searches-to-plist (as it is purely local to notmuch-hello) and corrects a couple of typo/spelling mistakes pointed out by Tomi. --- emacs/notmuch-hello.el | 128 ++++++++++++++++++++++++++++++++++-------------- emacs/notmuch-lib.el | 52 -------------------- 2 files changed, 90 insertions(+), 90 deletions(-) diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el index 4900a24..a7a8e20 100644 --- a/emacs/notmuch-hello.el +++ b/emacs/notmuch-hello.el @@ -29,6 +29,96 @@ (declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line continuation)) (declare-function notmuch-poll "notmuch" ()) +(defun notmuch-saved-search-get (saved-search field) + "Get FIELD from SAVED-SEARCH. + +If SAVED-SEARCH is a plist, this is just `plist-get', but for +backwards compatibility, this also deals with the two other +possible formats for SAVED-SEARCH: cons cells (NAME . QUERY) and +lists (NAME QUERY COUNT-QUERY)." + (cond + ((keywordp (car saved-search)) + (plist-get saved-search field)) + ;; It is not a plist so it is an old-style entry. + ((consp (cdr saved-search)) ;; It is a list (NAME QUERY COUNT-QUERY) + (case field + (:name (first saved-search)) + (:query (second saved-search)) + (:count-query (third saved-search)) + (t nil))) + (t ;; It is a cons-cell (NAME . QUERY) + (case field + (:name (car saved-search)) + (:query (cdr saved-search)) + (t nil))))) + +(defun notmuch-hello-saved-search-to-plist (saved-search) + "Return a copy of SAVED-SEARCH in plist form. + +If saved search is a plist then just return a copy. In other +cases, for backwards compatibility, convert to plist form and +return that." + (if (keywordp (car saved-search)) + (copy-seq saved-search) + (let ((fields (list :name :query :count-query)) + plist-search) + (dolist (field fields plist-search) + (let ((string (notmuch-saved-search-get saved-search field))) + (when string + (setq plist-search (append plist-search (list field string))))))))) + +(defun notmuch-hello--saved-searches-to-plist (symbol) + "Extract a saved-search variable into plist form. + +The new style saved search is just a plist, but for backwards +compatibility we use this function to extract old style saved +searches so they still work in customize." + (let ((saved-searches (default-value symbol))) + (mapcar #'notmuch-hello-saved-search-to-plist saved-searches))) + +(define-widget 'notmuch-saved-search-plist 'list + "A single saved search property list." + :tag "Saved Search" + :args '((list :inline t + :format "%v" + (group :format "%v" :inline t (const :format " Name: " :name) (string :format "%v")) + (group :format "%v" :inline t (const :format " Query: " :query) (string :format "%v"))) + (checklist :inline t + :format "%v" + (group :format "%v" :inline t (const :format "Count-Query: " :count-query) (string :format "%v")) + (group :format "%v" :inline t (const :format "" :sort-order) + (choice :tag " Sort Order" + (const :tag "Default" nil) + (const :tag "Oldest-first" oldest-first) + (const :tag "Newest-first" newest-first)))))) + +(defcustom notmuch-saved-searches '((:name "inbox" :query "tag:inbox") + (:name "unread" :query "tag:unread")) + "A list of saved searches to display. + +The saved search can be given in 3 forms. The preferred way is as +a plist. Supported properties are + + :name Name of the search (required). + :query Search to run (required). + :count-query Optional extra query to generate the count + shown. If not present then the :query property + is used. + :sort-order Specify the sort order to be used for the search. + Possible values are 'oldest-first 'newest-first or + nil. Nil means use the default sort order. + +Other accepted forms are a cons cell of the form (NAME . QUERY) +or a list of the form (NAME QUERY COUNT-QUERY)." +;; The saved-search format is also used by the all-tags notmuch-hello +;; section. This section generates its own saved-search list in one of +;; the latter two forms. + + :get 'notmuch-hello--saved-searches-to-plist + :type '(repeat notmuch-saved-search-plist) + :tag "List of Saved Searches" + :group 'notmuch-hello) + (defcustom notmuch-hello-recent-searches-max 10 "The number of recent searches to display." :type 'integer @@ -269,44 +359,6 @@ afterwards.") (add-to-history 'notmuch-search-history search))) (notmuch-search search notmuch-search-oldest-first)) -(defun notmuch-saved-search-get (saved-search field) - "Get FIELD from SAVED-SEARCH. - -If SAVED-SEARCH is a plist, this is just `plist-get', but for -backwards compatibility, this also deals with the two other -possible formats for SAVED-SEARCH: cons cells (NAME . QUERY) and -lists (NAME QUERY COUNT-QUERY)." - (cond - ((keywordp (car saved-search)) - (plist-get saved-search field)) - ;; It is not a plist so it is an old-style entry. - ((consp (cdr saved-search)) ;; It is a list (NAME QUERY COUNT-QUERY) - (case field - (:name (first saved-search)) - (:query (second saved-search)) - (:count-query (third saved-search)) - (t nil))) - (t ;; It is a cons-cell (NAME . QUERY) - (case field - (:name (car saved-search)) - (:query (cdr saved-search)) - (t nil))))) - -(defun notmuch-hello-saved-search-to-plist (saved-search) - "Return a copy of SAVED-SEARCH in plist form. - -If saved search is a plist then just return a copy. In other -cases, for backwards compatability, convert to plist form and -return that." - (if (keywordp (car saved-search)) - (copy-seq saved-search) - (let ((fields (list :name :query :count-query)) - plist-search) - (dolist (field fields plist-search) - (let ((string (notmuch-saved-search-get saved-search field))) - (when string - (setq plist-search (append plist-search (list field string))))))))) - (defun notmuch-hello-add-saved-search (widget) (interactive) (let ((search (widget-value diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index 3a3c69d..2941da3 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -107,58 +107,6 @@ Note that the recommended way of achieving the same is using (defvar notmuch-search-history nil "Variable to store notmuch searches history.") -(defun notmuch--saved-searches-to-plist (symbol) - "Extract a saved-search variable into plist form. - -The new style saved search is just a plist, but for backwards -compatatibility we use this function to extract old style saved -searches so they still work in customize." - (let ((saved-searches (default-value symbol))) - (mapcar #'notmuch-hello-saved-search-to-plist saved-searches))) - -(define-widget 'notmuch-saved-search-plist 'list - "A single saved search property list." - :tag "Saved Search" - :args '((list :inline t - :format "%v" - (group :format "%v" :inline t (const :format " Name: " :name) (string :format "%v")) - (group :format "%v" :inline t (const :format " Query: " :query) (string :format "%v"))) - (checklist :inline t - :format "%v" - (group :format "%v" :inline t (const :format "Count-Query: " :count-query) (string :format "%v")) - (group :format "%v" :inline t (const :format "" :sort-order) - (choice :tag " Sort Order" - (const :tag "Default" nil) - (const :tag "Oldest-first" oldest-first) - (const :tag "Newest-first" newest-first)))))) - -(defcustom notmuch-saved-searches '((:name "inbox" :query "tag:inbox") - (:name "unread" :query "tag:unread")) - "A list of saved searches to display. - -The saved search can be given in 3 forms. The preferred way is as -a plist. Supported properties are - - :name Name of the search (required). - :query Search to run (required). - :count-query Optional extra query to generate the count - shown. If not present then the :query property - is used. - :sort-order Specify the sort order to be used for the search. - Possible values are 'oldest-first 'newest-first or - nil. Nil means use the default sort order. - -Other accepted forms are a cons cell of the form (NAME . QUERY) -or a list of the form (NAME QUERY COUNT-QUERY)." -;; The saved-search format is also used by the all-tags notmuch-hello -;; section. This section generates its own saved-search list in one of -;; the latter two forms. - - :get 'notmuch--saved-searches-to-plist - :type '(repeat notmuch-saved-search-plist) - :tag "List of Saved Searches" - :group 'notmuch-hello) - (defcustom notmuch-archive-tags '("-inbox") "List of tag changes to apply to a message or a thread when it is archived. -- 1.7.10.4