]> git.eshelyaron.com Git - emacs.git/commitdiff
Add basic xref apropos implementation to elisp-mode
authorDmitry Gutov <dgutov@yandex.ru>
Fri, 26 Dec 2014 16:34:47 +0000 (18:34 +0200)
committerDmitry Gutov <dgutov@yandex.ru>
Fri, 26 Dec 2014 16:34:47 +0000 (18:34 +0200)
* lisp/progmodes/elisp-mode.el (elisp--xref-find-definitions):
Filter out nil results.
(elisp--xref-find-apropos): New function.
(elisp-xref-find): Use it.

* lisp/progmodes/xref.el (xref--show-xrefs): Use `user-error'.

lisp/ChangeLog
lisp/progmodes/elisp-mode.el
lisp/progmodes/xref.el

index a2bee149b7f158bb7ebac77364e738adb6034193..4c6b23dac0b4c48ce20a5864e82f332a6bfdf800 100644 (file)
@@ -1,3 +1,14 @@
+2014-12-26  Dmitry Gutov  <dgutov@yandex.ru>
+
+       Add basic xref apropos implementation to elisp-mode.
+
+       * progmodes/elisp-mode.el (elisp--xref-find-definitions):
+       Filter out nil results.
+       (elisp--xref-find-apropos): New function.
+       (elisp-xref-find): Use it.
+
+       * progmodes/xref.el (xref--show-xrefs): Use `user-error'.
+
 2014-12-25  Helmut Eller  <eller.helmut@gmail.com>
             Dmitry Gutov  <dgutov@yandex.ru>
 
index e73c20df2639ee5bd46fa75f87416cf01bb161c7..ef619f0899ad8ef9fa5e68985f18e2aabe31ce08 100644 (file)
@@ -577,27 +577,39 @@ It can be quoted, or be inside a quoted form."
 (declare-function xref-make "xref" (description location))
 
 (defun elisp-xref-find (action id)
-  (when (eq action 'definitions)
-    (let ((sym (intern-soft id)))
-      (when sym
-        (remove nil (elisp--xref-find-definitions sym))))))
+  (pcase action
+    (`definitions
+      (let ((sym (intern-soft id)))
+        (when sym
+          (elisp--xref-find-definitions sym))))
+    (`apropos
+     (elisp--xref-find-apropos id))))
 
 (defun elisp--xref-find-definitions (symbol)
   (save-excursion
-    (mapcar
-     (lambda (type)
-       (let ((loc
-              (condition-case err
-                  (let ((buf-pos (elisp--identifier-location type symbol)))
-                    (when buf-pos
-                      (xref-make-buffer-location (car buf-pos)
-                                                 (or (cdr buf-pos) 1))))
-                (error
-                 (xref-make-bogus-location (error-message-string err))))))
-         (when loc
-           (xref-make (format "(%s %s)" type symbol)
-                      loc))))
-     elisp--identifier-types)))
+    (let (lst)
+      (dolist (type elisp--identifier-types)
+        (let ((loc
+               (condition-case err
+                   (let ((buf-pos (elisp--identifier-location type symbol)))
+                     (when buf-pos
+                       (xref-make-buffer-location (car buf-pos)
+                                                  (or (cdr buf-pos) 1))))
+                 (error
+                  (xref-make-bogus-location (error-message-string err))))))
+          (when loc
+            (push
+             (xref-make (format "(%s %s)" type symbol)
+                        loc)
+             lst))))
+      lst)))
+
+(defun elisp--xref-find-apropos (regexp)
+  (apply #'nconc
+         (let (lst)
+           (dolist (sym (apropos-internal regexp))
+            (push (elisp--xref-find-definitions sym) lst))
+           (nreverse lst))))
 
 (defun elisp--xref-identifier-completion-table ()
   elisp--identifier-completion-table)
index 02e02de4e9efc06149f0f5295c474b3490a044ba..21c0d6aa6a482a9d9bccb0c6c33946a5d3248773 100644 (file)
@@ -414,7 +414,7 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
 (defun xref--show-xrefs (id kind xrefs window)
   (cond
    ((null xrefs)
-    (error "No known %s for: %s" kind id))
+    (user-error "No known %s for: %s" kind id))
    ((not (cdr xrefs))
     (xref-push-marker-stack)
     (xref--pop-to-location (xref--xref-location (car xrefs)) window))