summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien <bzg@gnu.org>2020-01-30 23:01:29 +0100
committerBastien <bzg@gnu.org>2020-01-30 23:01:29 +0100
commit4f98694bf75db07386cd33aecde60c21d925b1d5 (patch)
tree31e0c081e546ada1d810916a2f55bf088a1a6578
parent3942ccec876e2651e1b101948c97375b034b4fae (diff)
downloadorg-mode-4f98694bf75db07386cd33aecde60c21d925b1d5.tar.gz
Allow numeric values for priorities
* lisp/org.el (org-priority-highest, org-priority-default): Allow integer. (org-priority-get-priority-function): Tiny docstring change. (org-priority-to-value): New defsubst. (org--setup-collect-keywords, org-priority-regexp) (org-priority, org-get-priority): Allow numeric values. * doc/org-manual.org (Priorities): Illustrate the use of numeric values for priorities.
-rw-r--r--doc/org-manual.org14
-rw-r--r--etc/ORG-NEWS22
-rw-r--r--lisp/org.el83
3 files changed, 88 insertions, 31 deletions
diff --git a/doc/org-manual.org b/doc/org-manual.org
index f302b3a..0a409e8 100644
--- a/doc/org-manual.org
+++ b/doc/org-manual.org
@@ -4328,11 +4328,19 @@ like this
By default, Org mode supports three priorities: =A=, =B=, and =C=.
=A= is the highest priority. An entry without a cookie is treated as
equivalent if it had priority =B=. Priorities make a difference only
-for sorting in the agenda (see [[*Weekly/daily agenda]]); outside the
+for sorting in the agenda (see [[*Weekly/daily agenda]]). Outside the
agenda, they have no inherent meaning to Org mode. The cookies are
displayed with the face defined by the variable ~org-priority-faces~,
which can be customized.
+You can also use numeric values for priorities, such as
+
+: *** TODO [#1] Write letter to Sam Fortune
+
+When using numeric priorities, you need to set ~org-priority-highest~,
+~org-priority-lowest~ and ~org-priority-default~ to integers, which
+must all be strictly inferior to 65.
+
Priorities can be attached to any outline node; they do not need to be
TODO items.
@@ -4372,6 +4380,10 @@ highest priority is earlier in the alphabet than the lowest priority):
#+cindex: @samp{PRIORITIES}, keyword
: #+PRIORITIES: A C B
+Or, using numeric values:
+
+: #+PRIORITIES: 1 10 5
+
** Breaking Down Tasks into Subtasks
:PROPERTIES:
:DESCRIPTION: Splitting a task into manageable pieces.
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 2f7b252..f03415b 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -13,6 +13,18 @@ Please send Org bug reports to mailto:emacs-orgmode@gnu.org.
* Version 9.4 (not yet released)
** New features
+*** Numeric priorities are now allowed (up to 65)
+
+You can now set ~org-priority-highest/lowest/default~ to integers to
+use numeric priorities globally or set, for example
+
+#+PRIORITIES: 1 10 5
+
+to define a buffer-local range and default for priorities. Priority
+commands should work as usual. You cannot use numbers superior to 64
+for numeric priorities, as it would clash with priorities like [#A]
+where the "A" is internally converted to its numeric value of 65.
+
*** New minor mode ~org-table-electric-header-mode~
Turn on the display of the first data row of the table at point in the
@@ -37,11 +49,6 @@ things in a property drawer before the first headline will make them
A new `:tree-type month' option was added to org-capture-templates to
group new datetime entries by month.
-*** New header argument to pass Java command line arguments
-
-Babel Java blocks recognize header argument =:cmdargs= and pass its
-value in call to =java=.
-
*** Refinement in window behavior on exiting Org source buffer
After editing a source block, Org will restore the window layout when
@@ -58,6 +65,11 @@ buffers are displayed by modifying ~display-buffer-alist~ or
This option will add a timeout to notifications.
+*** Babel: new header argument to pass Java command line arguments
+
+Babel Java blocks recognize header argument =:cmdargs= and pass its
+value in call to =java=.
+
** New commands
*** ~org-table-electric-header-mode~
diff --git a/lisp/org.el b/lisp/org.el
index 116ef79..aabef41 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -2566,17 +2566,23 @@ set a priority."
(defvaralias 'org-highest-priority 'org-priority-highest)
(defcustom org-priority-highest ?A
- "The highest priority of TODO items. A character like ?A, ?B etc.
-Must have a smaller ASCII number than `org-priority-lowest'."
+ "The highest priority of TODO items.
+A character like ?A, ?B, etc., or a numeric value like 1, 2, etc.
+Must be smaller than `org-priority-lowest'."
:group 'org-priorities
- :type 'character)
+ :type '(choice
+ (character :tag "Character")
+ (integer :tag "Integer (< 65)")))
(defvaralias 'org-lowest-priority 'org-priority-lowest)
(defcustom org-priority-lowest ?C
- "The lowest priority of TODO items. A character like ?A, ?B etc.
-Must have a larger ASCII number than `org-priority-highest'."
+ "The lowest priority of TODO items.
+A character like ?A, ?B, etc., or a numeric value like 1, 2, etc.
+Must be higher than `org-priority-highest'."
:group 'org-priorities
- :type 'character)
+ :type '(choice
+ (character :tag "Character")
+ (integer :tag "Integer (< 65)")))
(defvaralias 'org-default-priority 'org-priority-default)
(defcustom org-priority-default ?B
@@ -2586,11 +2592,13 @@ When starting to cycle on an empty priority the first step in the cycle
depends on `org-priority-start-cycle-with-default'. The resulting first
step priority must not exceed the range from `org-priority-highest' to
`org-priority-lowest' which means that `org-priority-default' has to be
-in this range exclusive or inclusive the range boundaries. Else the
-first step refuses to set the default and the second will fall back
-to (depending on the command used) the highest or lowest priority."
+in this range exclusive or inclusive to the range boundaries. Else the
+first step refuses to set the default and the second will fall back on
+(depending on the command used) the highest or lowest priority."
:group 'org-priorities
- :type 'character)
+ :type '(choice
+ (character :tag "Character")
+ (integer :tag "Integer (< 65)")))
(defcustom org-priority-start-cycle-with-default t
"Non-nil means start with default priority when starting to cycle.
@@ -2603,7 +2611,7 @@ See also `org-priority-default'."
(defvaralias 'org-get-priority-function 'org-priority-get-priority-function)
(defcustom org-priority-get-priority-function nil
"Function to extract the priority from a string.
-The string is normally the headline. If this is nil Org computes the
+The string is normally the headline. If this is nil Org, computes the
priority from the priority cookie like [#A] in the headline. It returns
an integer, increasing by 1000 for each priority level.
The user can set a different function here, which should take a string
@@ -4502,6 +4510,13 @@ related expressions."
"[ \t]*$"))
(org-compute-latex-and-related-regexp)))))
+(defsubst org-priority-to-value (s)
+ "Convert priority string S to its numeric value."
+ (or (save-match-data
+ (and (string-match "\\([0-9]+\\)" s)
+ (string-to-number (match-string 1 s))))
+ (string-to-char s)))
+
(defun org--setup-collect-keywords (regexp &optional files alist)
"Return setup keywords values as an alist.
@@ -4561,8 +4576,11 @@ Return value contains the following keys: `archive', `category',
((equal key "PRIORITIES")
(push (cons 'priorities
(let ((prio (split-string value)))
- (if (< (length prio) 3) '(?A ?C ?B)
- (mapcar #'string-to-char prio))))
+ (if (< (length prio) 3)
+ (list org-priority-highest
+ org-priority-lowest
+ org-priority-default)
+ (mapcar #'org-priority-to-value prio))))
alist))
((equal key "PROPERTY")
(when (string-match "\\(\\S-+\\)[ \t]+\\(.*\\)" value)
@@ -11631,7 +11649,8 @@ from the `before-change-functions' in the current buffer."
;;;; Priorities
(defvar org-priority-regexp ".*?\\(\\[#\\([A-Z0-9]+\\)\\] ?\\)"
- "Regular expression matching the priority indicator.")
+ "Regular expression matching the priority indicator.
+A priority indicator can be e.g. [#A] or [#1].")
(defun org-priority-up ()
"Increase the priority of the current item."
@@ -11661,12 +11680,14 @@ or a character."
(unless org-priority-enable-commands
(user-error "Priority commands are disabled"))
(setq action (or action 'set))
- (let (current new news have remove)
+ (let ((nump (< org-priority-lowest 65))
+ current new news have remove)
(save-excursion
(org-back-to-heading t)
(when (looking-at org-priority-regexp)
- (setq current (string-to-char (match-string 2))
- have t))
+ (let ((ms (match-string 2)))
+ (setq current (org-priority-to-value ms)
+ have t)))
(cond
((eq action 'remove)
(setq remove t new ?\ ))
@@ -11674,17 +11695,27 @@ or a character."
(integerp action))
(if (not (eq action 'set))
(setq new action)
- (message "Priority %c-%c, SPC to remove: "
- org-priority-highest org-priority-lowest)
- (save-match-data
- (setq new (read-char-exclusive))))
+ (setq
+ new
+ (if nump
+ (string-to-number
+ (read-string (format "Priority %s-%s, SPC to remove: "
+ (number-to-string org-priority-highest)
+ (number-to-string org-priority-lowest))))
+ (progn (message "Priority %c-%c, SPC to remove: "
+ org-priority-highest org-priority-lowest)
+ (save-match-data
+ (setq new (read-char-exclusive)))))))
(when (and (= (upcase org-priority-highest) org-priority-highest)
(= (upcase org-priority-lowest) org-priority-lowest))
(setq new (upcase new)))
(cond ((equal new ?\s) (setq remove t))
((or (< (upcase new) org-priority-highest) (> (upcase new) org-priority-lowest))
- (user-error "Priority must be between `%c' and `%c'"
- org-priority-highest org-priority-lowest))))
+ (user-error
+ (if nump
+ "Priority must be between `%s' and `%s'"
+ "Priority must be between `%c' and `%c'")
+ org-priority-highest org-priority-lowest))))
((eq action 'up)
(setq new (if have
(1- current) ; normal cycling
@@ -11716,7 +11747,9 @@ or a character."
;; normal cycling: `new' is beyond highest/lowest priority
;; and is wrapped around to the empty priority
(setq remove t)))
- (setq news (format "%c" new))
+ ;; Numerical priorities are limited to 64, beyond that number,
+ ;; assume the priority cookie is a character.
+ (setq news (if (> new 64) (format "%c" new) (format "%s" new)))
(if have
(if remove
(replace-match "" t t nil 1)
@@ -11758,7 +11791,7 @@ and by additional input from the age of a schedules or deadline entry."
(if (not (string-match org-priority-regexp s))
(* 1000 (- org-priority-lowest org-priority-default))
(* 1000 (- org-priority-lowest
- (string-to-char (match-string 2 s))))))))
+ (org-priority-to-value (match-string 2 s))))))))
;;;; Tags