]> git.eshelyaron.com Git - emacs.git/commitdiff
apropos.el (apropos-words-to-regexp): Fix algorithm.
authorShigeru Fukaya <shigeru.fukaya@gmail.com>
Wed, 18 Dec 2013 04:46:49 +0000 (12:46 +0800)
committerChong Yidong <cyd@gnu.org>
Wed, 18 Dec 2013 04:46:49 +0000 (12:46 +0800)
* apropos.el (apropos-words-to-regexp): Fix algorithm.

Fixes: debbugs:13946
lisp/ChangeLog
lisp/apropos.el

index 96410c6c929ec56393ab80df3ec3b077ca953250..fa79352e7a24ed1938d4806007cec1f45889fe71 100644 (file)
@@ -1,3 +1,7 @@
+2013-12-18  Shigeru Fukaya <shigeru.fukaya@gmail.com>
+
+       * apropos.el (apropos-words-to-regexp): Fix algorithm (Bug#13946).
+
 2013-12-18  Glenn Morris  <rgm@gnu.org>
 
        * Makefile.in (BYTE_COMPILE_FLAGS): Set load-prefer-newer to t.
index 7a1a6f6a75aba1c78d9c27de017bc05034264c51..b7c5aaddcb17c3bbe8d00dd76a8ccf716c86e072 100644 (file)
@@ -341,16 +341,21 @@ before finding a label."
 
 \f
 (defun apropos-words-to-regexp (words wild)
-  "Make regexp matching any two of the words in WORDS."
-  (concat "\\("
-         (mapconcat 'identity words "\\|")
-         "\\)"
-         (if (cdr words)
-             (concat wild
-                     "\\("
-                     (mapconcat 'identity words "\\|")
-                     "\\)")
-           "")))
+  "Make regexp matching any two of the words in WORDS.
+WILD should be a subexpression matching wildcards between matches."
+  (setq words (delete-dups (copy-sequence words)))
+  (if (null (cdr words))
+      (car words)
+    (mapconcat
+     (lambda (w)
+       (concat "\\(?:" w "\\)" ;; parens for synonyms
+               wild "\\(?:"
+               (mapconcat 'identity
+                         (delq w (copy-sequence words))
+                         "\\|")
+               "\\)"))
+     words
+     "\\|")))
 
 ;;;###autoload
 (defun apropos-read-pattern (subject)