From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Tino Calancha Newsgroups: gmane.emacs.bugs Subject: bug#28008: 25.2; Resume kmacro definition errors C-u C-u Date: Fri, 11 Aug 2017 22:17:57 +0900 (JST) Message-ID: References: <87d1867hpd.fsf@calancha-pc> <87d182p97t.fsf@calancha-pc> <83shgyqmwn.fsf@gnu.org> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; format=flowed; charset=US-ASCII X-Trace: blaine.gmane.org 1502457569 8432 195.159.176.226 (11 Aug 2017 13:19:29 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 11 Aug 2017 13:19:29 +0000 (UTC) User-Agent: Alpine 2.20 (DEB 67 2015-01-07) Cc: vianchielfaura@gmail.com, 28008@debbugs.gnu.org, Tino Calancha To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Aug 11 15:19:23 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dg9qQ-0001Tw-V0 for geb-bug-gnu-emacs@m.gmane.org; Fri, 11 Aug 2017 15:19:19 +0200 Original-Received: from localhost ([::1]:39371 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dg9qU-00088p-7O for geb-bug-gnu-emacs@m.gmane.org; Fri, 11 Aug 2017 09:19:22 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:44542) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dg9qF-00086S-Oi for bug-gnu-emacs@gnu.org; Fri, 11 Aug 2017 09:19:09 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dg9qA-0003zs-MN for bug-gnu-emacs@gnu.org; Fri, 11 Aug 2017 09:19:07 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:46510) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dg9qA-0003zi-J6 for bug-gnu-emacs@gnu.org; Fri, 11 Aug 2017 09:19:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dg9qA-0007yI-9Y for bug-gnu-emacs@gnu.org; Fri, 11 Aug 2017 09:19:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tino Calancha Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 11 Aug 2017 13:19:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 28008 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 28008-submit@debbugs.gnu.org id=B28008.150245748930582 (code B ref 28008); Fri, 11 Aug 2017 13:19:02 +0000 Original-Received: (at 28008) by debbugs.gnu.org; 11 Aug 2017 13:18:09 +0000 Original-Received: from localhost ([127.0.0.1]:55191 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dg9pJ-0007xC-6s for submit@debbugs.gnu.org; Fri, 11 Aug 2017 09:18:09 -0400 Original-Received: from mail-pf0-f196.google.com ([209.85.192.196]:33772) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dg9pG-0007wi-Jv for 28008@debbugs.gnu.org; Fri, 11 Aug 2017 09:18:07 -0400 Original-Received: by mail-pf0-f196.google.com with SMTP id c65so3491444pfl.0 for <28008@debbugs.gnu.org>; Fri, 11 Aug 2017 06:18:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:date:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version; bh=dIgyZbobCR1ZY5IE3zFubYgDHIgJmceROg1FKXHuvvo=; b=L9TDIf+M+OFgYIHzc4xotK5ZprUuamaap65+3XBoyN/My6DpNp+vR+Xf2D1n/pPtCP mXGuOs6Eo/HXyF/laAJgQen83MgZshJzRnq9B7tuBkSYEXR66glVp7et4Wf0p2mrRRCQ B9g3lAt5E6a71kSd0b/2cgzEABytUYJUUdiWpPlutqY51A0+J0ee1oV3LkxJGG5u4adO L22zjZnPM/99G2IdnIzDWSICvlvLXyaZkoWeE8zmxYc2hw4DNZRGngEISjJabHWds57j JB7VE4WcPEEZqDoNcFsBCo2r2er99odwaNK7IekAWBRh6kWziiwj8m9AcN+3GyiUpYsa Cyvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version; bh=dIgyZbobCR1ZY5IE3zFubYgDHIgJmceROg1FKXHuvvo=; b=D0V1ib/n3VKdIPQhwmh55OGRzBfDmebUYBWggSUYaVuZX+h6A7BaVCQlMYmldYKUzy jQ77lDUSxC9/kNQrylhIxCPAiwI8hXGt1zRpO9egqgA1GffZyRqrJ82pd+rVUiIJH5sO I3z1lpVjy1REWh+kTRVJTR1sG2hb033+2HXk4uVo4v9vcKiR7DoZf43fPIGO93Ra6KAB WW1aZlYqkNs1g3RzBXFtFEVzY8AGxrtPyi2cdjHCv8IRd1pXX8Iw86EhgLF8JMoEUoo0 mkKgiSlDwTtGbLTleaCMlCS58tB/XM6nfPg/gXgXfPeO3tTIdA6UAMPJbNyYHYN92ZbX nmIA== X-Gm-Message-State: AHYfb5gSYtWAU+xwEy88XTtCfSCRl0+edBdQZJhDaFeYU1OJAvj9HSC1 HAAaetSwEwE+5Q== X-Received: by 10.84.218.65 with SMTP id f1mr17930104plm.295.1502457480725; Fri, 11 Aug 2017 06:18:00 -0700 (PDT) Original-Received: from calancha-pc (170.224.128.101.dy.bbexcite.jp. [101.128.224.170]) by smtp.gmail.com with ESMTPSA id b4sm1827222pgc.9.2017.08.11.06.17.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Aug 2017 06:18:00 -0700 (PDT) X-Google-Original-From: Tino Calancha X-X-Sender: calancha@calancha-pc In-Reply-To: <83shgyqmwn.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 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.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:135653 Archived-At: On Fri, 11 Aug 2017, Eli Zaretskii wrote: >> ** Patch 1 always save the macro in `last-kbd-macro' after an error or 'C-g'. >> Then, A. B. and D.2 behaves similarly. >> >> ** Patch 2 adds a new variable `last-aborted-kbd-macro': it saves the partial >> macro there after an error or 'C-g'. Called `start-kbd-macro' with >> APPEND non-nil offers to append on `last-aborted-kbd-macro'; possible answers >> are 'yes', 'no' or 'del' (i.e., append on `last-aborted-kbd-macro' after delete >> its last character). >> >> This is not backward compatible; for instance, the snippets A, B above won't be >> saved in `last-kbd-macro' (currently they do). >> It's more tidy; it separates 'good macros', i.e. those ended after >> 'F4' or 'C-x )', from 'partial macros', i.e., those ended after an error or 'C-g'. > > All these low-level changes just to support an obscure use case? Is > really worth the risk to break macros to cater to that? That depends of how often someone uses kbd macros. I rarely use them, but the people using them frequently might suffer D.2 from time to time. Actually, the patch#1 is quite short: i included a docstring fix from the patch#2 by mistake. The C code changes in patch#1 are just: 3 files changed, 41 insertions(+), 2 deletions(-) Here is patch#1 upated: --8<-----------------------------cut here---------------start------------->8--- commit fe424d1371ec467b9a257fa75c8c3f734135e6dd Author: Tino Calancha Date: Fri Aug 11 22:11:08 2017 +0900 Save aborted kbd macro definitions While a defining a kbd macro, if we get an error or if the user inputs C-g, then save the aborted kbd macro record (Bug#28008). * lisp/kmacro.el (kmacro-start-macro): Signal an error if APPEND is non-nil and last-kbd-macro is nil. * src/keyboard.c (cmd_error): Increase buffer size for macroerror to accommodate new error message. If we are defining a kbd macro and we got an error, then save the current progress in last-kbd-macro. (init_kboard): Initialize last-aborted-kbd-macro. (mark_kboards): Mark last-aborted-kbd-macro. * src/keyboard.h (save_aborted_kbd_macro): Declare this function. * src/macros.c (save_aborted_kbd_macro): New function. (store_kbd_macro_char): Call save_aborted_kbd_macro when user inputs C-g. diff --git a/lisp/kmacro.el b/lisp/kmacro.el index 2db8061fa4..8eff7e5c2e 100644 --- a/lisp/kmacro.el +++ b/lisp/kmacro.el @@ -584,7 +584,8 @@ kmacro-start-macro kmacro-last-counter kmacro-counter kmacro-counter-format kmacro-default-counter-format kmacro-counter-format-start kmacro-default-counter-format)) - + (when (and append (null last-kbd-macro)) + (user-error "No kbd macro has been defined")) (start-kbd-macro append (and append (if kmacro-execute-before-append diff --git a/src/keyboard.c b/src/keyboard.c index 97069a24ac..5111e2c358 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -941,7 +941,8 @@ static Lisp_Object cmd_error (Lisp_Object data) { Lisp_Object old_level, old_length; - char macroerror[sizeof "After..kbd macro iterations: " + char macroerror[sizeof "Saved aborted kbd macro in \ +`last-kbd-macro' after error: " + INT_STRLEN_BOUND (EMACS_INT)]; #ifdef HAVE_WINDOW_SYSTEM @@ -949,7 +950,13 @@ cmd_error (Lisp_Object data) cancel_hourglass (); #endif - if (!NILP (executing_kbd_macro)) + if (!NILP (KVAR (current_kboard, defining_kbd_macro))) + { + sprintf (macroerror, + "Saved aborted kbd macro in `last-kbd-macro' after error: "); + save_aborted_kbd_macro (false); + } + else if (!NILP (executing_kbd_macro)) { if (executing_kbd_macro_iterations == 1) sprintf (macroerror, "After 1 kbd macro iteration: "); diff --git a/src/keyboard.h b/src/keyboard.h index 2219c01135..676ccd83cc 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -463,6 +463,8 @@ extern bool lucid_event_type_list_p (Lisp_Object); extern void kbd_buffer_store_event (struct input_event *); extern void kbd_buffer_store_buffered_event (union buffered_input_event *, struct input_event *); +extern Lisp_Object save_aborted_kbd_macro (bool); + INLINE void kbd_buffer_store_event_hold (struct input_event *event, struct input_event *hold_quit) diff --git a/src/macros.c b/src/macros.c index f0ffda3f44..1935e4fd2f 100644 --- a/src/macros.c +++ b/src/macros.c @@ -39,6 +39,32 @@ EMACS_INT executing_kbd_macro_iterations; Lisp_Object executing_kbd_macro; +/* Save the aborted macro. + Called if an error happens, or if the user inputs C-g, + while defining a kbd macro. */ + +Lisp_Object +save_aborted_kbd_macro (bool msg) +{ + struct kboard *kb = current_kboard; + /* Must contain something; otherwise don't save it. */ + if (kb->kbd_macro_end != kb->kbd_macro_buffer) + { + end_kbd_macro (); + if (msg) + { + message1 ("Saved aborted kbd macro in `last-kbd-macro'"); + /* Set inhibit_quit to until sleep_for ends */ + Vinhibit_quit = Qt; + Fsleep_for (make_number (1), Qnil); + Vinhibit_quit = Qnil; + } + } + + return Qnil; +} + + DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 2, "P", doc: /* Record subsequent keyboard input, defining a keyboard macro. The commands are recorded even as they are executed. @@ -182,6 +208,10 @@ store_kbd_macro_char (Lisp_Object c) if (!NILP (KVAR (kb, defining_kbd_macro))) { + /* We received a Quit: save the current kboard in Vlast_kbd_macro */ + if (XFASTINT (c) == quit_char) + save_aborted_kbd_macro (true); + if (kb->kbd_macro_ptr - kb->kbd_macro_buffer == kb->kbd_macro_bufsize) { ptrdiff_t ptr_offset = kb->kbd_macro_ptr - kb->kbd_macro_buffer; --8<-----------------------------cut here---------------end--------------->8---