summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2014-04-28 19:34:34 +0200
committerNicolas Goaziou <n.goaziou@gmail.com>2014-04-28 19:41:08 +0200
commit86a129c59799fe820933f7c2f97e100c92b10287 (patch)
treeec069891c4b392f1c010d1a78290239c9d864ebd
parent20e701e1df4527caff48c7af011317f670671763 (diff)
downloadorg-mode-86a129c59799fe820933f7c2f97e100c92b10287.tar.gz
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.
-rw-r--r--lisp/org.el27
-rw-r--r--testing/lisp/test-org.el16
2 files changed, 32 insertions, 11 deletions
diff --git a/lisp/org.el b/lisp/org.el
index 648a8bb..d20bb3d 100644
--- a/lisp/org.el
+++ b/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?"
diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el
index 069beb9..e8d8078 100644
--- a/testing/lisp/test-org.el
+++ b/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)