瀏覽代碼

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.
Nicolas Goaziou 10 年之前
父節點
當前提交
84d6ff4ec1
共有 2 個文件被更改,包括 31 次插入11 次删除
  1. 16 10
      lisp/org.el
  2. 15 1
      testing/lisp/test-org.el

+ 16 - 10
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.

+ 15 - 1
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."