unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Visuwesh <visuweshm@gmail.com>
Cc: 70820@debbugs.gnu.org, monnier@iro.umontreal.ca
Subject: bug#70820: [PATCH] Editable grep buffers
Date: Sat, 31 Aug 2024 10:54:44 +0300	[thread overview]
Message-ID: <86y14dcekb.fsf@gnu.org> (raw)
In-Reply-To: <87bk1vzuw1.fsf@gmail.com> (message from Visuwesh on Wed, 14 Aug 2024 08:13:42 +0530)

Ping! Can we make progress with this issue?  I think there were no
objections to your proposal.

> From: Visuwesh <visuweshm@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,  70820@debbugs.gnu.org
> 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.
> 





  parent reply	other threads:[~2024-08-31  7:54 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-07 16:25 bug#70820: [PATCH] Editable grep buffers Visuwesh
2024-05-07 17:23 ` Jim Porter
2024-05-08  3:12   ` Visuwesh
2024-05-08  4:11     ` Jim Porter
2024-05-08  5:11       ` Visuwesh
2024-05-18 13:23   ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-07 18:08 ` Eli Zaretskii
2024-05-08  3:22   ` Visuwesh
2024-05-08 11:58     ` Eli Zaretskii
2024-05-08 12:18       ` Visuwesh
2024-05-08 13:49         ` Eli Zaretskii
2024-05-09 10:32           ` Visuwesh
2024-05-12  4:45             ` Visuwesh
2024-05-18  9:28               ` Eli Zaretskii
2024-05-18 13:35                 ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-18 15:44                   ` Eli Zaretskii
2024-05-18 16:27                     ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-18 16:28                       ` Eli Zaretskii
2024-05-20 10:10                         ` Visuwesh
2024-07-28  8:33                         ` Visuwesh
2024-08-14  0:30                           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-14  2:43                             ` Visuwesh
2024-08-14 11:37                               ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-08-31  7:54                               ` Eli Zaretskii [this message]
2024-08-31  8:03                                 ` Visuwesh
2024-09-09 14:39                               ` Visuwesh
2024-09-14  9:43                                 ` Eli Zaretskii
2024-05-18 13:34           ` Stefan Monnier via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-08 17:37       ` Jim Porter
2024-05-08 18:42         ` Eli Zaretskii
2024-05-08 19:19           ` Jim Porter
2024-05-08 19:23             ` Jim Porter
2024-05-09  4:41               ` Eli Zaretskii
2024-05-09 16:14                 ` Jim Porter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=86y14dcekb.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=70820@debbugs.gnu.org \
    --cc=monnier@iro.umontreal.ca \
    --cc=visuweshm@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).