From: Visuwesh <visuweshm@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Eli Zaretskii <eliz@gnu.org>, 70820@debbugs.gnu.org
Subject: bug#70820: [PATCH] Editable grep buffers
Date: Wed, 14 Aug 2024 08:13:42 +0530 [thread overview]
Message-ID: <87bk1vzuw1.fsf@gmail.com> (raw)
In-Reply-To: <jwv7cckt0q2.fsf-monnier+emacs@gnu.org> (Stefan Monnier via's message of "Tue, 13 Aug 2024 20:30:53 -0400")
[செவ்வாய் ஆகஸ்ட் 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.
next prev parent reply other threads:[~2024-08-14 2:43 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 [this message]
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
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bk1vzuw1.fsf@gmail.com \
--to=visuweshm@gmail.com \
--cc=70820@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=monnier@iro.umontreal.ca \
/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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.