From 84d6ff4ec134c3b1ae2ba05c10eaeddc70f8d56f Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Sun, 15 Mar 2015 16:06:42 +0100 Subject: [PATCH] Fix `org-entry-delete' with accumulated properties * lisp/org.el (org-entry-delete): Remove all occurrences of accumulated properties, too. Return a non-nil value when some property was removed. * testing/lisp/test-org.el (test-org/entry-delete): Add test. --- lisp/org.el | 26 ++++++++++++++++---------- testing/lisp/test-org.el | 16 +++++++++++++++- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index cc3e93a80..7f417ce26 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -15753,21 +15753,27 @@ If yes, return this value. If not, return the current value of the variable." (symbol-value var)))) (defun org-entry-delete (pom property) - "Delete the property PROPERTY from entry at point-or-marker POM." + "Delete PROPERTY from entry at point-or-marker POM. +Accumulated properties, i.e. PROPERTY+, are also removed. Return +non-nil when a property was removed." (unless (member property org-special-properties) (org-with-point-at pom (let ((range (org-get-property-block))) (when range - (let ((begin (car range)) - (end (copy-marker (cdr range)))) + (let* ((begin (car range)) + (origin (cdr range)) + (end (copy-marker origin)) + (re (org-re-property + (concat (regexp-quote property) "\\+?") t t))) (goto-char begin) - (when (re-search-forward (org-re-property property nil t) end t) - (delete-region (match-beginning 0) (line-beginning-position 2)) - ;; If drawer is empty, remove it altogether. - (when (= begin end) - (delete-region (line-beginning-position 0) - (line-beginning-position 2))) - (set-marker end nil)))))))) + (while (re-search-forward re end t) + (delete-region (match-beginning 0) (line-beginning-position 2))) + ;; If drawer is empty, remove it altogether. + (when (= begin end) + (delete-region (line-beginning-position 0) + (line-beginning-position 2))) + ;; Return non-nil if some property was removed. + (prog1 (/= end origin) (set-marker end nil)))))))) ;; Multi-values properties are properties that contain multiple values ;; These values are assumed to be single words, separated by whitespace. diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index afe72aee2..0053a5d72 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -2706,13 +2706,27 @@ Text. (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:B: 2\n:END:" (org-entry-delete (point) "A") (buffer-string)))) + ;; Also remove accumulated properties. + (should-not + (string-match + ":A" + (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:A+: 2\n:B: 3\n:END:" + (org-entry-delete (point) "A") + (buffer-string)))) ;; When last property is removed, remove the property drawer. (should-not (string-match ":PROPERTIES:" (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:END:\nParagraph" (org-entry-delete (point) "A") - (buffer-string))))) + (buffer-string)))) + ;; Return a non-nil value when some property was removed. + (should + (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:B: 2\n:END:" + (org-entry-delete (point) "A"))) + (should-not + (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:B: 2\n:END:" + (org-entry-delete (point) "C")))) (ert-deftest test-org/entry-get () "Test `org-entry-get' specifications." -- 2.11.4.GIT