emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [BUG] org-up-heading-safe navigates above top heading [9.5.5 (release_9.5.5 @ /opt/homebrew/Cellar/emacs-plus@28/28.2/share/emacs/28.2/lisp/org/)]
@ 2023-07-23 14:24 Daniel Liden
  2023-07-26  8:03 ` Ihor Radchenko
  0 siblings, 1 reply; 2+ messages in thread
From: Daniel Liden @ 2023-07-23 14:24 UTC (permalink / raw)
  To: emacs-orgmode


[-- Attachment #1.1: Type: text/plain, Size: 4483 bytes --]

Summary: I started to encounter some errors while using the org-fc package
after. I traced it back to a change in behaviour from org-up-heading-safe
following some updates to my system. I did not see this change documented.

Old behavior: org-up-heading-safe will not move the point above the top
headline in an org hierarchy (e.g. if there is text above a top-level
headline.)

New behavior: org-up-heading-safe *will* move the point above the top
headline in an org hierarchy (e.g. if there is text above a top-level
headline.)

Unfortunately, I'm not sure what version exactly I updated from. However,
see example, I did look at the diff for org-up-heading-safe and found this—
https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=dfd36d1969ce2c33f5899e97c02fa62544735977.
The older version has the expected behavior (well, the behavior I
expected); the newer version will go up above the top headline.

See attached org file with (hopefully) reproducible example.

Emacs  : GNU Emacs 28.2 (build 2, aarch64-apple-darwin22.4.0, NS
appkit-2299.50 Version 13.3.1 (Build 22E261))
 of 2023-05-01
Package: Org mode version 9.5.5 (release_9.5.5 @
/opt/homebrew/Cellar/emacs-plus@28/28.2/share/emacs/28.2/lisp/org/)

current state:
==============
(setq
 org-link-elisp-confirm-function 'yes-or-no-p
 org-bibtex-headline-format-function #[257 "\300 \236A\207" [:title] 3
"\n\n(fn ENTRY)"]
 org-export-before-parsing-hook '(org-attach-expand-links)
 org-archive-hook '(org-attach-archive-delete-maybe)
 org-cycle-hook '(org-cycle-hide-archived-subtrees org-cycle-hide-drawers
org-cycle-show-empty-lines
 org-optimize-window-after-visibility-change)
 org-mode-hook '(#[0 "\300\301\302\303\304$\207" [add-hook
change-major-mode-hook org-show-all append local] 5]
#[0 "\300\301\302\303\304$\207" [add-hook change-major-mode-hook
org-babel-show-result-all append local] 5]
org-babel-result-hide-spec org-babel-hide-all-hashes)
 org-confirm-shell-link-function 'yes-or-no-p
 outline-isearch-open-invisible-function 'outline-isearch-open-invisible
 org-agenda-before-write-hook '(org-agenda-add-entry-text)
 org-src-mode-hook '(org-src-babel-configure-edit-buffer
org-src-mode-configure-edit-buffer)
 org-confirm-elisp-link-function 'yes-or-no-p
 org-speed-command-hook '(org-speed-command-activate
org-babel-speed-command-activate)
 org-tab-first-hook '(org-babel-hide-result-toggle-maybe
org-babel-header-arg-expand)
 org-link-shell-confirm-function 'yes-or-no-p
 org-babel-pre-tangle-hook '(save-buffer)
 org-agenda-loop-over-headlines-in-active-region nil
 org-occur-hook '(org-first-headline-recenter)
 org-metadown-hook '(org-babel-pop-to-session-maybe)
 org-link-parameters '(("attachment" :follow org-attach-follow :complete
org-attach-complete-link) ("id" :follow org-id-open)
      ("eww" :follow org-eww-open :store org-eww-store-link)
      ("rmail" :follow org-rmail-open :store org-rmail-store-link)
      ("mhe" :follow org-mhe-open :store org-mhe-store-link)
      ("irc" :follow org-irc-visit :store org-irc-store-link :export
org-irc-export)
      ("info" :follow org-info-open :export org-info-export :store
org-info-store-link)
      ("gnus" :follow org-gnus-open :store org-gnus-store-link)
      ("docview" :follow org-docview-open :export org-docview-export :store
org-docview-store-link)
      ("bibtex" :follow org-bibtex-open :store org-bibtex-store-link)
      ("bbdb" :follow org-bbdb-open :export org-bbdb-export :complete
org-bbdb-complete-link :store
org-bbdb-store-link)
      ("w3m" :store org-w3m-store-link) ("doi" :follow org-link-doi-open
:export org-link-doi-export) ("file+sys")
      ("file+emacs") ("shell" :follow org-link--open-shell)
      ("news" :follow #[514 "\301\300\302 Q \"\207" ["news" browse-url ":"]
6 "\n\n(fn URL ARG)"])
      ("mailto" :follow #[514 "\301\300\302 Q \"\207" ["mailto" browse-url
":"] 6 "\n\n(fn URL ARG)"])
      ("https" :follow #[514 "\301\300\302 Q \"\207" ["https" browse-url
":"] 6 "\n\n(fn URL ARG)"])
      ("http" :follow #[514 "\301\300\302 Q \"\207" ["http" browse-url ":"]
6 "\n\n(fn URL ARG)"])
      ("ftp" :follow #[514 "\301\300\302 Q \"\207" ["ftp" browse-url ":"] 6
"\n\n(fn URL ARG)"])
      ("help" :follow org-link--open-help :store org-link--store-help)
("file" :complete org-link-complete-file)
      ("elisp" :follow org-link--open-elisp))
 org-metaup-hook '(org-babel-load-in-session-maybe)
 )

[-- Attachment #1.2: Type: text/html, Size: 6272 bytes --]

[-- Attachment #2: org-up-heading-safe-example.org --]
[-- Type: application/octet-stream, Size: 2981 bytes --]

Some Text before the Header
* Header 1
** Header 2
*** Header 3

If you run (org-up-heading-safe) repeatedly on the above, the point will end up *above* the top heading.

Now execute the block below to replace the current version of ~org-up-heading-safe~ with the previous version

#+begin_src emacs-lisp
  (defun org-up-heading-safe ()
  "Move to the heading line of which the present line is a subheading.
This version will not throw an error.  It will return the level of the
headline found, or nil if no higher level is found.

Also, this function will be a lot faster than `outline-up-heading',
because it relies on stars being the outline starters.  This can really
make a significant difference in outlines with very many siblings."
  (let ((element (and (org-element--cache-active-p)
                      (org-element-at-point nil t))))
    (if element
        (let* ((current-heading (org-element-lineage element '(headline inlinetask) 'with-self))
               (parent (org-element-lineage current-heading 'headline)))
          (if (and parent
                   (<= (point-min) (org-element-begin parent)))
              (progn
                (goto-char (org-element-begin parent))
                (org-element-property :level parent))
            (when (and current-heading
                       (<= (point-min) (org-element-begin current-heading)))
              (goto-char (org-element-begin current-heading))
              nil)))
      (when (ignore-errors (org-back-to-heading t))
        (let (level-cache)
          (unless org--up-heading-cache
            (setq org--up-heading-cache (make-hash-table)))
          (if (and (eq (buffer-chars-modified-tick) org--up-heading-cache-tick)
                   (setq level-cache (gethash (point) org--up-heading-cache)))
              (when (<= (point-min) (car level-cache) (point-max))
                ;; Parent is inside accessible part of the buffer.
                (progn (goto-char (car level-cache))
                       (cdr level-cache)))
            ;; Buffer modified.  Invalidate cache.
            (unless (eq (buffer-chars-modified-tick) org--up-heading-cache-tick)
              (setq-local org--up-heading-cache-tick
                          (buffer-chars-modified-tick))
              (clrhash org--up-heading-cache))
            (let* ((level-up (1- (funcall outline-level)))
                   (pos (point))
                   (result (and (> level-up 0)
	                        (re-search-backward
                                 (format "^\\*\\{1,%d\\} " level-up) nil t)
	                        (funcall outline-level))))
              (when result (puthash pos (cons (point) result) org--up-heading-cache))
              result)))))))
#+end_src

#+RESULTS:
: org-up-heading-safe

Navigate below ~*** Header 3~ below and again call ~(org-up-heading-safe)~ repeatedly. The point will not end up above the top headline.


Some Text before the Header
* Header 1
** Header 2
*** Header 3

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [BUG] org-up-heading-safe navigates above top heading [9.5.5 (release_9.5.5 @ /opt/homebrew/Cellar/emacs-plus@28/28.2/share/emacs/28.2/lisp/org/)]
  2023-07-23 14:24 [BUG] org-up-heading-safe navigates above top heading [9.5.5 (release_9.5.5 @ /opt/homebrew/Cellar/emacs-plus@28/28.2/share/emacs/28.2/lisp/org/)] Daniel Liden
@ 2023-07-26  8:03 ` Ihor Radchenko
  0 siblings, 0 replies; 2+ messages in thread
From: Ihor Radchenko @ 2023-07-26  8:03 UTC (permalink / raw)
  To: Daniel Liden; +Cc: emacs-orgmode

Daniel Liden <djliden91@gmail.com> writes:

> Summary: I started to encounter some errors while using the org-fc package
> after. I traced it back to a change in behaviour from org-up-heading-safe
> following some updates to my system. I did not see this change documented.
>
> Old behavior: org-up-heading-safe will not move the point above the top
> headline in an org hierarchy (e.g. if there is text above a top-level
> headline.)
>
> New behavior: org-up-heading-safe *will* move the point above the top
> headline in an org hierarchy (e.g. if there is text above a top-level
> headline.)

Thanks for reporting!
Fixed, on main.
https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=dc78f0946

This function was not test-covered and not fully documented. Now, it is.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-07-26  8:04 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-23 14:24 [BUG] org-up-heading-safe navigates above top heading [9.5.5 (release_9.5.5 @ /opt/homebrew/Cellar/emacs-plus@28/28.2/share/emacs/28.2/lisp/org/)] Daniel Liden
2023-07-26  8:03 ` Ihor Radchenko

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).