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

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

[nongnu] elpa/projectile 20aa2adccc: Support `projectile-replace` to sel


From: ELPA Syncer
Subject: [nongnu] elpa/projectile 20aa2adccc: Support `projectile-replace` to select file extension on C-u (#1778)
Date: Sun, 28 Aug 2022 10:58:57 -0400 (EDT)

branch: elpa/projectile
commit 20aa2adccc1ecb19f54f2fbc428b4904071fcab8
Author: Ta Quang Trung <taquangtrung@users.noreply.github.com>
Commit: GitHub <noreply@github.com>

    Support `projectile-replace` to select file extension on C-u (#1778)
    
    This is to prevent projectile-replace from searching on very large files of 
a project (my Emacs hangs when projectile search on a 1MB Javascript library 
file, while I only wanted to search and replace on Rust code).
---
 CHANGELOG.md                              |  1 +
 doc/modules/ROOT/pages/configuration.adoc |  2 +-
 projectile.el                             | 95 ++++++++++++++++++++++++++-----
 3 files changed, 82 insertions(+), 16 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e1f14c4c83..5b4917a1aa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
 ### New features
 
 * [#1790](https://github.com/bbatsov/projectile/pull/1790): Add `src-dir` and 
`test-dir` properties for the mill project type.
+* [#1778](https://github.com/bbatsov/projectile/pull/1778): Allow 
`projectile-replace` to select file extensions when using prefix arg (`C-u`).
 * [#1757](https://github.com/bbatsov/projectile/pull/1757): Add support for 
the Pijul VCS.
 * [#1745](https://github.com/bbatsov/projectile/pull/1745): Allow 
`projectile-update-project-type` to change project type precedence and remove 
project options.
 * [#1699](https://github.com/bbatsov/projectile/pull/1699): 
`projectile-ripgrep` now supports [rg.el](https://github.com/dajva/rg.el).
diff --git a/doc/modules/ROOT/pages/configuration.adoc 
b/doc/modules/ROOT/pages/configuration.adoc
index 74242dbf58..3b36023d25 100644
--- a/doc/modules/ROOT/pages/configuration.adoc
+++ b/doc/modules/ROOT/pages/configuration.adoc
@@ -291,7 +291,7 @@ With this setting, after selecting a project to switch to, 
you'll be prompted to
 | Run multi-occur on project buffers.
 
 | kbd:[r]
-| Replace a string in the project.
+| Replace a string in the project (running with kbd:[C-u] will allow users to 
select file name patterns and extensions).
 
 | kbd:[s]
 | Switch project.
diff --git a/projectile.el b/projectile.el
index 237bcb05f8..555af192d4 100644
--- a/projectile.el
+++ b/projectile.el
@@ -77,6 +77,7 @@
 (declare-function fileloop-continue "fileloop")
 (declare-function fileloop-initialize-replace "fileloop")
 (declare-function tramp-archive-file-name-p "tramp-archive")
+(declare-function helm-grep-get-file-extensions "helm-grep")
 
 (declare-function ggtags-ensure-project "ext:ggtags")
 (declare-function ggtags-update-tags "ext:ggtags")
@@ -4368,9 +4369,9 @@ Returns a list of expanded filenames."
              t))))
 
 (defvar projectile-files-with-string-commands
-  '((rg . "rg -lF --no-heading --color never -- ")
-    (ag . "ag --literal --nocolor --noheading -l -- ")
-    (ack . "ack --literal --nocolor -l -- ")
+  '((rg . "rg -lF --no-heading --color never ")
+    (ag . "ag --literal --nocolor --noheading -l ")
+    (ack . "ack --literal --nocolor -l ")
     (git . "git grep -HlI ")
     ;; -r: recursive
     ;; -H: show filename for each match
@@ -4378,7 +4379,67 @@ Returns a list of expanded filenames."
     ;; -I: no binary files
     (grep . "grep -rHlI %s .")))
 
-(defun projectile-files-with-string (string directory)
+(defun projectile--rg-construct-command (search-term &optional file-ext)
+  "Construct Rg option to search files by the extension FILE-EXT."
+  (if (stringp file-ext)
+      (concat (cdr (assoc 'rg projectile-files-with-string-commands))
+              "-g '"
+              file-ext
+              "' "
+              search-term)
+    (concat (cdr (assoc 'rg projectile-files-with-string-commands))
+            search-term)))
+
+(defun projectile--ag-construct-command (search-term &optional file-ext)
+  "Construct Ag option to search files by the extension FILE-EXT."
+  (if (stringp file-ext)
+      (concat (cdr (assoc 'ag projectile-files-with-string-commands))
+              "-G "
+              (replace-regexp-in-string
+               "\\*" ""
+               (replace-regexp-in-string "\\." "\\\\." file-ext))
+              "$ "
+              search-term)
+    (concat (cdr (assoc 'ag projectile-files-with-string-commands))
+            search-term)))
+
+(defun projectile--ack-construct-command (search-term &optional file-ext)
+  "Construct Ack option to search files by the extension FILE-EXT."
+  (if (stringp file-ext)
+      (concat "ack -g '"
+              (replace-regexp-in-string
+               "\\*" ""
+               (replace-regexp-in-string "\\." "\\\\." file-ext))
+              "$' | "
+              (cdr (assoc 'ack projectile-files-with-string-commands))
+              "-x "
+              search-term)
+    (concat (cdr (assoc 'ack projectile-files-with-string-commands))
+            search-term)))
+
+(defun projectile--git-grep-construct-command (search-term &optional file-ext)
+  "Construct Grep option to search files by the extension FILE-EXT."
+  (if (stringp file-ext)
+      (concat (cdr (assoc 'git projectile-files-with-string-commands))
+              search-term
+              "  -- '"
+              file-ext
+              "'")
+    (concat (cdr (assoc 'git projectile-files-with-string-commands))
+            search-term)))
+
+(defun projectile--grep-construct-command (search-term &optional file-ext)
+  "Construct Grep option to search files by the extension FILE-EXT."
+  (if (stringp file-ext)
+      (concat (format (cdr (assoc 'grep projectile-files-with-string-commands))
+                      search-term)
+              " --include '"
+              file-ext
+              "'")
+    (format (cdr (assoc 'grep projectile-files-with-string-commands))
+            search-term)))
+
+(defun projectile-files-with-string (string directory &optional file-ext)
   "Return a list of all files containing STRING in DIRECTORY.
 
 Tries to use rg, ag, ack, git-grep, and grep in that order.  If those
@@ -4387,19 +4448,16 @@ files in the project."
   (if (projectile-unixy-system-p)
       (let* ((search-term (shell-quote-argument string))
              (cmd (cond ((executable-find "rg")
-                         (concat (cdr (assoc 'rg 
projectile-files-with-string-commands))
-                                 search-term))
+                         (projectile--rg-construct-command search-term 
file-ext))
                         ((executable-find "ag")
-                         (concat (cdr (assoc 'ag 
projectile-files-with-string-commands))
-                                 search-term))
+                         (projectile--ag-construct-command search-term 
file-ext))
                         ((executable-find "ack")
-                         (concat (cdr (assoc 'ack 
projectile-files-with-string-commands))
-                                 search-term))
+                         (projectile--ack-construct-command search-term 
file-ext))
                         ((and (executable-find "git")
                               (eq (projectile-project-vcs) 'git))
-                         (concat (cdr (assoc 'git 
projectile-files-with-string-commands)) search-term))
+                         (projectile--git-grep-construct-command search-term 
file-ext))
                         (t
-                         (format (cdr (assoc 'grep 
projectile-files-with-string-commands)) search-term)))))
+                         (projectile--grep-construct-command search-term 
file-ext)))))
         (projectile-files-from-cmd cmd directory))
     ;; we have to reject directories as a workaround to work with git 
submodules
     (cl-remove-if
@@ -4411,20 +4469,27 @@ files in the project."
 (defun projectile-replace (&optional arg)
   "Replace literal string in project using non-regexp `tags-query-replace'.
 
-With a prefix argument ARG prompts you for a directory on which
-to run the replacement."
+With a prefix argument ARG prompts you for a directory and file name patterns
+on which to run the replacement."
   (interactive "P")
   (let* ((directory (if arg
                         (file-name-as-directory
                          (read-directory-name "Replace in directory: "))
                       (projectile-acquire-root)))
+         (file-ext (if arg
+                       (if (fboundp #'helm-grep-get-file-extensions)
+                           (car (helm-grep-get-file-extensions (list 
directory)))
+                         (read-string
+                          (projectile-prepend-project-name
+                           "With file extension (empty string means all 
files): ")))
+                     nil))
          (old-text (read-string
                     (projectile-prepend-project-name "Replace: ")
                     (projectile-symbol-or-selection-at-point)))
          (new-text (read-string
                     (projectile-prepend-project-name
                      (format "Replace %s with: " old-text))))
-         (files (projectile-files-with-string old-text directory)))
+         (files (projectile-files-with-string old-text directory file-ext)))
     (if (fboundp #'fileloop-continue)
         ;; Emacs 27+
         (progn (fileloop-initialize-replace old-text new-text files 'default)



reply via email to

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