소스 검색

Fix `org-flag-drawer'

* lisp/org.el (org-flag-drawer): Do not flag drawer when point is on
  an empty line after it.  When hiding the drawer away, make sure
  point always stays in a visible part of the buffer.

* testing/lisp/test-org.el (test-org/flag-drawer): Add tests.
Nicolas Goaziou 11 년 전
부모
커밋
86a129c597
2개의 변경된 파일32개의 추가작업 그리고 11개의 파일을 삭제
  1. 17 10
      lisp/org.el
  2. 15 1
      testing/lisp/test-org.el

+ 17 - 10
lisp/org.el

@@ -7181,16 +7181,23 @@ visibility state."
 Otherwise make it visible.  When optional argument ELEMENT is
 a parsed drawer, as returned by `org-element-at-point', hide or
 show that drawer instead."
-  (let ((drawer (or element (org-element-at-point))))
-    (when (memq (org-element-type drawer) '(drawer property-drawer))
-      (save-excursion
-	(goto-char (org-element-property :post-affiliated drawer))
-	(outline-flag-region
-	 (line-end-position)
-	 (progn (goto-char (org-element-property :end drawer))
-		(skip-chars-backward " \r\t\n")
-		(line-end-position))
-	 flag)))))
+  (when (save-excursion
+	  (beginning-of-line)
+	  (org-looking-at-p org-drawer-regexp))
+    (let ((drawer (or element (org-element-at-point))))
+      (when (memq (org-element-type drawer) '(drawer property-drawer))
+	(let ((post (org-element-property :post-affiliated drawer)))
+	  (save-excursion
+	    (outline-flag-region
+	     (progn (goto-char post) (line-end-position))
+	     (progn (goto-char (org-element-property :end drawer))
+		    (skip-chars-backward " \r\t\n")
+		    (line-end-position))
+	     flag))
+	  ;; When the drawer is hidden away, make sure point lies in
+	  ;; a visible part of the buffer.
+	  (when (and flag (> (line-beginning-position) post))
+	    (goto-char post)))))))
 
 (defun org-subtree-end-visible-p ()
   "Is the end of the current subtree visible?"

+ 15 - 1
testing/lisp/test-org.el

@@ -1566,7 +1566,21 @@ Text.
    (org-test-with-temp-text ":D:\nparagraph"
      (forward-line 1)
      (org-flag-drawer t)
-     (get-char-property (line-end-position) 'invisible))))
+     (get-char-property (line-end-position) 'invisible)))
+  ;; Do not hide drawers when called from final blank lines.
+  (should-not
+   (org-test-with-temp-text ":DRAWER:\nA\n:END:\n\n"
+     (goto-char (point-max))
+     (org-flag-drawer t)
+     (goto-char (point-min))
+     (get-char-property (line-end-position) 'invisible)))
+  ;; Don't leave point in an invisible part of the buffer when hiding
+  ;; a drawer away.
+  (should-not
+   (org-test-with-temp-text ":DRAWER:\ncontents\n:END:"
+     (goto-char (point-max))
+     (org-flag-drawer t)
+     (get-char-property (point) 'invisible))))
 
 
 (provide 'test-org)