Save position before searching for a search option in case of error

* lisp/org.el (org-open-file): Save position with `org-mark-ring-push'
  before calling `org-link-search'.
This commit is contained in:
Nicolas Goaziou 2017-01-17 10:42:13 +01:00
parent 1619aee376
commit 9e45783661
2 changed files with 28 additions and 14 deletions

View File

@ -195,6 +195,13 @@ Call ~org-agenda-set-restriction-lock~ from the agenda.
*** Computed dates in tables appear as inactive time stamps
*** Save point before opening a file with an unknown search option
When following a file link with a search option (e.g., =::#custom-id=)
that doesn't exist in the target file, save positon before raising an
error. As a consequence, it is possible to jump back to the original
document with ~org-mark-ring-goto~ (default binding =C-c &=).
* Version 9.0
** Incompatible changes

View File

@ -11362,12 +11362,19 @@ If the file does not exist, an error is thrown."
(search (concat file "::" search))
(t file)))
(dlink (downcase link))
(old-buffer (current-buffer))
(old-pos (point))
(old-mode major-mode)
(ext
(and (string-match "\\`.*?\\.\\([a-zA-Z0-9]+\\(\\.gz\\)?\\)\\'" dfile)
(match-string 1 dfile)))
(save-position-maybe
(let ((old-buffer (current-buffer))
(old-pos (point))
(old-mode major-mode))
(lambda ()
(and (derived-mode-p 'org-mode)
(eq old-mode 'org-mode)
(or (not (eq old-buffer (current-buffer)))
(not (eq old-pos (point))))
(org-mark-ring-push old-pos old-buffer)))))
cmd link-match-data)
(cond
((member in-emacs '((16) system))
@ -11441,7 +11448,12 @@ If the file does not exist, an error is thrown."
(widen)
(cond (line (org-goto-line line)
(when (derived-mode-p 'org-mode) (org-reveal)))
(search (org-link-search search))))
(search (condition-case err
(org-link-search search)
;; Save position before error-ing out so user
;; can easily move back to the original buffer.
(error (funcall save-position-maybe)
(error (nth 1 err)))))))
((functionp cmd)
(save-match-data
(set-match-data link-match-data)
@ -11450,23 +11462,18 @@ If the file does not exist, an error is thrown."
;; FIXME: Remove this check when most default installations
;; of Emacs have at least Org 9.0.
((debug wrong-number-of-arguments wrong-type-argument
invalid-function)
invalid-function)
(user-error "Please see Org News for version 9.0 about \
`org-file-apps'--Lisp error: %S" cmd)))))
((consp cmd)
;; FIXME: Remove this check when most default installations of
;; Emacs have at least Org 9.0.
;; Heads-up instead of silently fall back to
;; `org-link-frame-setup' for an old usage of `org-file-apps'
;; with sexp instead of a function for `cmd'.
;; Emacs have at least Org 9.0. Heads-up instead of silently
;; fall back to `org-link-frame-setup' for an old usage of
;; `org-file-apps' with sexp instead of a function for `cmd'.
(user-error "Please see Org News for version 9.0 about \
`org-file-apps'--Error: Deprecated usage of %S" cmd))
(t (funcall (cdr (assq 'file org-link-frame-setup)) file)))
(and (derived-mode-p 'org-mode)
(eq old-mode 'org-mode)
(or (not (eq old-buffer (current-buffer)))
(not (eq old-pos (point))))
(org-mark-ring-push old-pos old-buffer))))
(funcall save-position-maybe)))
(defun org-file-apps-entry-match-against-dlink-p (entry)
"This function returns non-nil if `entry' uses a regular