emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Joe Corneli via "General discussions about Org-mode." <emacs-orgmode@gnu.org>
To: emacs-orgmode@gnu.org
Subject: Re: [patch] priorities range reversed
Date: Mon, 09 Aug 2021 14:51:51 +0100	[thread overview]
Message-ID: <87sfziwwso.fsf@Proteus> (raw)
In-Reply-To: <87v94ewyvw.fsf@Proteus>

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

Actually, there some bigger problems with the function as well...

— It didn’t update the priority cookie properly when one had been set before

* [#1] Exercise: update to [#2]

— After fixing that, I noticed that the included save-excursion doesn’t work
  (https://emacs.stackexchange.com/questions/7574/why-save-excursion-doesnt-save-point-position)

So, here’s a more comprehensive patch, including the previous changes
(in order to support numeric priorities) and then adjusting the
update/insert logic so that it makes more sense.

I did not adjust the indentation, so that you can more clearly see which
lines were changed.  Inline comments in the patch explain what’s going
on.


[-- Attachment #2: priorities_rearranged.patch --]
[-- Type: text/x-diff, Size: 2916 bytes --]

diff --git a/lisp/org.el b/lisp/org.el
index ce68f4692..69e333c84 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -11305,8 +11305,9 @@ or a character."
       (user-error "Priority commands are disabled"))
     (setq action (or action 'set))
     (let ((nump (< org-priority-lowest 65))
+          (saved-position (point))
 	  current new news have remove)
-      (save-excursion
+
 	(org-back-to-heading t)
 	(when (looking-at org-priority-regexp)
 	  (let ((ms (match-string 2)))
@@ -11337,7 +11338,7 @@ or a character."
 		     (= (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))
+		((or (> (upcase new) org-priority-highest) (< (upcase new) org-priority-lowest))
 		 (user-error
 		  (if nump
 		      "Priority must be between `%s' and `%s'"
@@ -11364,8 +11365,8 @@ or a character."
 			    org-priority-default
 			  (1+ org-priority-default))))))
 	 (t (user-error "Invalid action")))
-	(when (or (< (upcase new) org-priority-highest)
-		  (> (upcase new) org-priority-lowest))
+	(when (or (> (upcase new) org-priority-highest)
+		  (< (upcase new) org-priority-lowest))
 	  (if (and (memq action '(up down))
 		   (not have) (not (eq last-command this-command)))
 	      ;; `new' is from default priority
@@ -11377,12 +11378,26 @@ or a character."
 	;; 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)))
+        ;; Actually setting the priority isn’t so straightforward
+        ;; There are several cases
 	(if have
+            ;; ① have and remove
 	    (if remove
 		(replace-match "" t t nil 1)
-	      (replace-match news t t nil 2))
+              ;; ② have and not remove, i.e., update
+	      (let ((case-fold-search nil)) (looking-at org-priority-regexp))
+              (if (match-end 2)
+		  (progn
+		    (goto-char (match-end 2))
+                    (delete-region (match-beginning 2) (match-end 2))
+		    (insert news))
+	        (goto-char (match-end 1))
+	        (insert "[#" news "] "))
+              )
+          ;; ③ don’t have and remove — nonsense
 	  (if remove
 	      (user-error "No priority cookie found in line")
+            ;; ④ don’t have and not remove, i.e., insert
 	    (let ((case-fold-search nil)) (looking-at org-todo-line-regexp))
 	    (if (match-end 2)
 		(progn
@@ -11390,7 +11405,8 @@ or a character."
 		  (insert " [#" news "]"))
 	      (goto-char (match-beginning 3))
 	      (insert "[#" news "] "))))
-	(org-align-tags))
+	(org-align-tags)
+      (goto-char saved-position)
       (if remove
 	  (message "Priority removed")
 	(message "Priority of current item set to %s" news)))))

[-- Attachment #3: priorities_rearranged.patch --]
[-- Type: text/x-diff, Size: 2916 bytes --]

diff --git a/lisp/org.el b/lisp/org.el
index ce68f4692..69e333c84 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -11305,8 +11305,9 @@ or a character."
       (user-error "Priority commands are disabled"))
     (setq action (or action 'set))
     (let ((nump (< org-priority-lowest 65))
+          (saved-position (point))
 	  current new news have remove)
-      (save-excursion
+
 	(org-back-to-heading t)
 	(when (looking-at org-priority-regexp)
 	  (let ((ms (match-string 2)))
@@ -11337,7 +11338,7 @@ or a character."
 		     (= (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))
+		((or (> (upcase new) org-priority-highest) (< (upcase new) org-priority-lowest))
 		 (user-error
 		  (if nump
 		      "Priority must be between `%s' and `%s'"
@@ -11364,8 +11365,8 @@ or a character."
 			    org-priority-default
 			  (1+ org-priority-default))))))
 	 (t (user-error "Invalid action")))
-	(when (or (< (upcase new) org-priority-highest)
-		  (> (upcase new) org-priority-lowest))
+	(when (or (> (upcase new) org-priority-highest)
+		  (< (upcase new) org-priority-lowest))
 	  (if (and (memq action '(up down))
 		   (not have) (not (eq last-command this-command)))
 	      ;; `new' is from default priority
@@ -11377,12 +11378,26 @@ or a character."
 	;; 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)))
+        ;; Actually setting the priority isn’t so straightforward
+        ;; There are several cases
 	(if have
+            ;; ① have and remove
 	    (if remove
 		(replace-match "" t t nil 1)
-	      (replace-match news t t nil 2))
+              ;; ② have and not remove, i.e., update
+	      (let ((case-fold-search nil)) (looking-at org-priority-regexp))
+              (if (match-end 2)
+		  (progn
+		    (goto-char (match-end 2))
+                    (delete-region (match-beginning 2) (match-end 2))
+		    (insert news))
+	        (goto-char (match-end 1))
+	        (insert "[#" news "] "))
+              )
+          ;; ③ don’t have and remove — nonsense
 	  (if remove
 	      (user-error "No priority cookie found in line")
+            ;; ④ don’t have and not remove, i.e., insert
 	    (let ((case-fold-search nil)) (looking-at org-todo-line-regexp))
 	    (if (match-end 2)
 		(progn
@@ -11390,7 +11405,8 @@ or a character."
 		  (insert " [#" news "]"))
 	      (goto-char (match-beginning 3))
 	      (insert "[#" news "] "))))
-	(org-align-tags))
+	(org-align-tags)
+      (goto-char saved-position)
       (if remove
 	  (message "Priority removed")
 	(message "Priority of current item set to %s" news)))))

[-- Attachment #4: Type: text/plain, Size: 279 bytes --]


-- 
Dr Joseph A. Corneli (https://github.com/holtzermann17)

HYPERREAL ENTERPRISES LTD is a private company limited by shares, incorporated
25th, June 2019 as Company Number 634284 on the Register of Companies for
Scotland (https://beta.companieshouse.gov.uk/company/SC634284).

  reply	other threads:[~2021-08-09 14:13 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-09 13:06 [patch] priorities range reversed Joe Corneli via General discussions about Org-mode.
2021-08-09 13:51 ` Joe Corneli via General discussions about Org-mode. [this message]
2021-08-31 15:14   ` Timothy
2021-09-26 13:44 ` Bastien
2021-09-29 11:27   ` Bastien Guerry

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

  List information: https://www.orgmode.org/

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

  git send-email \
    --in-reply-to=87sfziwwso.fsf@Proteus \
    --to=emacs-orgmode@gnu.org \
    --cc=joseph.corneli.orgmode@hyperreal.enterprises \
    /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 public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).