[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/urgrep 3082d89bd9 099/115: Add support for abbreviating
From: |
ELPA Syncer |
Subject: |
[elpa] externals/urgrep 3082d89bd9 099/115: Add support for abbreviating the command in urgrep buffers |
Date: |
Wed, 10 May 2023 03:00:48 -0400 (EDT) |
branch: externals/urgrep
commit 3082d89bd9b13c46f1ac755dac0464af850ee330
Author: Jim Porter <jporterbugs@gmail.com>
Commit: Jim Porter <jporterbugs@gmail.com>
Add support for abbreviating the command in urgrep buffers
---
urgrep.el | 153 ++++++++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 109 insertions(+), 44 deletions(-)
diff --git a/urgrep.el b/urgrep.el
index b50c1df103..a1f9bb7088 100644
--- a/urgrep.el
+++ b/urgrep.el
@@ -42,6 +42,11 @@
:group 'tools
:group 'processes)
+(defcustom urgrep-abbreviate-command t
+ "If non-nil, hide uninteresting parts of the command in the Urgrep buffer."
+ :type 'boolean
+ :group 'urgrep)
+
(defcustom urgrep-group-matches t
"If non-nil, group matches by the file they were found in."
:type 'boolean
@@ -170,6 +175,41 @@ and escapes null characters."
(concat "^" (funcall to-re prefix) esc "("
(mapconcat to-re suffixes (concat esc "|")) esc ")$")))))
+(defun urgrep--maybe-shell-quote-argument (argument)
+ "Quote ARGUMENT if needed for passing to an inferior shell.
+This works as `shell-quote-argument', but avoids quoting unnecessarily
+for MS shells."
+ (if (and (or (eq system-type 'ms-dos)
+ (and (eq system-type 'windows-nt) (w32-shell-dos-semantics)))
+ (not (string-match "[^-0-9a-zA-Z_./=]" argument)))
+ argument
+ (shell-quote-argument argument)))
+
+(defun urgrep--flatten-arguments (tree &optional abbrs)
+ "Flatten a TREE of arguments into a single shell-quoted string.
+This also finds sublists with the `:abbreviate' key and adds the
+`abbreviated-command' text property to the resulting substring.
+
+If ABBRS is non-nil, it should be a list of abbreviations to use,
+one for each `:abbreviate' key found."
+ (let (elems)
+ (while (consp tree)
+ (catch 'abbreviated
+ (let ((elem (pop tree)))
+ (while (consp elem)
+ (when (eq (car elem) :abbreviate)
+ (push (propertize
+ (mapconcat #'urgrep--maybe-shell-quote-argument
+ (flatten-list (cdr elem)) " ")
+ 'abbreviated-command (or (pop abbrs) t))
+ elems)
+ (throw 'abbreviated t))
+ (push (cdr elem) tree)
+ (setq elem (car elem)))
+ (when elem (push (urgrep--maybe-shell-quote-argument elem) elems)))))
+ (when tree (push (urgrep--maybe-shell-quote-argument tree) elems))
+ (string-join (nreverse elems) " ")))
+
(defmacro urgrep--with-killed-local-variable (variable &rest body)
"Execute the forms in BODY with VARIABLE temporarily non-local."
(declare (indent 1))
@@ -206,8 +246,16 @@ as in `urgrep-command'."
((string-match "<C>" grep-find-template)))
(setq grep-find-template
(replace-match (concat "<C> " args) t t grep-find-template))))
- (let ((case-fold-search nil))
- (rgrep-default-command query files nil))))
+ (let* ((case-fold-search nil)
+ (command (rgrep-default-command query files nil)))
+ (save-match-data
+ ;; Hide excessive part of rgrep command.
+ (when (string-match
+ "^find \\(\\(?:-H \\)?\\. -type d .*\\(?:\\\\)\\|\")\"\\)\\)"
+ command)
+ (put-text-property (match-beginning 1) (match-end 1)
+ 'abbreviated-command t command)))
+ command)))
(defun urgrep--rgrep-process-setup ()
"Set up environment variables for rgrep.
@@ -224,8 +272,8 @@ See also `grep-process-setup'."
`((ugrep
(executable-name . "ugrep")
(regexp-syntax bre ere pcre)
- (arguments executable color "-n" "--ignore-files" file-wildcards group
- context case-fold regexp "-e" query)
+ (arguments executable (:abbreviate color "-n" "--ignore-files")
+ file-wildcards group context case-fold regexp "-e" query)
(regexp-arguments ('bre '("-G"))
('ere '("-E"))
('pcre '("-P"))
@@ -243,8 +291,8 @@ See also `grep-process-setup'."
(ripgrep
(executable-name . "rg")
(regexp-syntax pcre)
- (arguments executable color file-wildcards group context case-fold regexp
- "--" query)
+ (arguments executable (:abbreviate color) file-wildcards group context
+ case-fold regexp "--" query)
(regexp-arguments ('nil '("-F")))
(case-fold-arguments ((pred identity) '("-i")))
(file-wildcards-arguments
@@ -260,8 +308,8 @@ See also `grep-process-setup'."
(ag
(executable-name . "ag")
(regexp-syntax pcre)
- (arguments executable color file-wildcards group context case-fold regexp
- "--" query)
+ (arguments executable (:abbreviate color) file-wildcards group context
+ case-fold regexp "--" query)
(regexp-arguments ('nil '("-Q")))
(case-fold-arguments ('nil '("-s"))
(_ '("-i")))
@@ -276,8 +324,8 @@ See also `grep-process-setup'."
(ack
(executable-name . "ack")
(regexp-syntax pcre)
- (arguments executable color file-wildcards group context case-fold regexp
- "--" query)
+ (arguments executable (:abbreviate color) file-wildcards group context
+ case-fold regexp "--" query)
(regexp-arguments ('nil '("-Q")))
(case-fold-arguments ((pred identity) '("-i")))
(file-wildcards-arguments
@@ -296,9 +344,10 @@ See also `grep-process-setup'."
;; with people who want to customize the arguments.
(vc-backend . "Git")
(regexp-syntax bre ere pcre)
- (arguments executable "--no-pager" color "--no-index" "--exclude-standard"
- "-n" group context case-fold regexp "-e" query "--"
- file-wildcards)
+ (arguments executable (:abbreviate "--no-pager" color "--no-index"
+ "--exclude-standard" "-n")
+ group context case-fold regexp "-e" query "--" file-wildcards)
+ (abbreviations "grep")
(regexp-arguments ('bre '("-G"))
('ere '("-E"))
('pcre '("-P"))
@@ -441,16 +490,6 @@ in `urgrep-tools'. Otherwise, return TOOL as-is."
((and (pred symbolp) tool) (assq tool urgrep-tools))
(tool tool)))
-(defun urgrep--maybe-shell-quote-argument (argument)
- "Quote ARGUMENT if needed for passing to an inferior shell.
-This works as `shell-quote-argument', but avoids quoting unnecessarily
-for MS shells."
- (if (and (or (eq system-type 'ms-dos)
- (and (eq system-type 'windows-nt) (w32-shell-dos-semantics)))
- (not (string-match "[^-0-9a-zA-Z_./=]" argument)))
- argument
- (shell-quote-argument argument)))
-
(defun urgrep--get-best-syntax (syntax tool)
"Return the regexp syntax closest to SYNTAX that TOOL supports."
(let ((tool-syntaxes (urgrep--get-prop 'regexp-syntax tool)))
@@ -510,21 +549,21 @@ DIRECTORY: the directory to search in, or nil to use the
(funcall cmd-fun query :tool tool :regexp regexp-syntax
:case-fold case-fold :files files :group group
:context context :color color)
- (let* ((executable (urgrep--get-prop 'executable-name tool))
- (arguments (urgrep--get-prop 'arguments tool)))
- (setq arguments (cl-substitute executable 'executable arguments))
- (setq arguments (cl-substitute query 'query arguments))
- ;; Fill in various options according to the tool's argument syntax.
- (pcase-dolist (`(,k . ,v) `((regexp . ,tool-re-syntax)
- (case-fold . ,case-fold)
- (file-wildcards . ,files)
- (group . ,group)
- (context . ,context)
- (color . ,color)))
- (let ((args (urgrep--get-prop-pcase k tool v "-arguments")))
- (setq arguments (cl-substitute args k arguments))))
- (setq arguments (flatten-list arguments))
- (mapconcat #'urgrep--maybe-shell-quote-argument arguments " ")))))))
+ (let ((arguments (urgrep--get-prop 'arguments tool))
+ (abbrev (urgrep--get-prop 'abbreviations tool))
+ (props `((executable . ,(urgrep--get-prop 'executable-name
tool))
+ (query . ,query)
+ ,@(mapcar (pcase-lambda (`(,k . ,v))
+ (cons k (urgrep--get-prop-pcase
+ k tool v "-arguments")))
+ `((regexp . ,tool-re-syntax)
+ (case-fold . ,case-fold)
+ (file-wildcards . ,files)
+ (group . ,group)
+ (context . ,context)
+ (color . ,color))))))
+ (urgrep--flatten-arguments (cl-sublis props arguments)
+ abbrev)))))))
;; urgrep-mode
@@ -622,6 +661,14 @@ If EDIT-COMMAND is non-nil, the search can be edited."
:help "Restart search")
map)))
+(defvar urgrep-mode-abbreviation-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map [down-mouse-2] 'mouse-set-point)
+ (define-key map [mouse-2] 'grep-find-toggle-abbreviation)
+ (define-key map "\C-m" 'grep-find-toggle-abbreviation)
+ map)
+ "Keymap for urgrep abbreviation buttons.")
+
(defconst urgrep-mode-line-matches
`(" [" (:propertize (:eval (int-to-string urgrep-num-matches-found))
face urgrep-match-count
@@ -674,11 +721,7 @@ line number."
;; Only return non-nil if point is still within the limit.
(< (point) limit))
(0 'urgrep-context t)
- (2 `(face nil display ,(match-string 1)) nil t))
- ;; Hide excessive part of rgrep command.
- ("^find \\(\\(?:-H \\)?\\. -type d .*\\(?:\\\\)\\|\")\"\\)\\)"
- (1 (if grep-find-abbreviate grep-find-abbreviate-properties
- '(face nil abbreviated-command t))))))
+ (2 `(face nil display ,(match-string 1)) nil t))))
(defvar urgrep--column-end-adjustment
(if (< emacs-major-version 28) 0 1)
@@ -812,6 +855,27 @@ This function is called from `compilation-filter-hook'."
compilation-error-screen-columns nil)
(add-hook 'compilation-filter-hook 'urgrep-filter nil t))
+(defun urgrep--hide-abbreviations (command)
+ "If `urgrep-abbreviate-command' is non-nil, hide abbreviations in COMMAND."
+ (when urgrep-abbreviate-command
+ (let ((ellipsis (if (char-displayable-p ?…) "…" "..."))
+ (start 0) end)
+ (while start
+ (setq end (next-single-property-change
+ start 'abbreviated-command command))
+ (when-let ((abbrev (get-text-property start 'abbreviated-command
+ command)))
+ (add-text-properties
+ start end
+ `( face nil
+ display ,(format "[%s%s]" (if (eq abbrev t) "" abbrev) ellipsis)
+ mouse-face highlight
+ help-echo "RET, mouse-2: show unabbreviated command"
+ keymap ,urgrep-mode-abbreviation-map)
+ command))
+ (setq start end))))
+ command)
+
(defun urgrep--start (command query tool &optional directory)
"Start a urgrep process for COMMAND.
QUERY is the original argument list that generated COMMAND (or it may
@@ -830,7 +894,8 @@ rerunning the search."
;; where to search...
(let ((urgrep-current-tool tool)
(default-directory directory))
- (compilation-start command #'urgrep-mode)))
+ (compilation-start (urgrep--hide-abbreviations command)
+ #'urgrep-mode)))
;; ... and then set `default-directory' here to be sure it's up to date.
;; This can get out of sync if re-running urgrep from a urgrep buffer, but
;; with a different search directory set.
- [elpa] externals/urgrep c15be33112 076/115: Wrap shell argument quoting with `with-connection-local-variables`, (continued)
- [elpa] externals/urgrep c15be33112 076/115: Wrap shell argument quoting with `with-connection-local-variables`, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep e63c6c5173 089/115: Add link to wgrep package and clarify the README, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 61478da305 077/115: Improve reliability of running urgrep over Tramp, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 77fcfc1916 090/115: Use `push` instead of `add-to-list`, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 559b2c07cd 091/115: Add a unit test for getting the preferred tool on multiple hosts, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep fe13a3cbb5 081/115: Fix project-root call on Emacs 27, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep f2c87e7520 080/115: Improve robustness of tests for grep command generation, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep b03a3d84ec 098/115: Add `suffix` argument to `urgrep--get-prop(-pcase)?`, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep eb5191bfd5 097/115: Update copyright year, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 43c82e84ec 082/115: Add CI for Emacs 27.1, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 3082d89bd9 099/115: Add support for abbreviating the command in urgrep buffers,
ELPA Syncer <=
- [elpa] externals/urgrep b5b426e9ca 084/115: Fix hiding excessive part of rgrep command in Emacs 28, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 56acdfe434 087/115: Improve how we wait for urgrep to finish in tests, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 30cc9e363e 085/115: Fix context-line detection for find/grep, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 0b036cdcf4 100/115: Improve explanation of `C-u C-u` for choosing directory, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 6614dfe651 102/115: Update checkout action in CI, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 01fbe92f2c 103/115: In tests, wait for grep to finish before doing any checks, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 99e1de4eb1 105/115: Fix an edge case when unable to get the grouped filename for highlighting, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep f5b41c672b 106/115: Use `rx` in several places, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 91e3807239 109/115: Properly evaluate rx forms, ELPA Syncer, 2023/05/10
- [elpa] externals/urgrep 1d4bdca3d8 111/115: Add package keywords and such, ELPA Syncer, 2023/05/10