From 13a1a4fb960b0141f6f9f888f6559e8328e4af16 Mon Sep 17 00:00:00 2001 From: Bastien Guerry Date: Tue, 27 Apr 2021 09:41:26 +0200 Subject: [PATCH] Be more consistent about treating tags as case-sensitive * lisp/org-agenda.el (org-agenda-finalize): (org-agenda-format-item): Do not downcase tags. (org-downcase-keep-props): Remove unused function. (org-agenda-filter-expand-tags): Do not case-fold search. * lisp/org.el (org-tags-expand): Document `downcased' argument as obsolete and do not allow to expand downcased tags. * testing/lisp/test-org.el (test-org/tags-expand): Remove test for downcased tags expansion. * doc/org-manual.org (TODO keywords, tags, properties, etc.): Suggest that user-defined are usually lowercase, but don't make it a requirement. Reported-by: David Masterson Link: https://orgmode.org/list/SJ0PR03MB5455D8D0C4F71AA495A9ABF79B709@SJ0PR03MB5455.namprd03.prod.outlook.com/ --- doc/org-manual.org | 2 +- lisp/org-agenda.el | 14 ++++---------- lisp/org.el | 14 +++++--------- testing/lisp/test-org.el | 9 +-------- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/doc/org-manual.org b/doc/org-manual.org index 2ded91c3f..c58e57c11 100644 --- a/doc/org-manual.org +++ b/doc/org-manual.org @@ -344,7 +344,7 @@ conventions: - =boss=, =ARCHIVE= :: - Tags are case-sensitive. User-defined tags are written in + Tags are case-sensitive. User-defined tags are usually written in lowercase; built-in tags with special meaning are written as they should appear in the document, usually with all capitals. diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 3e93b80d0..773f82a0a 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -3919,7 +3919,7 @@ agenda display, configure `org-agenda-finalize-hook'." (put-text-property (point-at-bol) (point-at-eol) 'tags (org-with-point-at mrk - (mapcar #'downcase (org-get-tags))))))))) + (org-get-tags)))))))) (setq org-agenda-represented-tags nil org-agenda-represented-categories nil) (when org-agenda-top-headline-filter @@ -6731,7 +6731,7 @@ Any match of REMOVE-RE will be removed from TXT." (remove-text-properties 0 (length rtn) '(line-prefix t wrap-prefix t) rtn) (org-add-props rtn nil 'org-category category - 'tags (mapcar 'org-downcase-keep-props tags) + 'tags tags 'org-priority-highest org-priority-highest 'org-priority-lowest org-priority-lowest 'time-of-day time-of-day @@ -6776,12 +6776,6 @@ The modified list may contain inherited tags, and tags matched by (if have-i "::" ":")))))) txt) -(defun org-downcase-keep-props (s) - (let ((props (text-properties-at 0 s))) - (setq s (downcase s)) - (add-text-properties 0 (length s) props s) - s)) - (defvar org-agenda-sorting-strategy) ;; because the def is in a let form (defun org-agenda-add-time-grid-maybe (list ndays todayp) @@ -8074,7 +8068,7 @@ If the line does not have an effort defined, return nil." When NO-OPERATOR is non-nil, do not add the + operator to returned tags." (if org-group-tags - (let ((case-fold-search t) rtn) + (let (case-fold-search rtn) (mapc (lambda (f) (let (f0 dir) @@ -8082,7 +8076,7 @@ returned tags." (setq dir (match-string 1 f) f0 (match-string 2 f)) (setq dir (if no-operator "" "+") f0 f)) (setq rtn (append (mapcar (lambda(f1) (concat dir f1)) - (org-tags-expand f0 t t)) + (org-tags-expand f0 t)) rtn)))) filter) (reverse rtn)) diff --git a/lisp/org.el b/lisp/org.el index 47511b15f..d972c63ef 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -11760,22 +11760,18 @@ When the optional argument SINGLE-AS-LIST is non-nil, MATCH is assumed to be a single group tag, and the function will return the list of tags in this group. -When DOWNCASED is non-nil, expand downcased TAGS." +The DOWNCASED argument is obsolete and has no effect." (unless (org-string-nw-p match) (error "Invalid match tag: %S" match)) (let ((tag-groups - (let ((g (or org-tag-groups-alist-for-agenda org-tag-groups-alist))) - (if (not downcased) g - (mapcar (lambda (s) (mapcar #'downcase s)) g))))) + (or org-tag-groups-alist-for-agenda org-tag-groups-alist))) (cond - (single-as-list (org--tags-expand-group - (list (if downcased (downcase match) match)) - tag-groups nil)) + (single-as-list (org--tags-expand-group (list match) tag-groups nil)) (org-group-tags (let* ((case-fold-search t) (tag-syntax org-mode-syntax-table) (group-keys (mapcar #'car tag-groups)) (key-regexp (concat "\\([+-]?\\)" (regexp-opt group-keys 'words))) - (return-match (if downcased (downcase match) match))) + (return-match match)) ;; Mark regexp-expressions in the match-expression so that we ;; do not replace them later on. (let ((s 0)) @@ -11795,7 +11791,7 @@ When DOWNCASED is non-nil, expand downcased TAGS." m ;regexp tag: ignore (let* ((operator (match-string 1 m)) (tag-token (let ((tag (match-string 2 m))) - (list (if downcased (downcase tag) tag)))) + (list tag))) regexp-tags regular-tags) ;; Partition tags between regexp and regular tags. ;; Remove curly bracket syntax from regexp tags. diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 78cd29576..f71118d63 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -7172,14 +7172,7 @@ Paragraph" (equal "{A+}" (org-test-with-temp-text "#+TAGS: [ A : B C ]" (org-mode-restart) - (let ((org-tag-alist-for-agenda nil)) (org-tags-expand "{A+}"))))) - ;; Uppercase MATCH works with a non-nil DOWNCASED and SINGLE-AS-LIST. - (should - (equal (list "a" "b" "c") - (org-test-with-temp-text "#+TAGS: [ A : B C ]" - (org-mode-restart) - (let ((org-tag-alist-for-agenda nil)) - (sort (org-tags-expand "A" t t) #'string-lessp)))))) + (let ((org-tag-alist-for-agenda nil)) (org-tags-expand "{A+}")))))) ;;; TODO keywords