Squash yet another bug due to outline-functions skipping invisible headings.

Bernt Hansen writes:

> I think I have something that is reproducible.
>
> ,----[ /tmp/x.org ]
> |
> | * Refile Targets
> | ** TODO One
> | ** TODO Two
> | ** TODO Three
> | ** TODO Four
> | ** TODO Five
> | ** TODO Six
> | *** TODO Six.one
> | *** TODO Six.two
> | **** TODO Clock me
> | ** TODO Seven
> | ** TODO Eight
> | ** TODO Nine
> | ** TODO Ten
> | * Refile Tasks
> | ** TODO Refile Me
> `----
>
> ,----[ /tmp/minimal.emacs ]
> | (add-to-list 'load-path (expand-file-name "~/git/org-mode/lisp"))
> | (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode))
> | (require 'org-install)
> |
> | (global-set-key "\C-cl" 'org-store-link)
> | (global-set-key "\C-ca" 'org-agenda)
> | (global-set-key "\C-cb" 'org-iswitchb)
> |
> | (setq org-log-done (quote time))
> | (setq org-log-into-drawer t)
> | (setq org-agenda-files '("/tmp/x.org"))
> | (setq user-init-file "/tmp/custom.el")
> |
> | (setq org-refile-allow-creating-parent-nodes nil)
> | (setq org-refile-targets (quote ((nil :maxlevel . 2) (org-agenda-files :maxlevel . 2))))
> | (setq org-refile-use-outline-path nil)
> | (setq org-todo-keywords (quote ((sequence "TODO(t!)" "STARTED(s!)" "|" "DONE(d!/!)") (sequence "WAITING(w@/!)" "SOMEDAY(S!)" "OPEN(O@)" "|" "CANCELLED(c@/!)") (sequence "QUOTE(q!)" "QUOTED(Q!)" "|" "APPROVED(A@)" "EXPIRED(E@)" "REJECTED(R@)"))))
> `----
>
> Steps to reproduce:
>
>  1. Save the files /tmp/x.org and /tmp/minimal.emacs
>  2. emacs -q -l /tmp/minimal.emacs /tmp/x.org
>  3. Go to CONTENTS view with S-TAB twice
>  4. Put point on **** TODO Clock Me
>  5. Clock in the task with C-c C-x C-i
>
>     This adds a logbook drawer with the clock
>
>  6. Fold to OVERVIEW view with S-TAB
>
>     So it looks like this
>
>     ,----[ x.org folder ]
>     |
>     | * Refile Targets...
>     | * Refile Tasks...
>     `----
>
>  7. M-x org-clock-goto
>
>     This reveals the buffer like so:
>
>     ,----
>     |
>     | * Refile Targets...
>     | **** TODO Clock me
>     |      :LOGBOOK:...
>     | ...
>     | * Refile Tasks...
>     `----
>
>     I think this is the critical step.
>
>  8. Put point on Refile Tasks
>  9. Show task to refile with TAB
>  10. Put point on ** TODO Refile Me
>  11. Refile to Ten with C-c C-w Ten RET
>  12. Put point on Refile Me
>  13. Reveal with C-c C-r
>
>      Shows that we are under TODO Ten.  So far so good
>
>      ,----
>      |
>      | * Refile Targets...
>      | **** TODO Clock me
>      |      :LOGBOOK:...
>      | ...
>      | ** TODO Ten
>      | *** TODO Refile Me
>      | * Refile Tasks
>      `----
>
>  14. Now repeat steps 10-13 but refile to 'Two' instead of 'Ten'
>
>      This goes to the wrong place.  This files under Nine for me
>
>      ,----
>      |
>      | * Refile Targets...
>      | **** TODO Clock me
>      |      :LOGBOOK:...
>      | ...
>      | ** TODO Nine
>      | *** TODO Refile Me
>      | ** TODO Ten
>      | * Refile Tasks
>      `----
>
>  15. Repeat steps 10-13 with refiling to 'Two' each time
>
>      This moves Refile Me up one task at a time until it gets to Two
>      ie. it refiles to Eight, then Seven, then Six, then Five, then
>      Four then Three, then Two.
>
> If you show contents view with S-TAB and then refile it goes to the
> right place immediately.  So this definitely has something to do with
> the folded view of the org file.
>
This commit is contained in:
Carsten Dominik 2009-08-28 08:45:46 +02:00
parent bbc27c011a
commit 10d59f78bb
2 changed files with 34 additions and 8 deletions

View File

@ -1,3 +1,15 @@
2009-08-28 Carsten Dominik <carsten.dominik@gmail.com>
* org.el (org-move-subtree-down): Use `org-get-next-sibling' and
`org-get-last-sibling' instead of the outline versions of these
functions.
(org-get-last-sibling): New function.
(org-refile): Use `org-get-next-sibling' instead of the outline
version of this function.
(org-clean-visibility-after-subtree-move): Use
`org-get-next-sibling' and `org-get-last-sibling' instead of the
outline versions of these functions.
2009-08-27 Carsten Dominik <carsten.dominik@gmail.com> 2009-08-27 Carsten Dominik <carsten.dominik@gmail.com>
* org-agenda.el (org-prepare-agenda): When creating a new frame * org-agenda.el (org-prepare-agenda): When creating a new frame

View File

@ -5203,13 +5203,13 @@ This function is the default value of the hook `org-cycle-hook'."
;; First, find a reasonable region to look at: ;; First, find a reasonable region to look at:
;; Start two siblings above, end three below ;; Start two siblings above, end three below
(let* ((beg (save-excursion (let* ((beg (save-excursion
(and (outline-get-last-sibling) (and (org-get-last-sibling)
(outline-get-last-sibling)) (org-get-last-sibling))
(point))) (point)))
(end (save-excursion (end (save-excursion
(and (outline-get-next-sibling) (and (org-get-next-sibling)
(outline-get-next-sibling) (org-get-next-sibling)
(outline-get-next-sibling)) (org-get-next-sibling))
(if (org-at-heading-p) (if (org-at-heading-p)
(point-at-eol) (point-at-eol)
(point)))) (point))))
@ -6099,8 +6099,8 @@ is signaled in this case."
"Move the current subtree down past ARG headlines of the same level." "Move the current subtree down past ARG headlines of the same level."
(interactive "p") (interactive "p")
(setq arg (prefix-numeric-value arg)) (setq arg (prefix-numeric-value arg))
(let ((movfunc (if (> arg 0) 'outline-get-next-sibling (let ((movfunc (if (> arg 0) 'org-get-next-sibling
'outline-get-last-sibling)) 'org-get-last-sibling))
(ins-point (make-marker)) (ins-point (make-marker))
(cnt (abs arg)) (cnt (abs arg))
beg beg0 end txt folded ne-beg ne-end ne-ins ins-end) beg beg0 end txt folded ne-beg ne-end ne-ins ins-end)
@ -8719,7 +8719,7 @@ See also `org-refile-use-outline-path' and `org-completion-use-ido'"
(goto-char (goto-char
(if reversed (if reversed
(or (outline-next-heading) (point-max)) (or (outline-next-heading) (point-max))
(or (save-excursion (outline-get-next-sibling)) (or (save-excursion (org-get-next-sibling))
(org-end-of-subtree t t) (org-end-of-subtree t t)
(point-max))))) (point-max)))))
(setq level 1) (setq level 1)
@ -16686,6 +16686,20 @@ This is like outline-next-sibling, but invisible headings are ok."
nil nil
(point)))) (point))))
(defun org-get-last-sibling ()
"Move to previous heading of the same level, and return point.
If there is no such heading, return nil."
(let ((opoint (point))
(level (funcall outline-level)))
(outline-previous-heading)
(when (and (/= (point) opoint) (outline-on-heading-p t))
(while (and (> (funcall outline-level) level)
(not (bobp)))
(outline-previous-heading))
(if (< (funcall outline-level) level)
nil
(point)))))
(defun org-end-of-subtree (&optional invisible-OK to-heading) (defun org-end-of-subtree (&optional invisible-OK to-heading)
;; This contains an exact copy of the original function, but it uses ;; This contains an exact copy of the original function, but it uses
;; `org-back-to-heading', to make it work also in invisible ;; `org-back-to-heading', to make it work also in invisible