summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2015-03-15 16:06:42 +0100
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2015-03-15 16:53:42 +0100
commit84d6ff4ec134c3b1ae2ba05c10eaeddc70f8d56f (patch)
treec1f29b36f5300b7f7512dc9cfed7432046223972
parent8cdb2eef0f9f98f9e00a5e689decfe341fe0c6ec (diff)
downloadorg-mode-84d6ff4ec134c3b1ae2ba05c10eaeddc70f8d56f.tar.gz
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.
-rwxr-xr-xlisp/org.el26
-rw-r--r--testing/lisp/test-org.el16
2 files changed, 31 insertions, 11 deletions
diff --git a/lisp/org.el b/lisp/org.el
index cc3e93a..7f417ce 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 afe72ae..0053a5d 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."