From: Dmitry Gutov Date: Fri, 6 Nov 2015 03:08:51 +0000 (+0200) Subject: Move and rename xref-find-regexp to the project package X-Git-Tag: emacs-25.0.90~862^2~4 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3a37d99e974b89de91e07ce5c7955f4fd1d731ca;p=emacs.git Move and rename xref-find-regexp to the project package * lisp/progmodes/project.el (project-find-regexp) (project--read-regexp) (project--find-regexp-in): New functions. * lisp/progmodes/xref.el (xref--find-xrefs): Extract from xref--show-xrefs. Use in existing callers in place of that function. (xref--show-xrefs): Only do the "show" part. (xref-find-regexp): Rename, more or less, to project-or-libraries-find-regexp. --- diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el index ba831204bf2..f67a584f808 100644 --- a/lisp/progmodes/project.el +++ b/lisp/progmodes/project.el @@ -199,5 +199,54 @@ DIRS must contain directory names." (hack-dir-local-variables-non-file-buffer) (symbol-value var))) +(declare-function grep-read-files "grep") +(declare-function xref-collect-matches "xref") +(declare-function xref--show-xrefs "xref") + +;;;###autoload +(defun project-find-regexp (regexp) + "Find all matches for REGEXP in the current project. +With \\[universal-argument] prefix, you can specify the directory +to search in, and the file name pattern to search for." + (interactive (list (project--read-regexp))) + (let* ((pr (project-current)) + (dirs (if current-prefix-arg + (list (read-directory-name "Base directory: " + nil default-directory t)) + (project-roots pr)))) + (project--find-regexp-in dirs regexp pr))) + +;;;###autoload +(defun project-or-libraries-find-regexp (regexp) + "Find all matches for REGEXP in the current project or libraries. +With \\[universal-argument] prefix, you can specify the file name +pattern to search for." + (interactive (list (project--read-regexp))) + (let* ((pr (project-current)) + (dirs (append + (project-roots pr) + (project-library-roots pr)))) + (project--find-regexp-in dirs regexp pr))) + +(defun project--read-regexp () + (defvar xref-identifier-at-point-function) + (require 'xref) + (read-regexp "Find regexp" + (funcall xref-identifier-at-point-function))) + +(defun project--find-regexp-in (dirs regexp project) + (require 'grep) + (let* ((files (if current-prefix-arg + (grep-read-files regexp) + "*")) + (xrefs (cl-mapcan + (lambda (dir) + (xref-collect-matches regexp files dir + (project-ignores project dir))) + dirs))) + (unless xrefs + (user-error "No matches for: %s" regexp)) + (xref--show-xrefs xrefs nil))) + (provide 'project) ;;; project.el ends here diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index 3aa85cb900d..89a06046ca2 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -664,6 +664,8 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)." ;; This part of the UI seems fairly uncontroversial: it reads the ;; identifier and deals with the single definition case. +;; (FIXME: do we really want this case to be handled like that in +;; "find references" and "find regexp searches"?) ;; ;; The controversial multiple definitions case is handed off to ;; xref-show-xrefs-function. @@ -675,18 +677,15 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)." (defvar xref--read-pattern-history nil) -(defun xref--show-xrefs (input kind arg window) - (let* ((xrefs (funcall xref-find-function kind arg))) - (cond - ((null xrefs) - (user-error "No %s found for: %s" (symbol-name kind) input)) - ((not (cdr xrefs)) - (xref-push-marker-stack) - (xref--pop-to-location (car xrefs) window)) - (t - (xref-push-marker-stack) - (funcall xref-show-xrefs-function xrefs - `((window . ,window))))))) +(defun xref--show-xrefs (xrefs window) + (cond + ((not (cdr xrefs)) + (xref-push-marker-stack) + (xref--pop-to-location (car xrefs) window)) + (t + (xref-push-marker-stack) + (funcall xref-show-xrefs-function xrefs + `((window . ,window)))))) (defun xref--prompt-p (command) (or (eq xref-prompt-for-identifier t) @@ -714,8 +713,14 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)." ;;; Commands +(defun xref--find-xrefs (input kind arg window) + (let ((xrefs (funcall xref-find-function kind arg))) + (unless xrefs + (user-error "No %s found for: %s" (symbol-name kind) input)) + (xref--show-xrefs xrefs window))) + (defun xref--find-definitions (id window) - (xref--show-xrefs id 'definitions id window)) + (xref--find-xrefs id 'definitions id window)) ;;;###autoload (defun xref-find-definitions (identifier) @@ -749,35 +754,7 @@ display the list in a buffer." "Find references to the identifier at point. With prefix argument, prompt for the identifier." (interactive (list (xref--read-identifier "Find references of: "))) - (xref--show-xrefs identifier 'references identifier nil)) - -;; TODO: Rename and move to project-find-regexp, as soon as idiomatic -;; usage of xref from other packages has stabilized. -;;;###autoload -(defun xref-find-regexp (regexp) - "Find all matches for REGEXP. -With \\[universal-argument] prefix, you can specify the directory -to search in, and the file name pattern to search for." - (interactive (list (xref--read-identifier "Find regexp: "))) - (require 'grep) - (let* ((proj (project-current)) - (files (if current-prefix-arg - (grep-read-files regexp) - "*")) - (dirs (if current-prefix-arg - (list (read-directory-name "Base directory: " - nil default-directory t)) - (append - (project-roots proj) - (project-library-roots proj)))) - (xref-find-function - (lambda (_kind regexp) - (cl-mapcan - (lambda (dir) - (xref-collect-matches regexp files dir - (project-ignores proj dir))) - dirs)))) - (xref--show-xrefs regexp 'matches regexp nil))) + (xref--find-xrefs identifier 'references identifier nil)) (declare-function apropos-parse-pattern "apropos" (pattern)) @@ -789,7 +766,7 @@ The argument has the same meaning as in `apropos'." "Search for pattern (word list or regexp): " nil 'xref--read-pattern-history))) (require 'apropos) - (xref--show-xrefs pattern 'apropos + (xref--find-xrefs pattern 'apropos (apropos-parse-pattern (if (string-equal (regexp-quote pattern) pattern) ;; Split into words @@ -833,7 +810,6 @@ and just use etags." (declare-function semantic-symref-find-references-by-name "semantic/symref") (declare-function semantic-find-file-noselect "semantic/fw") -(declare-function grep-read-files "grep") (declare-function grep-expand-template "grep") (defun xref-collect-references (symbol dir)