On 26 Oct 2024 at 17:59, Ihor Radchenko <yanta...@posteo.net> wrote:
> You can do something like (save-excursion (org-back-to-heading t) 
> (point-marker))
> This will move point back to the beginning of current heading, return
> marker corresponding to that point, and move back.
>

Indeed, thanks to
<https://org-roam.discourse.group/t/advice-for-an-org-follow-mode-following-org-org-roam-links/3631>
the final setup is the following, and works grand:

--8<---------------cut here---------------start------------->8---
(defvar sl/org-follow-preview-buffer nil)
(defun sl/org-follow-link ()
  "Automatically open the first link in the current line.
      When it is a file to open, the buffer will open in \"other\"
      window."
  (interactive)
  (when (and (member this-command '(previous-line next-line
                                    forward-char backward-char
                                    left-char right-char
                                    org-previous-link org-next-link))
             ;; This second condition may be part of the minor-mode function
             (derived-mode-p 'org-mode))
    (save-excursion
      ;; `cl-letf' is meant to ensure `file-file-other-window' to be used for
      ;; opening a file by temporarily changing the value of
      ;; `org-link-frame-setup' during evaluating the body.
      (cl-letf (((alist-get 'file org-link-frame-setup)
                 #'find-file-other-window))
        (let ((buffers-before-follow)
              (win (selected-window))
              (link
               (when
                   (or (org-in-regexp org-link-any-re)
                       (re-search-forward org-link-any-re
                                          (line-end-position) :t))
                 ;; It seems `org-element-link-parser' must be located at
                 ;; the beginning of the link at point.
                 (goto-char (match-beginning 0))
                 (org-element-link-parser))))
          (when link
            (when sl/org-follow-preview-buffer
              (kill-buffer sl/org-follow-preview-buffer)
              (setq sl/org-follow-preview-buffer nil))
            (setq buffers-before-follow (buffer-list))
            (org-link-open link)
            ;; Current buffer is the link target
            (unless (member (current-buffer) buffers-before-follow)
              (rename-buffer (concat "preview: " (buffer-name)))
              (setq sl/org-follow-preview-buffer (current-buffer))))
          (select-window win))))))

(define-minor-mode sl/org-follow-link-minor-mode
  "Automatically open the first link in the current line.
      When it is a file to open, the buffer will open in \"other\"
      window."
  :lighter " sfl" ;; The indicator for the mode line.
  (if sl/org-follow-link-minor-mode
      (add-hook 'post-command-hook #'sl/org-follow-link nil :local)
    (remove-hook 'post-command-hook #'sl/org-follow-link :local)))
--8<---------------cut here---------------end--------------->8---

Best
-- 
Sébastien Lerique
https://slvh.fr/

Reply via email to