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

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

bug#59888: [PATCH] Add 'grep-use-headings'


From: Robert Pluim
Subject: bug#59888: [PATCH] Add 'grep-use-headings'
Date: Sun, 26 Feb 2023 14:17:17 +0100

>>>>> On Sat, 25 Feb 2023 09:34:56 +0100, Augusto Stoffel <arstoffel@gmail.com> 
>>>>> said:

    Augusto> I've been using the grep-use-headings locally for a long time and 
it
    Augusto> works well.  Should the the patches be installed?

    Augusto> From 77ea46f6dc50a8f463bd2f51ce9d0585de0bb55c Mon Sep 17 00:00:00 
2001
    Augusto> From: Augusto Stoffel <arstoffel@gmail.com>
    Augusto> Date: Wed, 7 Dec 2022 18:44:07 +0100
    Augusto> Subject: [PATCH 2/2] New user option 'grep-use-headings'

    Augusto> * lisp/progmodes/grep.el (grep-heading-regexp): New user option.
    Augusto> (grep-heading): New face.
    Augusto> (grep--heading-format, grep--heading-state, grep--heading-filter):
    Augusto> Filter function for grep processes and supporting variables.
    Augusto> (grep-use-headings): New user option.
    Augusto> (grep-mode): Use the above, if applicable.
    Augusto> ---
    Augusto>  etc/NEWS                          |  8 ++++
    Augusto>  lisp/progmodes/grep.el            | 69 
+++++++++++++++++++++++++++++++
    Augusto>  test/lisp/progmodes/grep-tests.el | 14 +++++++
    Augusto>  3 files changed, 91 insertions(+)

    Augusto> diff --git a/etc/NEWS b/etc/NEWS
    Augusto> index 4b0e4e6bd46..ca2e8011510 100644
    Augusto> --- a/etc/NEWS
    Augusto> +++ b/etc/NEWS
    Augusto> @@ -95,6 +95,14 @@ If you want to get back the old behavior, set 
the user option to the value
    Augusto>      (setopt gdb-locals-table-row-config
    Augusto>              `((type . 0) (name . 0) (value . 
,gdb-locals-value-limit)))
 
    Augusto> +** Compile
    Augusto> +
    Augusto> +*** New user option 'grep-use-headings'.
    Augusto> +When non-nil, the output of Grep is split into sections, one for 
each
    Augusto> +file, instead of having file names prefixed to each line.  It is
    Augusto> +equivalent to the --heading option of some tools such as 'git 
grep'
    Augusto> +and 'rg'.
    Augusto> +

You also add a face and a user option for the regexp, they should be
mentioned in NEWS (and the manual, if relevant)
 
    Augusto> +(defvar grep--heading-format
    Augusto> +  (eval-when-compile
    Augusto> +    (let ((title (propertize "%s"
    Augusto> +                             'font-lock-face 'grep-heading
    Augusto> +                             'outline-level 1)))
    Augusto> +      (propertize (concat title "\n") 'compilation-annotation t)))
    Augusto> +  "Format string of grep headings.
    Augusto> +This is passed to `format' with one argument, the text of the
    Augusto> +first capture group of `grep-heading-regexp'.")
    Augusto> +
    Augusto> +(defvar-local grep--heading-state nil
    Augusto> +  "Variable to keep track of the `grep--heading-filter' state.")
    Augusto> +
    Augusto> +(defun grep--heading-filter ()
    Augusto> +  "Filter function to add headings to output of a grep process."
    Augusto> +  (unless grep--heading-state
    Augusto> +    (setq grep--heading-state (cons (point-min-marker) nil)))
    Augusto> +  (save-excursion
    Augusto> +    (let ((limit (car grep--heading-state)))
    Augusto> +      ;; Move point to the old limit and update limit marker.
    Augusto> +      (move-marker limit (prog1 (pos-bol) (goto-char limit)))
    Augusto> +      (while (re-search-forward grep-heading-regexp limit t)
    Augusto> +        (unless (get-text-property (point) 
'compilation-annotation)
    Augusto> +          (let ((heading (match-string-no-properties 1))
    Augusto> +                (start (match-beginning 2))
    Augusto> +                (end (match-end 2)))
    Augusto> +            (when start
    Augusto> +              (put-text-property start end 'invisible t))
    Augusto> +            (when (and heading (not (equal heading (cdr 
grep--heading-state))))
    Augusto> +              (save-excursion
    Augusto> +                (forward-line 0)

Thatʼs the same as (goto-char (pos-bol)) because of a wrinkle in the
implementation of `forward-line'.  It might even be faster, but Iʼve
not measured it :-)

Robert
-- 





reply via email to

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