From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#70820: [PATCH] Editable grep buffers Date: Tue, 13 Aug 2024 20:30:53 -0400 Message-ID: References: <87seytlhcq.fsf@gmail.com> <86pltxa40q.fsf@gnu.org> <87jzk5kmwk.fsf@gmail.com> <86ikzoa51h.fsf@gnu.org> <878r0klcp1.fsf@gmail.com> <864jb89zwq.fsf@gnu.org> <87wmo3jmws.fsf@gmail.com> <87fruny6xe.fsf@gmail.com> <86le47eafb.fsf@gnu.org> <86pltjceft.fsf@gnu.org> <86ikzbcces.fsf@gnu.org> <87le1lj4pv.fsf@gmail.com> Reply-To: Stefan Monnier Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="32098"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: Eli Zaretskii , 70820@debbugs.gnu.org To: Visuwesh Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Aug 14 02:31:54 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1se1vd-0008Ch-Ei for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 14 Aug 2024 02:31:53 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1se1vG-0003fB-LU; Tue, 13 Aug 2024 20:31:30 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1se1vF-0003ej-44 for bug-gnu-emacs@gnu.org; Tue, 13 Aug 2024 20:31:29 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1se1vE-0000RN-Rj for bug-gnu-emacs@gnu.org; Tue, 13 Aug 2024 20:31:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=MIME-Version:Date:References:In-Reply-To:From:To:Subject; bh=cwayQVwP96hX+N8AO15o6WztMqyxOu138QBsPu1R9sc=; b=JDUVJTKhYARZSyu7Oa+/AKpCAO7pdofBZaW/4VkQDNFc6KqWUt4kmcOXu/VBQJQSE8MSosFR+DI15syfF8QGYcB58iPn3Y9Rq2TS13knRjV6Ze0EjiPfqR+dvml/sDxktxZc58WgDe8d6Z9jAfNAsFHA17oZom9YuNxtDZhcAB//BQf7VVTQsQHnR/JjPXHhHER4dLCeomzCie/kgqn/Ju1T/NX1bqOiDDHkr499KDzvZQqWWqomXYHshAPJGM0iISV0vMIraKE7HEjK0pzzdGPqJ8Cc87tON1Rb4b9dq/WPA0QKw7hx4mS6UCWfaYm8xcygVSpkVoz1/mK3qTcvFQ==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1se1vl-00086D-VI for bug-gnu-emacs@gnu.org; Tue, 13 Aug 2024 20:32:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Stefan Monnier Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 14 Aug 2024 00:32:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 70820 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 70820-submit@debbugs.gnu.org id=B70820.172359549931073 (code B ref 70820); Wed, 14 Aug 2024 00:32:01 +0000 Original-Received: (at 70820) by debbugs.gnu.org; 14 Aug 2024 00:31:39 +0000 Original-Received: from localhost ([127.0.0.1]:45721 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1se1vP-000856-0d for submit@debbugs.gnu.org; Tue, 13 Aug 2024 20:31:39 -0400 Original-Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:60217) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1se1vN-00084j-1D for 70820@debbugs.gnu.org; Tue, 13 Aug 2024 20:31:37 -0400 Original-Received: from pmg2.iro.umontreal.ca (localhost.localdomain [127.0.0.1]) by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id C6EBF803B1; Tue, 13 Aug 2024 20:30:56 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca; s=mail; t=1723595455; bh=ZTjGi/OM43m7/Z5Unq1JPx2ZykGBTwOp0rwb/mT++QE=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=K/DM8KhTSkH/x0UPvoIIw2XyNVLqCU8meH8Y9YqT+9sR84NNgBx/NCkKT9G5CvWsw GaHuyooAj/4FqdcuPxi0SO7P6pqA3/oWV9DmIBxQEqYK02g6HdEtY2U2uY4vor31o4 HHw+tzA6NBUUvc5ns/U4XL5NMm0wF/VwUKyCf+09lvM46jsB2+z5SWextXbYOpIjFO xhkAEKONaagUkqtCxIeA4nCJT0JoN1CiM2aP0B9FPagWIw3RbE8uEMBJjRHoBbhERD Avo/xA+d95Q/3lXSSwolBrFxhRoAqGfL8w03hgrN930IlCg3gfQ5Eaml+dnaszn58N rDmR3FIxMxuZA== Original-Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1]) by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 1B45D80672; Tue, 13 Aug 2024 20:30:55 -0400 (EDT) Original-Received: from pastel (unknown [216.154.9.87]) by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id E1156120495; Tue, 13 Aug 2024 20:30:54 -0400 (EDT) In-Reply-To: <87le1lj4pv.fsf@gmail.com> (Visuwesh's message of "Sun, 28 Jul 2024 14:03:32 +0530") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:290100 Archived-At: > +(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`? > +(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. > +(defun grep-edit-mode () > + "Major mode for editing *grep* buffers. > +In this mode, changes to the *grep* buffer are applied to the > +originating files. > +\\ > +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. Stefan