]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow searching for regexps with a prefix
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 21 Apr 2022 15:05:23 +0000 (17:05 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 21 Apr 2022 15:05:23 +0000 (17:05 +0200)
* doc/misc/info.texi (Search Index): Mention it.

* lisp/info.el (Info-find-node): Allow not signalling errors.
(Info-apropos-matches): Allow taking a regexp.
(info-apropos): Prefix now means looking for a regexp.

doc/misc/info.texi
etc/NEWS
lisp/info.el

index 6ebf60ce360b2009c1943d9b60409448c9bd4205..4db35ebf0fc1ac3a4d7f1beb7c5cbce7a9cebd9a 100644 (file)
@@ -1083,7 +1083,9 @@ If you aren't sure which manual documents the topic you are looking
 for, try the @kbd{M-x info-apropos} command in Emacs, or the @kbd{M-x
 index-apropos} command in the stand-alone reader.  It prompts for
 a string and then looks up that string in all the indices of all the
-Info documents installed on your system.
+Info documents installed on your system.  In Emacs, giving a prefix
+argument to the command will try to search for a regular expression
+instead of a string.
 
 @node Go to node
 @section @kbd{g} goes to a node by name
index 3442ebd81b311d5b6850c5dfdd2854d647307e5b..36db29bbbeb59da74bfedb9fb772d5c76194bdb5 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -763,6 +763,9 @@ This fills the region to be no wider than a specified pixel width.
 
 ** Info
 
++++
+*** 'M-x info-apropos' now takes a prefix argument to search for regexps.
+
 ---
 *** New command 'Info-goto-node-web' and key binding 'G'.
 This will take you to the gnu.org web server's version of the current
index 380a8e2780d16cf645e45fed7ddfd21ec31d15ee..8ca6c549791bdadae11099db157cd71d9e7c7d08 100644 (file)
@@ -907,17 +907,20 @@ find a node."
                       filename)))
       filename))))
 
-(defun Info-find-node (filename nodename &optional no-going-back strict-case)
+(defun Info-find-node (filename nodename &optional no-going-back strict-case
+                                noerror)
   "Go to an Info node specified as separate FILENAME and NODENAME.
 NO-GOING-BACK is non-nil if recovering from an error in this function;
 it says do not attempt further (recursive) error recovery.
 
 This function first looks for a case-sensitive match for NODENAME;
 if none is found it then tries a case-insensitive match (unless
-STRICT-CASE is non-nil)."
+STRICT-CASE is non-nil).
+
+If NOERROR, inhibit error messages when we can't find the node."
   (info-initialize)
   (setq nodename (info--node-canonicalize-whitespace nodename))
-  (setq filename (Info-find-file filename))
+  (setq filename (Info-find-file filename noerror))
   ;; Go into Info buffer.
   (or (derived-mode-p 'Info-mode) (switch-to-buffer "*info*"))
   ;; Record the node we are leaving, if we were in one.
@@ -3613,13 +3616,16 @@ MATCHES is a list of index matches found by `Info-apropos-matches'.")
                                (format " (line %s)" (nth 3 entry))
                              "")))))))))
 
-(defun Info-apropos-matches (string)
+(defun Info-apropos-matches (string &optional regexp)
   "Collect STRING matches from all known Info files on your system.
+If REGEXP, use regexp matching instead of literal matching.
 Return a list of matches where each element is in the format
 \((FILENAME INDEXTEXT NODENAME LINENUMBER))."
   (unless (string= string "")
     (let ((pattern (format "\n\\* +\\([^\n]*\\(%s\\)[^\n]*\\):[ \t]+\\([^\n]+\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
-                          (regexp-quote string)))
+                          (if regexp
+                               string
+                             (regexp-quote string))))
          (ohist Info-history)
          (ohist-list Info-history-list)
          (current-node Info-current-node)
@@ -3644,9 +3650,9 @@ Return a list of matches where each element is in the format
        (dolist (manual (nreverse manuals))
          (message "Searching %s" manual)
          (condition-case err
-             (if (setq nodes (Info-index-nodes (Info-find-file manual)))
+             (if (setq nodes (Info-index-nodes (Info-find-file manual t)))
                   (save-excursion
-                    (Info-find-node manual (car nodes))
+                    (Info-find-node manual (car nodes) nil nil t)
                     (while
                         (progn
                           (goto-char (point-min))
@@ -3673,19 +3679,22 @@ Return a list of matches where each element is in the format
       (or (nreverse matches) t))))
 
 ;;;###autoload
-(defun info-apropos (string)
-  "Grovel indices of all known Info files on your system for STRING.
-Build a menu of the possible matches."
-  (interactive "sIndex apropos: ")
+(defun info-apropos (string &optional regexp)
+  "Search indices of all known Info files on your system for STRING.
+If REGEXP (interactively, the prefix), use a regexp match.
+
+Display a menu of the possible matches."
+  (interactive "sIndex apropos: \nP")
   (if (equal string "")
       (Info-find-node Info-apropos-file "Top")
-    (let* ((nodes Info-apropos-nodes) nodename)
+    (let ((nodes Info-apropos-nodes)
+          nodename)
       (while (and nodes (not (equal string (nth 1 (car nodes)))))
        (setq nodes (cdr nodes)))
       (if nodes
-         (Info-find-node Info-apropos-file (car (car nodes)))
+         (Info-find-node Info-apropos-file (car (car nodes)) nil nil t)
        (setq nodename (format "Index for ā€˜%sā€™" string))
-       (push (list nodename string (Info-apropos-matches string))
+       (push (list nodename string (Info-apropos-matches string regexp))
              Info-apropos-nodes)
        (Info-find-node Info-apropos-file nodename)))))
 \f