From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Lars Ingebrigtsen Newsgroups: gmane.emacs.bugs Subject: bug#42424: 27.0.90; replace-match: point is NOT left at the end of replacement Date: Sat, 31 Jul 2021 16:28:54 +0200 Message-ID: <871r7eftg9.fsf@gnus.org> References: <87zh4ltc5l.fsf@gnus.org> <83tuussr1v.fsf@gnu.org> <87tuusj618.fsf@gnus.org> <87r1fefum7.fsf@gnus.org> <835ywqpntr.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="5341"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: 42424@debbugs.gnu.org, victorhge@gmail.com To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Jul 31 16:30:25 2021 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 1m9q0P-0001CJ-FV for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 31 Jul 2021 16:30:25 +0200 Original-Received: from localhost ([::1]:44782 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m9q0N-0003bO-UD for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 31 Jul 2021 10:30:24 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:43202) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m9q02-0003JK-Ch for bug-gnu-emacs@gnu.org; Sat, 31 Jul 2021 10:30:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:51266) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1m9q02-0007tn-3p for bug-gnu-emacs@gnu.org; Sat, 31 Jul 2021 10:30:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1m9q01-0001p6-W5 for bug-gnu-emacs@gnu.org; Sat, 31 Jul 2021 10:30:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Lars Ingebrigtsen Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 31 Jul 2021 14:30:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 42424 X-GNU-PR-Package: emacs Original-Received: via spool by 42424-submit@debbugs.gnu.org id=B42424.16277417466920 (code B ref 42424); Sat, 31 Jul 2021 14:30:01 +0000 Original-Received: (at 42424) by debbugs.gnu.org; 31 Jul 2021 14:29:06 +0000 Original-Received: from localhost ([127.0.0.1]:34579 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1m9pz8-0001nY-7a for submit@debbugs.gnu.org; Sat, 31 Jul 2021 10:29:06 -0400 Original-Received: from quimby.gnus.org ([95.216.78.240]:54178) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1m9pz6-0001n5-Gd for 42424@debbugs.gnu.org; Sat, 31 Jul 2021 10:29:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnus.org; s=20200322; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date: References:Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=wLvLSDiVXEtjkEj4N1GCwQl7tK/4cHTkz/dPgQaSC5o=; b=jROs+T5sClc/ja35LjoZymJXSe AY1IaCEYSOynXdMZ11xlxXvYrd/nWvIHryHK6+9MXkZ2vuBFhOfpcACKGjus/CjzeYCAuGTFucz0U OPUQzrFtQ+QKY6AmStXBaSXBLKDqVx022HGH5+6j6n3MuahQd49RzPcWL+yO0B8WKEXc=; Original-Received: from 2.149.45.105.tmi.telenormobil.no ([2.149.45.105] helo=elva) by quimby.gnus.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m9pyx-0004U2-CX; Sat, 31 Jul 2021 16:28:58 +0200 In-Reply-To: <835ywqpntr.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 31 Jul 2021 17:20:16 +0300") 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" Xref: news.gmane.io gmane.emacs.bugs:210993 Archived-At: Eli Zaretskii writes: > No, the hooks are called from signal_after_change, AFAICT. Hm, not able to get that working, either... > And I'm probably missing something, because I don't understand how > calling the hooks from replace-match would help: replace_range is > called just once from replace-match, and the hooks are invoked at its > very end. What am I missing? Because replace-match does this: replace_range (sub_start, sub_end, newtext, 1, 0, 1, true, true); [...] /* Now move point "officially" to the end of the inserted replacement. */ move_if_not_intangible (newpoint); And that leaves point somewhere odd if the hook has inserted more text at the start of the buffer. My idea was to try to see whether moving the hook stuff later would fix the issue (and not regress anything). Basically: diff --git a/src/search.c b/src/search.c index df384e1dcf..2c0d58c523 100644 --- a/src/search.c +++ b/src/search.c @@ -2725,15 +2726,21 @@ DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 5, 0, newpoint = sub_start + SCHARS (newtext); /* Replace the old text with the new in the cleanest possible way. */ - replace_range (sub_start, sub_end, newtext, 1, 0, 1, true); - - if (case_action == all_caps) - Fupcase_region (make_fixnum (search_regs.start[sub]), - make_fixnum (newpoint), - Qnil); - else if (case_action == cap_initial) - Fupcase_initials_region (make_fixnum (search_regs.start[sub]), - make_fixnum (newpoint), Qnil); + { + ptrdiff_t count = SPECPDL_INDEX (); + specbind (Qinhibit_modification_hooks, Qt); + + replace_range (sub_start, sub_end, newtext, 1, 0, 1, true); + + if (case_action == all_caps) + Fupcase_region (make_fixnum (search_regs.start[sub]), + make_fixnum (newpoint), + Qnil); + else if (case_action == cap_initial) + Fupcase_initials_region (make_fixnum (search_regs.start[sub]), + make_fixnum (newpoint), Qnil); + unbind_to (count, Qnil); + } /* The replace_range etc. functions can trigger modification hooks (see signal_before_change and signal_after_change). Try to error @@ -2750,6 +2757,9 @@ DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 5, 0, /* Now move point "officially" to the end of the inserted replacement. */ move_if_not_intangible (newpoint); + signal_after_change (sub_start, sub_end - sub_start, SCHARS (newtext)); + update_compositions (sub_start, newpoint, CHECK_BORDER); + return Qnil; } But that does not seem to call the modification hook at all in the test case. Am I doing something obviously wrong here? -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no