From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Dmitri Minaev" Subject: in-buffer settings for priorities Date: Wed, 16 May 2007 14:43:56 +0500 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1HoGB5-00047E-Sh for emacs-orgmode@gnu.org; Wed, 16 May 2007 05:52:15 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1HoGB4-000470-G4 for emacs-orgmode@gnu.org; Wed, 16 May 2007 05:52:14 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1HoGB4-00046w-2f for emacs-orgmode@gnu.org; Wed, 16 May 2007 05:52:14 -0400 Received: from nz-out-0506.google.com ([64.233.162.239]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1HoG35-0005VG-9G for emacs-orgmode@gnu.org; Wed, 16 May 2007 05:43:59 -0400 Received: by nz-out-0506.google.com with SMTP id x7so464342nzc for ; Wed, 16 May 2007 02:43:58 -0700 (PDT) Content-Disposition: inline List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org Hello, I'd like to know the opinion of the community (and Carsten's in particular, of course) on the following idea -- do you think it would be useful to have in-buffer settings to customize priorities? The background story (sorry if it's verbose) is like this. I keep my reading list in org-mode (quite naturally). Normally, the entries are stored in the chronological order, but sometimes I would like to see the best or the worst read books. I started by using tags like :score2:, :score8:, etc., so I could search for tags using regexps like {score[7-9]}. Unfortunately, the entries were not sorted. Basically, the only way to sort them is to use priorities instead of tags. Three grades were not enough, of course, so I set org-lowest-priority to J. On the contrary, 10 grades were too much for other files, like todo lists. So, I decided to add per-file settings for priorities: parameter #+PRIORITY_LOW. This worked, but using letters to rate books was not the best idea and I decided to add digits from 0 to 9 to the list of priorities. Now I think that it might have been better to add a kind of a #+PRIORITY_STYLE with values 'abc' and 'num', for example, but at that moment I added another variable -- org-highest-priority and a corresponding in-buffer setting #+PRIORITY_HIGH. I also had to replace the regexps for priorities with [A-Z0-9], I changed the org-default-priority value from \B to org-lowest-priority, added #+PRIORITY_DEF setting and adapted the prompts to use org-highest-priority instead of \A. Now, I could add this to the reading list: #+PRIORITY_HIGH: 0 #+PRIORITY_LOW: 9 #+PRIORITY_DEF: 5 Now, only a small change in the .emacs was needed to add a new agenda custom command that changes the sorting strategy to priority-up, et voila! I only have to type C-c a 1 b to see the list of books sorted by my rating. What still confuses me is the necessity to press S-down to _increase_ the rating. Or, perhaps, I should just get used to the fact the best books should have rating 1 instead of 9. The patch against version 4.74 is below. Don't judge me too harshly :) --- ../org.el 2007-05-16 12:17:15.000000000 +0500 +++ org.el 2007-05-16 13:20:17.000000000 +0500 @@ -1527,9 +1527,8 @@ :tag "Org Priorities" :group 'org-todo) -(defcustom org-default-priority ?B - "The default priority of TODO items. -This is the priority an item get if no explicit priority is given." +(defcustom org-highest-priority ?A + "The highest priority of TODO items. A character like ?A, ?B etc." :group 'org-priorities :type 'character) @@ -1538,6 +1537,12 @@ :group 'org-priorities :type 'character) +(defcustom org-default-priority org-lowest-priority + "The default priority of TODO items. +This is the priority an item get if no explicit priority is given." + :group 'org-priorities + :type 'character) + (defgroup org-time nil "Options concerning time stamps and deadlines in Org-mode." :tag "Org Time" @@ -3346,9 +3351,9 @@ (org-set-local 'org-todo-sets nil) (let ((re (org-make-options-regexp '("CATEGORY" "SEQ_TODO" "PRI_TODO" "TYP_TODO" - "STARTUP" "ARCHIVE" "TAGS" "LINK"))) + "STARTUP" "ARCHIVE" "TAGS" "LINK" "PRIORITY_HIGH" "PRIORITY_LOW" "PRIORITY_DEFAULT"))) (splitre "[ \t]+") - kwds key value cat arch tags links hw dws tail sep kws1) + kwds key value cat arch tags links hw dws tail sep kws1 prio-high prio-low prio-def) (save-excursion (save-restriction (widen) @@ -3371,6 +3376,12 @@ (push (cons (match-string 1 value) (org-trim (match-string 2 value))) links))) + ((equal key "PRIORITY_HIGH") + (setq prio-high value)) + ((equal key "PRIORITY_LOW") + (setq prio-low value)) + ((equal key "PRIORITY_DEFAULT") + (setq prio-def value)) ((equal key "STARTUP") (let ((opts (org-split-string value splitre)) l var val) @@ -3390,6 +3401,9 @@ '(face t fontified t) arch))) ))) (and cat (org-set-local 'org-category cat)) + (and prio-high (org-set-local 'org-highest-priority (aref prio-high 0))) + (and prio-low (org-set-local 'org-lowest-priority (aref prio-low 0))) + (and prio-def (org-set-local 'org-default-priority (aref prio-def 0))) (and arch (org-set-local 'org-archive-location arch)) (and links (setq org-link-abbrev-alist-local (nreverse links))) ;; Process the TODO keywords @@ -4150,7 +4164,7 @@ (list (concat "^\\*+[ \t]*" org-not-done-regexp) '(1 'org-todo t)) ;; Priorities - (list (concat "\\[#[A-Z]\\]") '(0 'org-special-keyword t)) + (list (concat "\\[#[A-Z0-9]\\]") '(0 'org-special-keyword t)) ;; Special keywords (list org-repeat-re '(0 'org-special-keyword t)) (list (concat "\\<" org-deadline-string) '(0 'org-special-keyword t)) @@ -11983,7 +11997,7 @@ ;;;; Priorities -(defvar org-priority-regexp ".*?\\(\\[#\\([A-Z]\\)\\] ?\\)" +(defvar org-priority-regexp ".*?\\(\\[#\\([A-Z0-9]\\)\\] ?\\)" "Regular expression matching the priority indicator.") (defvar org-remove-priority-next-time nil) @@ -12012,18 +12026,18 @@ (setq current org-default-priority)) (cond ((eq action 'set) - (message "Priority A-%c, SPC to remove: " org-lowest-priority) + (message "Priority %c-%c, SPC to remove: " org-highest-priority org-lowest-priority) (setq new (read-char-exclusive)) (cond ((equal new ?\ ) (setq remove t)) - ((or (< (upcase new) ?A) (> (upcase new) org-lowest-priority)) + ((or (< (upcase new) org-highest-priority) (> (upcase new) org-lowest-priority)) (error "Priority must be between `%c' and `%c'" - ?A org-lowest-priority)))) + org-highest-priority org-lowest-priority)))) ((eq action 'up) (setq new (1- current))) ((eq action 'down) (setq new (1+ current))) (t (error "Invalid action"))) - (setq new (min (max ?A (upcase new)) org-lowest-priority)) + (setq new (min (max org-highest-priority (upcase new)) org-lowest-priority)) (setq news (format "%c" new)) (if have (if remove @@ -14219,7 +14233,7 @@ (setq tmp (calendar-date-string tmp))) (setq props (plist-put props 'date tmp))) (when (setq tmp (plist-get props 'txt)) - (when (string-match "\\[#\\([A-Z]\\)\\] ?" tmp) + (when (string-match "\\[#\\([A-Z0-9]\\)\\] ?" tmp) (plist-put props 'priority-letter (match-string 1 tmp)) (setq tmp (replace-match "" t t tmp))) (when (and (setq re (plist-get props 'org-todo-regexp)) @@ -19499,7 +19513,7 @@ (substring hd (match-end 1)))) (setq pri org-default-priority)) (setq pri (floor (1+ (* 8. (/ (float (- org-lowest-priority pri)) - (- org-lowest-priority ?A)))))) + (- org-lowest-priority org-highest-priority)))))) (princ (format "BEGIN:VTODO %s @@ -20509,7 +20523,7 @@ (push (org-point-in-group p 4 :tags) clist)) (goto-char p) (skip-chars-backward "^[\n\r \t") (or (eobp) (backward-char 1)) - (if (looking-at "\\[#[A-Z]\\]") + (if (looking-at "\\[#[A-Z0-9]\\]") (push (org-point-in-group p 0 :priority) clist))) ((org-at-item-p) -- With best regards, Dmitri Minaev Russian history blog: http://minaev.blogspot.com