On 2014-12-16 22:54, Nicolas Goaziou <m...@nicolasgoaziou.fr> writes:

> I think "*headline" links should assume this variable is non-nil,
> notwithstanding its real value. Of course, a `query-to-create' value
> still makes sense.
>
> WDYT?

I'm fine with this. Here is the patch extended to take this into
account, which is mostly deleting all the code that deals with headline
match when `org-link-search-must-match-exact-headline' is nil.

From d94259f988b84a73df4bc4111cd0b569b31e56e5 Mon Sep 17 00:00:00 2001
From: Alan Schmitt <alan.schm...@polytechnique.org>
Date: Fri, 12 Dec 2014 08:26:05 +0100
Subject: [PATCH] Function `org-link-search' does exact headline search

* lisp/org.el (org-link-search): Change headline search such that it
always does an exact search.

* doc/org.texi (External links): Cleanup footnote about the
`org-link-search-must-match-exact-headline' option for text searches
and add a footnote about the effect of the same option for heading
searches.
---
 doc/org.texi |  7 +++++--
 lisp/org.el  | 27 +++++++--------------------
 2 files changed, 12 insertions(+), 22 deletions(-)

diff --git a/doc/org.texi b/doc/org.texi
index 7c464ca..7a91f70 100644
--- a/doc/org.texi
+++ b/doc/org.texi
@@ -3559,10 +3559,13 @@ file:projects.org::some words             @r{text search in Org file}@footnote{
 The actual behavior of the search will depend on the value of
 the option @code{org-link-search-must-match-exact-headline}.  If its value
 is @code{nil}, then a fuzzy text search will be done.  If it is t, then only the
-exact headline will be matched.  If the value is @code{'query-to-create},
+exact headline will be matched.  If the value is @code{query-to-create},
 then an exact headline will be searched; if it is not found, then the user
 will be queried to create it.}
-file:projects.org::*task title            @r{heading search in Org file}
+file:projects.org::*task title            @r{heading search in Org file}@footnote{
+Headline searches always match the exact headline. If the headline is not
+found and the value of the option @code{org-link-search-must-match-exact-headline}
+is @code{query-to-create}, then the user will be queried to create it.}
 file+sys:/path/to/file                    @r{open via OS, like double-click}
 file+emacs:/path/to/file                  @r{force opening by Emacs}
 docview:papers/last.pdf::NNN              @r{open in doc-view mode at page}
diff --git a/lisp/org.el b/lisp/org.el
index 1383d76..4ddb4b0 100755
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -11062,8 +11062,7 @@ visibility around point, thus ignoring
 						    org-emphasis-alist)
 					    "\\|") "\\)"))
 	(pos (point))
-	(pre nil) (post nil)
-	words re0 re1 re2 re3 re4_ re4 re5 re2a re2a_ reall)
+	words re0 re2 re4_ re4 re5 re2a re2a_ reall)
     (cond
      ;; First check if there are any special search functions
      ((run-hook-with-args-until-success 'org-execute-file-search-functions s))
@@ -11117,8 +11116,9 @@ visibility around point, thus ignoring
        ((derived-mode-p 'org-mode)
 	(org-occur (match-string 1 s)))
        (t (org-do-occur (match-string 1 s)))))
-     ((and (derived-mode-p 'org-mode) org-link-search-must-match-exact-headline)
-      (and (equal (string-to-char s) ?*) (setq s (substring s 1)))
+     ((and (derived-mode-p 'org-mode)
+	   (or (and (equal (string-to-char s) ?*) (setq s (substring s 1)))
+	       org-link-search-must-match-exact-headline))
       (goto-char (point-min))
       (cond
        ((let (case-fold-search)
@@ -11140,11 +11140,6 @@ visibility around point, thus ignoring
 	(error "No match"))))
      (t
       ;; A normal search string
-      (when (equal (string-to-char s) ?*)
-	;; Anchor on headlines, post may include tags.
-	(setq pre "^\\*+[ \t]+\\(?:\\sw+\\)?[ \t]*"
-	      post (org-re "[ \t]*\\(?:[ \t]+:[[:alnum:]_@#%:+]:[ \t]*\\)?$")
-	      s (substring s 1)))
       (remove-text-properties
        0 (length s)
        '(face nil mouse-face nil keymap nil fontified nil) s)
@@ -11161,15 +11156,9 @@ visibility around point, thus ignoring
 					  "[^a-zA-Z_\r\n]+") "\\)[^a-zA-Z_]")
 	    re4 (concat "[^a-zA-Z_]" re4_)
 
-	    re1 (concat pre re2 post)
-	    re3 (concat pre (if pre re4_ re4) post)
-	    re5 (concat pre ".*" re4)
-	    re2 (concat pre re2)
-	    re2a (concat pre (if pre re2a_ re2a))
-	    re4 (concat pre (if pre re4_ re4))
-	    reall (concat "\\(" re0 "\\)\\|\\(" re1 "\\)\\|\\(" re2
-			  "\\)\\|\\(" re3 "\\)\\|\\(" re4 "\\)\\|\\("
-			  re5 "\\)"))
+	    re5 (concat ".*" re4)
+	    reall (concat "\\(" re0 "\\)\\|\\(" re2 "\\)\\|\\(" re4
+			  "\\)\\|\\(" re5 "\\)"))
       (cond
        ((eq type 'org-occur) (org-occur reall))
        ((eq type 'occur) (org-do-occur (downcase reall) 'cleanup))
@@ -11177,10 +11166,8 @@ visibility around point, thus ignoring
 	  (setq type 'fuzzy)
 	  (if (or (and (org-search-not-self 1 re0 nil t)
 		       (setq type 'dedicated))
-		  (org-search-not-self 1 re1 nil t)
 		  (org-search-not-self 1 re2 nil t)
 		  (org-search-not-self 1 re2a nil t)
-		  (org-search-not-self 1 re3 nil t)
 		  (org-search-not-self 1 re4 nil t)
 		  (org-search-not-self 1 re5 nil t))
 	      (goto-char (match-beginning 1))
-- 
2.2.0

Best,

Alan

-- 
OpenPGP Key ID : 040D0A3B4ED2E5C7

Attachment: signature.asc
Description: PGP signature

Reply via email to