Subject: bug#13882: closed (Re: bug#13882: 24.2; saveplace.el limit drop least recently used)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 13 Mar 2013 19:01:02 +0000

Your bug report

#13882: 24.2; saveplace.el limit drop least recently used

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
13882: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13882
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#13882: 24.2; saveplace.el limit drop least recently used
From: Karl Fogel <[email-masked]>
To: Kevin Ryde <[email-masked]>
Cc: Ian Dalton <[email-masked]>, [email-masked], Dmitry Gutov <[email-masked]>
Date: Wed, 13 Mar 2013 13:59:12 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

Kevin Ryde <[email-masked]> writes:
>Ian Dalton <[email-masked]> writes:
>> I no longer use this setup, so I don't know how useful a change it was. I
>> think that the Unison UI had some kind of option to do guided file merges,
>> but it only worked for the usual simple line-oriented diff.
>
>Hmm.  Making the file line-wise probably helped, but I imagine there's
>no file format which could give the perfect result from the usual
>diff/patch contextual merges.
>
>How about keeping the line-by-line pretty print for everyone's
>readability, but drop the sort since it's actively harmful, and leave
>anything more for future thought.

Done; see revision below.  Thanks, Dmitry, Kevin, and Ian, for your
thorough & patient explanations.

  ------------------------------------------------------------
  revno: 112040
  revision-id: [email-masked]
  parent: [email-masked]
  committer: Karl Fogel <[email-masked]>
  branch nick: trunk
  timestamp: Wed 2013-03-13 13:54:05 -0500
  message:
    * saveplace.el (save-place-alist-to-file): Don't sort
    `save-place-alist', just pretty-print it (bug#13882).
  modified:
    lisp/ChangeLog      changelog-20091113204419-o5vbwnq5f7feedwu-1432
    lisp/saveplace.el   saveplace.el-20091113204419-o5vbwnq5f7feedwu-622
  ------------------------------------------------------------

-Karl

Subject: 24.2; saveplace.el limit drop least recently used
From: Kevin Ryde <[email-masked]>
To: [email-masked]
Date: Wed, 06 Mar 2013 07:49:14 +1100
List-Id: <debbugs-submit.debbugs.gnu.org>

When saveplace.el reaches save-place-limit, the file positions retained
via ~/.emacs-places are the first limit-many in alphabetical order.
I hoped instead it would be the first limit-many most recently used.
Ie. drop the least recently visited files in order to enforce the limit.

I struck this when I reached my save-place-limit with lots of files I
had visited long ago but which happened to be alphabetically before ones
I was visiting now.  The save-place feature no longer saved places
across sessions for files I now visited.

The effect can be seen by setting a small limit per init.el below.  Then
foo.el to visit three files successively

    HOME=`pwd` emacs -Q -l ./init.el -l ./foo.el

This leaves .emacs-places (in the current directory due to faked $HOME)
containing

    (("/tmp/aa" . 4)
     ("/tmp/bb" . 4)
     ("/tmp/cc" . 4))

Notice /tmp/cc was the most recently visited file but it's at the end of
the list and will be truncated when load-save-place-alist-from-file
enforces save-place-limit of 2.

    HOME=`pwd` emacs -Q -l ./init.el /tmp/cc
    =>
    point is at start of buffer /tmp/cc
    I hoped it would be at the end from the last visit

Note that you must exit and restart emacs to see the effect, because
save-place-limit is only enforced by load-save-place-alist-from-file.
Within a session there's no limit, only in reading the .emacs-places
file on restarting emacs.

I get some joy from not sorting save-place-alist when saving per change
below.

I believe save-place-to-alist keeps save-place-alist in "most recent
first" order (by delq and re-push to move an existing entry to the
start), and that that order should be preserved when saving.

2013-03-04  Kevin Ryde  <[email-masked]>

	* saveplace.el (save-place-alist-to-file): Don't `sort'
	save-place-alist alphabetically, keep it in "most recent first" order.
	This ensures save-place-limit drops the least recently visited files,
	not the alphabetically last files.  Dropping alphabetically last files
	had meant save-place stopped working across sessions after
	.emacs-places filled with alphabetically early names.

--- saveplace.el.orig	2013-03-04 17:06:20.000000000 +1100
+++ saveplace.el	2013-03-04 17:07:42.000000000 +1100
@@ -224,8 +224,7 @@
                       (symbol-name coding-system-for-write)))
       (let ((print-length nil)
             (print-level nil))
-        (pp (sort save-place-alist
-                  (lambda (a b) (string< (car a) (car b))))
+        (pp save-place-alist ;; saved in order of most recently used
             (current-buffer)))
       (let ((version-control
              (cond

In GNU Emacs 24.2.1 (i486-pc-linux-gnu, GTK+ Version 2.24.10)
 of 2012-09-10 on biber, modified by Debian
Configured using:
 `configure '--build' 'i486-linux-gnu' '--build' 'i486-linux-gnu'
 '--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib'
 '--localstatedir=/var/lib' '--infodir=/usr/share/info'
 '--mandir=/usr/share/man' '--with-pop=yes'
 '--enable-locallisppath=/etc/emacs24:/etc/emacs:/usr/local/share/emacs/24.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/24.2/site-lisp:/usr/share/emacs/site-lisp'
 '--with-crt-dir=/usr/lib/i386-linux-gnu' '--with-x=yes'
 '--with-x-toolkit=gtk' '--with-toolkit-scroll-bars'
 'build_alias=i486-linux-gnu' 'CFLAGS=-g -O2 -fstack-protector
 --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall'
 'CPPFLAGS=-D_FORTIFY_SOURCE=2''

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: en_AU
  value of $XMODIFIERS: nil
  locale-coding-system: iso-latin-1-unix
  default enable-multibyte-characters: t