diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2014-04-28 19:34:34 +0200 |
---|---|---|
committer | Nicolas Goaziou <n.goaziou@gmail.com> | 2014-04-28 19:41:08 +0200 |
commit | 86a129c59799fe820933f7c2f97e100c92b10287 (patch) | |
tree | ec069891c4b392f1c010d1a78290239c9d864ebd | |
parent | 20e701e1df4527caff48c7af011317f670671763 (diff) | |
download | org-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.el | 27 | ||||
-rw-r--r-- | testing/lisp/test-org.el | 16 |
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) |