all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: phillip.lord@russet.org.uk (Phillip Lord)
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: [Emacs-diffs] fix/no-undo-boundary-on-secondary-buffer-change f59d1be: Move undo amalgamation to lisp.
Date: Wed, 21 Oct 2015 20:27:57 +0100	[thread overview]
Message-ID: <87mvvc9g3m.fsf@russet.org.uk> (raw)
In-Reply-To: <jwv4mho2meo.fsf-monnier+emacsdiffs@gnu.org> (Stefan Monnier's message of "Sun, 18 Oct 2015 12:51:41 -0400")

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> The alternative is sticking a direct call to simple.el into the command
>> loop, but I would just put it immediately before post-command-hook.
>
> The current behavior is to call it right *before* running the command,
> i.e. after running post-command-hook, and even after running the next
> pre-command-hook.
>
> I recommend you keep the bikeshed of the same color.
> If someone wants to change the behavior she can use an advice anyway.
> And we can move it to a hook later on if we want.

Okay.

>> delete-char does indeed call "remove_excessive_boundaries", but for the
>> life of me I can not reproduce any affect that this has at the user level.
>
> Try C-d C-d C-d C-d C-x u.  It should undo all 4 C-d rather than only
> the last one.  This is new in Emacs-25.
>
>> If I type "abcde" into a clean buffer, then "undo" all the letters
>> disappear at once (since they have amalgamated). If, though I have
>> "abcde" in the buffer and do 5x delete followed by "undo" the letters
>> reappear one at a time.
>
> Have you tested with Emacs<25 by any chance?

Yeah, this was my mistake. I have fixed this now. I believe my code
means that other "amalgamating" commands could be added freely (i.e.
from within lisp) also.


>> current_kboard? KVAR?
>
>     KVAR (current_kboard, Vlast_command)
>
> is the C code needed to find the value of Elisp's `last-command',
> because it is a "keyboard-local" variable.
>
>> And why the "executing_kbd_macro" check?
>
> IIUC this is inherited from Emacs<19 and I just blindly preserved it.
> I recommend you just do the same unless it causes problems.

I've moved all of this to lisp now. I don't currently have the
executing_kbd_macro check in, but I guess I could add.


>>  ;;; Code:
>> -
>>  (eval-when-compile (require 'cl-lib))
>
> Spurious change.

Oops

>
>> +    ;; We need to set `undo-last-boundary' to nil as we are about to
>> +    ;; delete the last boundary, so we want to not assume anything about
>> +    ;; the boundary before this one
>> +    (setq undo-last-boundary nil)
>
> Why is this needed?  The undo-last-boundary handling should work for
> "any" command without any extra code (except for self-insert-command or
> delete-char, obviously) and I don't see why undo should be different here.

Yes. Seemed like a good idea, but wasn't.



>> +(defun undo-needs-boundary-p ()
>
> I recommend you use an "undo--" prefix for most of the funs&vars you've
> introduced, unless you explicitly want to encourage people to make use
> of it from third-party packages.
>
>> +  "Returns non-nil if `buffer-undo-list' needs a boundary at the start."
>       ^^^^^^^
> M-x checkdoc-current-buffer RET will tell you how to fix this.

These and the other stylistic elements that you mentioned have been fixed.



>> +  (condition-case err
>> +      (let ((last-sic-count
>> +             (undo-last-boundary-sic-p undo-last-boundary)))
>> +        (when
>> +            last-sic-count
>> +          (if
>> +              (< last-sic-count 20)
>> +              (progn (undo-auto-message "(changed) Removing last undo")
>> +                     (setq buffer-undo-list
>> +                           (cdr buffer-undo-list)))
>> +            (progn (undo-auto-message "Reset sic to 0")
>> +                   (setq undo-last-boundary
>> +                         '(command self-insert-command 0))))))
>> +    (error
>> +     (undo-auto-message "pre-command-error %s"
>> +                        (error-message-string err)))))
>
> After self-insert-command, undo-undoably-changed-buffers now tells us
> all the buffers that self-insert-command modified, so if we keep this
> list in undo-last-boundary, we can (better: should) here remove the
> boundaries in all those buffers.

I did think about this, or something similar.

But, after self-insert-command, actually, undo-undoably-changed-buffers
tells all the buffers that were modified since the last time we added an
auto-boundary. This will only be the same as the buffers which have
changed as a result of self-insert-command iff
undo-undoably-changed-buffers was nil before the command. It need not be
if buffers are undoably-changing as a result of a timer or a process for
instance.

My other concern is that after a self-insert-command, I can guarantee
that the current-buffer hasn't changed much (normally by one char). But,
for example, with lentic a self-insert-command in one buffer can in
worse case result in all the characters in another buffer changing. So
amalgamating these changes might result in a big buffer-undo-list.

It should be possible for package developers who care to run the
amalgamation code in the buffers of their choice, I think.

Phil



  reply	other threads:[~2015-10-21 19:27 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20151005134118.10933.50859@vcs.savannah.gnu.org>
     [not found] ` <E1Zj610-0002qx-SM@vcs.savannah.gnu.org>
2015-10-05 15:15   ` [Emacs-diffs] fix/no-undo-boundary-on-secondary-buffer-change f59d1be: Move undo amalgamation to lisp Stefan Monnier
2015-10-05 16:24     ` Phillip Lord
2015-10-07 19:28       ` Stefan Monnier
2015-10-08 19:56         ` Phillip Lord
2015-10-08 20:53           ` Stefan Monnier
2015-10-09  8:31             ` Phillip Lord
2015-10-16 21:02         ` Phillip Lord
2015-10-18 16:51           ` Stefan Monnier
2015-10-21 19:27             ` Phillip Lord [this message]
2015-10-26 17:56               ` Stefan Monnier
2015-10-27 12:45                 ` Phillip Lord
2015-10-27 14:50                   ` Stefan Monnier
2015-10-28 10:01                     ` Phillip Lord
2015-10-28 13:05                       ` Stefan Monnier
2015-10-29 14:44                         ` Phillip Lord
2015-10-29 15:47                           ` Stefan Monnier
2015-10-30  8:44                             ` Phillip Lord
2015-10-30 13:28                               ` Stefan Monnier
2015-10-30 14:21                                 ` David Kastrup
2015-11-02 16:56                                   ` Phillip Lord
2015-11-02 19:37                                     ` David Kastrup

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=87mvvc9g3m.fsf@russet.org.uk \
    --to=phillip.lord@russet.org.uk \
    --cc=emacs-devel@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.