From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anders Waldenborg Subject: PATCH Make org-open-at-point only ask once Date: Sun, 28 Aug 2011 22:05:42 +0200 Message-ID: <20110828200542.GS5700@0x63.nu> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="7uYPyRQQ5N0D02nI" Return-path: Received: from eggs.gnu.org ([140.186.70.92]:47467) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qxlc3-0007Md-Hf for emacs-orgmode@gnu.org; Sun, 28 Aug 2011 16:05:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qxlc2-0004KS-DP for emacs-orgmode@gnu.org; Sun, 28 Aug 2011 16:05:47 -0400 Received: from 0x63.nu ([193.26.17.18]:52172 helo=gagarin.0x63.nu) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qxlc2-0004Js-4o for emacs-orgmode@gnu.org; Sun, 28 Aug 2011 16:05:46 -0400 Received: from andersg by gagarin.0x63.nu with local (Exim 3.36 #1 (Debian)) id 1Qxlby-00028I-00 for ; Sun, 28 Aug 2011 22:05:42 +0200 Content-Disposition: inline List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org --7uYPyRQQ5N0D02nI Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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)) --7uYPyRQQ5N0D02nI Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="org-open-at-point.patch" commit 54702f063ae2df48dec7f9feb80859a6b64002a4 Author: Anders Waldenborg 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 --7uYPyRQQ5N0D02nI Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="org-open-at-point-alternate.patch" 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) --7uYPyRQQ5N0D02nI--