bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#49836: Support ripgrep in semantic-symref-tool-grep


From: Dmitry Gutov
Subject: bug#49836: Support ripgrep in semantic-symref-tool-grep
Date: Thu, 5 Aug 2021 06:03:08 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0

On 05.08.2021 00:23, Juri Linkov wrote:
I think the original idea (surrounding with \W) is sound: after all, not
every symbol boundary in Emacs sense is a word boundary in Grep or RG. If
a method, say, ends with ?, then it won't be.
I tried to search for 'soap-type-is-array?' in the Emacs tree,
and ripgrep can find it with "\\b%s\\b", but Grep can't.

Did you search through symref, or in console? If the former, it seems some regexp-quoting is missing somewhere (the question mark was no escaped). Because see what the console says:

$ rg "\bsoap-type-is-array?\b"
lisp/net/soap-client.el
950:(defun soap-type-is-array? (type)
990:                       (if (soap-type-is-array? type)

ChangeLog.2
19080:  * lisp/net/soap-client.el (soap-type-is-array?): new defun

$ rg "\bsoap-type-is-array\?\b"

^^ no matches

And

$ rg "\bsoap-type-is-array\?"

has matches, of course.

It would be more preferable not to change the existing default logic
to avoid possible troubles.  Since Grep with Basic syntax works fine,
then better not to switch to Extended syntax.

See above. But also consider what happens if a user sees that grep-program is now customizable and ripgrep is an officially supported value. They change it to "rg", and then suddenly their 'M-x rgrep' input has to use the extended regexp format?

Worse than that, any third-party package that uses grep-find-template will suddenly have a high chance of failing if they pass any nontrivial regexps to it, especially if those have groupings or alternations.

It's a hard problem: grep.el is not prepared for abstracting like that. If we at least standardized it internally on Extended format, that would at least remove one source of uncertainty and bugs. The user still can input basic regexps interactively, we can translate them easily.

Further: seeing xref-search-program-alist, people asked for support for other similar programs, such as ag and pt. Any solution we end up with, we should try to ensure they are valid values of grep-program as well.

The new user option is already used in many places in grep.el
in the previous patch, so it should be ok to use it in semantic-symref
as well:

diff --git a/lisp/cedet/semantic/symref/grep.el 
b/lisp/cedet/semantic/symref/grep.el
index 180d779a78..b7d08409aa 100644
--- a/lisp/cedet/semantic/symref/grep.el
+++ b/lisp/cedet/semantic/symref/grep.el
@@ -150,15 +150,22 @@ semantic-symref-perform-search
                             "-l ")
                            ((eq (oref tool searchtype) 'regexp)
                             "-nE ")
-                          (t "-n ")))
+                          (t (if (equal grep-program "rg")
+                                 ;; TODO: remove this after ripgrep is fixed 
(bug#49836)
+                                 (unless (string-search "rg <C> -nH" 
grep-find-template)
+                                   "-n ")
+                               "-n "))))

I'm actually fine with this part.

           (greppat (cond ((eq (oref tool searchtype) 'regexp)
                           (oref tool searchfor))
                          (t
                           ;; Can't use the word boundaries: Grep
                           ;; doesn't always agree with the language
                           ;; syntax on those.
-                         (format "\\(^\\|\\W\\)%s\\(\\W\\|$\\)"
-                                 (oref tool searchfor)))))
+                         (if (equal grep-program "rg")
+                             (format "(^|\\W)%s(\\W|$)"
+                                     (oref tool searchfor))
+                           (format "\\(^\\|\\W\\)%s\\(\\W\\|$\\)"
+                                   (oref tool searchfor))))))

This can work. Except the comparison should be with "grep", I think: all other alternatives only work with the Extended format.





reply via email to

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