emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/urgrep 567453969e 2/3: Add integration with Xref


From: ELPA Syncer
Subject: [elpa] externals/urgrep 567453969e 2/3: Add integration with Xref
Date: Tue, 21 Nov 2023 00:58:45 -0500 (EST)

branch: externals/urgrep
commit 567453969e1765e099160076179dde5eed97ea3f
Author: Jim Porter <jporterbugs@gmail.com>
Commit: Jim Porter <jporterbugs@gmail.com>

    Add integration with Xref
---
 NEWS.md        |  4 ++++
 README.md      |  7 +++++++
 urgrep-xref.el | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+)

diff --git a/NEWS.md b/NEWS.md
index 188175f020..6afeac661c 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,10 @@
 
 ## v0.3.0 (in progress)
 
+### New features
+- Add optional `urgrep-xref` feature, which lets Xref use Urgrep to create the
+  command for searching in files/directories
+
 ### Bug fixes
 - Respect buffer-local values of `urgrep-preferred-tools`
 
diff --git a/README.md b/README.md
index 987ff9ddd0..865ec8697f 100644
--- a/README.md
+++ b/README.md
@@ -86,6 +86,12 @@ This also works with connection-local variables:
 Urgrep can hook into wgrep to support this as well. To enable this, just load
 `urgrep-wgrep.el`.
 
+### Using with Xref
+
+[Xref][xref] lets you search through your projects to find strings, identifiers
+etc. You can make Xref use Urgrep to generate its search command by loading
+`urgrep-xref.el`.
+
 ### Using with Eshell
 
 In Eshell buffers, you can call `urgrep` much like you'd call any command-line
@@ -132,5 +138,6 @@ can discuss the best way to do things.
 [grep]: https://www.gnu.org/software/grep/
 [find]: https://www.gnu.org/software/findutils/
 [wgrep]: https://github.com/mhayashi1120/Emacs-wgrep
+[xref]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Xref.html
 [fsf-copyright]: 
https://www.gnu.org/prep/maintain/html_node/Copyright-Papers.html
 [new-issue]: https://github.com/jimporter/urgrep/issues/new
diff --git a/urgrep-xref.el b/urgrep-xref.el
new file mode 100644
index 0000000000..2a1d89d3da
--- /dev/null
+++ b/urgrep-xref.el
@@ -0,0 +1,61 @@
+;;; urgrep-xref.el --- Universal recursive grep -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021-2023 Free Software Foundation, Inc.
+
+;; Author: Jim Porter
+;; URL: https://github.com/jimporter/urgrep
+;; Version: 0.3.0-git
+;; Keywords: grep, search
+
+;; This file is NOT part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by the Free
+;; Software Foundation, either version 3 of the License, or (at your option)
+;; any later version.
+
+;; This program is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+;; more details.
+
+;; You should have received a copy of the GNU General Public License along with
+;; this program.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; A compatibility layer between urgrep and xref.
+
+;;; Code:
+
+(require 'urgrep)
+
+(defalias 'urgrep--remove-directories
+  (if (>= emacs-major-version 30)
+      #'identity
+    (lambda (files)
+      "Work around Emacs bug#66806."
+      (seq-filter (lambda (i) (not (file-directory-p i))) files))))
+
+(defun urgrep--xref-matches-in-files (oldfun regexp files)
+  "Override `xref-matches-in-files' to use `urgrep-command'."
+  (cl-letf* ((xargs-max-chars
+              (and (memq system-type '(windows-nt ms-dos))
+                   "-s 10000 "))
+             (old-grep-expand-template (symbol-function 'grep-expand-template))
+             ((symbol-function 'grep-expand-template)
+              (lambda (_template regexp)
+                (setf (symbol-function 'grep-expand-template)
+                      old-grep-expand-template)
+                (concat "xargs -0 " xargs-max-chars
+                        (urgrep-command regexp :regexp 'ere :group nil
+                                        :color nil :root nil)))))
+    (funcall oldfun regexp (urgrep--remove-directories files))))
+
+(advice-add #'xref-matches-in-files :around #'urgrep--xref-matches-in-files)
+
+(defun urgrep-xref-unload-function ()
+  (advice-remove #'xref-matches-in-files #'urgrep--xref-matches-in-files))
+
+(provide 'urgrep-xref)
+;;; urgrep-xref.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]