From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Re: Changing of line format and undo Date: Sun, 02 Jul 2006 11:39:05 -0400 Message-ID: <87k66wvx4u.fsf-monnier+emacs@gnu.org> References: <44987375.2010000@student.lu.se> <449961F6.6020001@student.lu.se> <85mzc6y204.fsf@lola.goethe.zz> <44996AE1.7020907@student.lu.se> <858xnqxyg9.fsf@lola.goethe.zz> <4499781F.7090802@student.lu.se> NNTP-Posting-Host: main.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1151854771 23230 80.91.229.2 (2 Jul 2006 15:39:31 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sun, 2 Jul 2006 15:39:31 +0000 (UTC) Cc: Eli Zaretskii , emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Jul 02 17:39:30 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1Fx42j-0000lN-2s for ged-emacs-devel@m.gmane.org; Sun, 02 Jul 2006 17:39:29 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Fx42i-0000xg-Il for ged-emacs-devel@m.gmane.org; Sun, 02 Jul 2006 11:39:28 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Fx42U-0000vh-32 for emacs-devel@gnu.org; Sun, 02 Jul 2006 11:39:14 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Fx42R-0000to-Tf for emacs-devel@gnu.org; Sun, 02 Jul 2006 11:39:13 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Fx42R-0000tg-QW for emacs-devel@gnu.org; Sun, 02 Jul 2006 11:39:11 -0400 Original-Received: from [209.226.175.110] (helo=tomts43-srv.bellnexxia.net) by monty-python.gnu.org with esmtp (Exim 4.52) id 1Fx4Fc-0001Or-FT; Sun, 02 Jul 2006 11:52:48 -0400 Original-Received: from alfajor ([70.55.142.199]) by tomts43-srv.bellnexxia.net (InterMail vM.5.01.06.13 201-253-122-130-113-20050324) with ESMTP id <20060702153905.URU1543.tomts43-srv.bellnexxia.net@alfajor>; Sun, 2 Jul 2006 11:39:05 -0400 Original-Received: by alfajor (Postfix, from userid 1000) id 5CD16D7393; Sun, 2 Jul 2006 11:39:05 -0400 (EDT) Original-To: Lennart Borgman In-Reply-To: <4499781F.7090802@student.lu.se> (Lennart Borgman's message of "Wed, 21 Jun 2006 18:47:27 +0200") User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:56373 Archived-At: > Thanks, you are right ;-) Now I see what Eli meant. I still believe that > everything that can result in changing an external file should go into the > undo history but this is really a corner case of course. You can change C-x RET f to do what you want by having it add (manually in elisp) an `apply' entry to buufer-undo-list. E.g. I've changed my set-buffer-multibyte to do that (waiting for post-22 to commit it). Stefan --- orig/src/buffer.c +++ mod/src/buffer.c @@ -2112,10 +2100,11 @@ { struct Lisp_Marker *tail, *markers; struct buffer *other; - int undo_enabled_p = !EQ (current_buffer->undo_list, Qt); int begv, zv; int narrowed = (BEG != BEGV || Z != ZV); int modified_p = !NILP (Fbuffer_modified_p (Qnil)); + Lisp_Object old_undo = current_buffer->undo_list; + struct gcpro gcpro1; if (current_buffer->base_buffer) error ("Cannot do `set-buffer-multibyte' on an indirect buffer"); @@ -2124,10 +2113,11 @@ if (NILP (flag) == NILP (current_buffer->enable_multibyte_characters)) return flag; - /* It would be better to update the list, - but this is good enough for now. */ - if (undo_enabled_p) - current_buffer->undo_list = Qt; + GCPRO1 (old_undo); + + /* Don't record these buffer changes. We will put a special undo entry + instead. */ + current_buffer->undo_list = Qt; /* If the cached position is for this buffer, clear it out. */ clear_charpos_cache (current_buffer); @@ -2327,8 +2317,18 @@ set_intervals_multibyte (1); } - if (undo_enabled_p) - current_buffer->undo_list = Qnil; + if (!EQ (old_undo, Qt)) + { + /* Represent all the above changes by a special undo entry. */ + extern Lisp_Object Qapply; + Lisp_Object args[3]; + args[0] = Qapply; + args[1] = Qset_buffer_multibyte; + args[2] = NILP (flag) ? Qt : Qnil; + current_buffer->undo_list = Fcons (Flist (3, args), old_undo); + } + + UNGCPRO; /* Changing the multibyteness of a buffer means that all windows showing that buffer must be updated thoroughly. */