Hi! If an org buffer is narrowed, and one tries to do org-open-at-point on a link that points to outside of the restriction it asks: "No match - create this as a new heading?". When answering no the buffer is widened and the reseach is done, and if the link still can't be resolved the question is asked again.
For nonexistant links this happens even if the buffer isn't narrowed - one needs to answer "n" twice. I also attached an alternate patch which (IMHO) simplifies the implementation by hiding the hard work in a macro, and as a bonus it only calls org-link-search once. But it is much more intrusive. anders ;; simple testcase to show the bug (progn (insert "* A\n\n* B\n\n[[A]]") (org-narrow-to-subtree) (org-open-at-point))
commit 54702f063ae2df48dec7f9feb80859a6b64002a4 Author: Anders Waldenborg <and...@0x63.nu> Date: Sat Aug 27 21:18:46 2011 +0200 Make org-open-at-point only ask once whether new header should be created. When following "thisfile" links org-open-at-point is kind enough to retry org-link-search again after widening the buffer it can't be found. However org-link-search also asks the question "No match - create this as a new heading? (y or n)" when target can't be found. This means that the question is asked twice when following a nonexistent link and answering no. This is fixed by setting org-link-search-inhibit-query in first try, so only second invocation asks the question. diff --git a/lisp/org.el b/lisp/org.el index d63b854..781de88 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9537,7 +9537,8 @@ application the system uses for this file type." ((equal arg '(16)) ''org-occur) (t nil)) ,pos))) - (condition-case nil (eval cmd) + (condition-case nil (let ((org-link-search-inhibit-query t)) + (eval cmd)) (error (progn (widen) (eval cmd)))))) (t
diff --git a/lisp/org-macs.el b/lisp/org-macs.el index 13aff02..153a041 100644 --- a/lisp/org-macs.el +++ b/lisp/org-macs.el @@ -414,6 +414,24 @@ the value in cdr." (cons (list (car flat) (cadr flat)) (org-make-parameter-alist (cddr flat))))) +(defmacro org-widen-and-maybe-renarrow (&rest BODY) + "Widen buffer and evaluate body, and if point is outside +the previously narrowed-to region after evaluation permanetly +lift the restriction." + (declare (indent defun)) + (org-with-gensyms (res pnt) + `(let ((,res) + (,pnt)) + (save-restriction + (widen) + (setq ,res ,@BODY) + (setq ,pnt (point))) + (when (or (< ,pnt (point-min)) + (> ,pnt (point-max))) + (widen) + (goto-char ,pnt)) + ,res))) + (provide 'org-macs) ;;; org-macs.el ends here diff --git a/lisp/org.el b/lisp/org.el index d63b854..efe936e 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9531,15 +9531,12 @@ application the system uses for this file type." (switch-to-buffer-other-window (org-get-buffer-for-internal-link (current-buffer))) (org-mark-ring-push)) - (let ((cmd `(org-link-search - ,path - ,(cond ((equal arg '(4)) ''occur) - ((equal arg '(16)) ''org-occur) - (t nil)) - ,pos))) - (condition-case nil (eval cmd) - (error (progn (widen) (eval cmd)))))) - + (org-widen-and-maybe-renarrow + (org-link-search path + (cond ((equal arg '(4)) 'occur) + ((equal arg '(16)) 'org-occur) + (t nil)) + pos))) (t (browse-url-at-point))))))) (move-marker org-open-link-marker nil)