GNU bug report logs - #70820
[PATCH] Editable grep buffers

Previous Next

Package: emacs;

Reported by: Visuwesh <visuweshm <at> gmail.com>

Date: Tue, 7 May 2024 16:26:01 UTC

Severity: normal

Tags: patch

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Visuwesh <visuweshm <at> gmail.com>
To: Stefan Monnier <monnier <at> iro.umontreal.ca>
Cc: Eli Zaretskii <eliz <at> gnu.org>, 70820 <at> debbugs.gnu.org
Subject: bug#70820: [PATCH] Editable grep buffers
Date: Wed, 14 Aug 2024 08:13:42 +0530
[செவ்வாய் ஆகஸ்ட் 13, 2024] Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of text editors" wrote:

>> +(defun compilation--update-markers (loc marker screen-columns first-column)
>> +  "Update markers in LOC, and set MARKER to location pointed by LOC.
>> +SCREEN-COLUMNS and FIRST-COLUMN are the value of
>> +`compilation-error-screen-columns' and `compilation-first-column' to use
>> +if they are not set buffer-locally in the target buffer."
>> +  (with-current-buffer
>> +      (if (bufferp (caar (compilation--loc->file-struct loc)))
>> +          (caar (compilation--loc->file-struct loc))
>> +        (apply #'compilation-find-file
>> +               marker
>> +               (caar (compilation--loc->file-struct loc))
>> +               (cadr (car (compilation--loc->file-struct loc)))
>> +               (compilation--file-struct->formats
>> +                (compilation--loc->file-struct loc))))
>> +    (let ((screen-columns
>> +           ;; Obey the compilation-error-screen-columns of the target
>> +           ;; buffer if its major mode set it buffer-locally.
>> +           (if (local-variable-p 'compilation-error-screen-columns)
>> +               compilation-error-screen-columns screen-columns))
>> +          (compilation-first-column
>> +           (if (local-variable-p 'compilation-first-column)
>> +               compilation-first-column first-column))
>> +          (last 1))
>> +      (save-restriction
>> +        (widen)
>> +        (goto-char (point-min))
>> +        ;; Treat file's found lines in forward order, 1 by 1.
>> +        (dolist (line (reverse (cddr (compilation--loc->file-struct loc))))
>> +          (when (car line)     ; else this is a filename without a line#
>> +            (compilation-beginning-of-line (- (car line) last -1))
>> +            (setq last (car line)))
>> +          ;; Treat line's found columns and store/update a marker for each.
>> +          (dolist (col (cdr line))
>> +            (if (compilation--loc->col col)
>> +                (if (eq (compilation--loc->col col) -1)
>> +                    ;; Special case for range end.
>> +                    (end-of-line)
>> +                  (compilation-move-to-column (compilation--loc->col col)
>> +                                              screen-columns))
>> +              (beginning-of-line)
>> +              (skip-chars-forward " \t"))
>> +            (if (compilation--loc->marker col)
>> +                (set-marker (compilation--loc->marker col) (point))
>> +              (setf (compilation--loc->marker col) (point-marker)))
>> +            ;; (setf (compilation--loc->timestamp col) timestamp)
>> +            ))))))
>
> Are there any changes in this code, or is it "verbatim" the code
> extracted from `compilation-next-error-function`?

It is extracted verbatim from compilation-next-error-function.

>> +(defvar grep-edit-mode-hook nil
>> +  "Hooks run when changing to Grep-Edit mode.")
>
> It's just "Hook" because `grep-edit-mode-hook` is a hook.  Hooks contain
> functions, so when you run a hook, the corresponding functions are called.

Ah, I was under the impression that the functions were also referred to
as hooks.  I will correct them in a future patch.

>> +(defun grep-edit-mode ()
>> +  "Major mode for editing *grep* buffers.
>> +In this mode, changes to the *grep* buffer are applied to the
>> +originating files.
>> +\\<grep-edit-mode-map>
>> +Type \\[grep-edit-save-changes] to exit Grep-Edit mode, return to Grep
>> +mode.
>> +
>> +The only editable texts in a Grep-Edit buffer are the match results."
>> +  (interactive)
>> +  (error "This mode can be enabled only by `grep-change-to-grep-edit-mode'"))
>> +(put 'grep-edit-mode 'mode-class 'special)
>> +
>> +(defun grep-change-to-grep-edit-mode ()
>> +  "Switch to `grep-edit-mode' to edit *grep* buffer."
>> +  (interactive)
>> +  (unless (derived-mode-p 'grep-mode)
>> +    (error "Not a Grep buffer"))
>> +  (when (get-buffer-process (current-buffer))
>> +    (error "Cannot switch when grep is running"))
>> +  (use-local-map grep-edit-mode-map)
>> +  (grep-edit--prepare-buffer)
>> +  (setq buffer-read-only nil)
>> +  (setq major-mode 'grep-edit-mode)
>> +  (setq mode-name "Grep-Edit")
>> +  (buffer-enable-undo)
>> +  (set-buffer-modified-p nil)
>> +  (setq buffer-undo-list nil)
>> +  (add-hook 'after-change-functions #'occur-after-change-function nil t)
>> +  (run-mode-hooks 'grep-edit-mode-hook)
>> +  (message "Editing: \\[grep-edit-save-changes] to return to Grep mode"))
>
> I'm tempted to say you should use `major-mode-suspend/resume` (which
> would avoid the duplication of parts of `grep-mode` in
> `grep-edit-save-changes`), but I guess this might re-introduce the
> problem with buffer-local variables.

Yes, unfortunately it will re-introduce the problem with buffer-local
variables.  

If everyone is okay with the current patch, I can get to writing the
NEWS entry and updating the manual.  Thanks.




This bug report was last modified 305 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.