all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* when you gotta have a variable value for a symbol name
@ 2014-07-23 21:37 Buchs, Kevin J.
  2014-07-23 22:02 ` Drew Adams
       [not found] ` <mailman.5936.1406152985.1147.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Buchs, Kevin J. @ 2014-07-23 21:37 UTC (permalink / raw)
  To: help-gnu-emacs

I want to evaluate (kmacro-name-last-macro variable), where I want the 
value of "variable" passed as the symbol name. Despite years of trying, 
I don't think I ever really conceptually "got" the distinction between 
symbols and variables and that seems to be critical here. I'm working 
with the code below, but it is not suceeding in naming the macros (no 
error messages, however). Of course (kmacro-name-last-macro 'my-macro) 
works just fine.

-- 
Kevin Buchs   Research Computer Services   Phone: 507-538-5459
Mayo Clinic   200 1st. St SW   Rochester, MN 55905
http://mayoclinic.org  http://facebook.com/MayoClinic  http://youtube.com/MayoClinic  http://twitter.com/MayoClinic

(defun name-my-macro-sequentially ()
   "Names the last recorded macro as my-macro#, where # is a number sequentially incremented"
    (interactive)
    (unless (boundp 'my-macro-counter) (setq my-macro-counter 0))
    (setq my-macro-counter (1+ my-macro-counter))
    (let ((macro-name (format "my-macro-%d" my-macro-counter)))
       (kmacro-name-last-macro (make-symbol macro-name))
       (message "named keyboard macro %s" macro-name)))




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: when you gotta have a variable value for a symbol name
  2014-07-23 21:37 when you gotta have a variable value for a symbol name Buchs, Kevin J.
@ 2014-07-23 22:02 ` Drew Adams
       [not found]   ` <(message>
  2014-07-24 21:57   ` Robert Thorpe
       [not found] ` <mailman.5936.1406152985.1147.help-gnu-emacs@gnu.org>
  1 sibling, 2 replies; 838+ messages in thread
From: Drew Adams @ 2014-07-23 22:02 UTC (permalink / raw)
  To: Buchs, Kevin J., help-gnu-emacs

> I want to evaluate (kmacro-name-last-macro variable), where I want the
> value of "variable" passed as the symbol name. Despite years of trying,
> I don't think I ever really conceptually "got" the distinction between
> symbols and variables and that seems to be critical here. I'm working
> with the code below, but it is not suceeding in naming the macros (no
> error messages, however). Of course (kmacro-name-last-macro 'my-macro)
> works just fine.
>
> (defun name-my-macro-sequentially ()
>    "Names the last recorded macro as my-macro#, where # is a number
> sequentially incremented"
>     (interactive)
>     (unless (boundp 'my-macro-counter) (setq my-macro-counter 0))
>     (setq my-macro-counter (1+ my-macro-counter))
>     (let ((macro-name (format "my-macro-%d" my-macro-counter)))
>        (kmacro-name-last-macro (make-symbol macro-name))
                                  ^^^^^^^^^^^
>        (message "named keyboard macro %s" macro-name)))

Change `make-symbol' to `intern' and you're good to go.  `make-symbol'
returns an uninterned symbol.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: when you gotta have a variable value for a symbol name
       [not found] ` <mailman.5936.1406152985.1147.help-gnu-emacs@gnu.org>
@ 2014-07-23 22:12   ` Pascal J. Bourguignon
  0 siblings, 0 replies; 838+ messages in thread
From: Pascal J. Bourguignon @ 2014-07-23 22:12 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

>> I want to evaluate (kmacro-name-last-macro variable), where I want the
>> value of "variable" passed as the symbol name. Despite years of trying,
>> I don't think I ever really conceptually "got" the distinction between
>> symbols and variables and that seems to be critical here. I'm working
>> with the code below, but it is not suceeding in naming the macros (no
>> error messages, however). Of course (kmacro-name-last-macro 'my-macro)
>> works just fine.
>>
>> (defun name-my-macro-sequentially ()
>>    "Names the last recorded macro as my-macro#, where # is a number
>> sequentially incremented"
>>     (interactive)
>>     (unless (boundp 'my-macro-counter) (setq my-macro-counter 0))
>>     (setq my-macro-counter (1+ my-macro-counter))
>>     (let ((macro-name (format "my-macro-%d" my-macro-counter)))
>>        (kmacro-name-last-macro (make-symbol macro-name))
>                                   ^^^^^^^^^^^
>>        (message "named keyboard macro %s" macro-name)))
>
> Change `make-symbol' to `intern' and you're good to go.  `make-symbol'
> returns an uninterned symbol.

And use:

   (defvar my-macro-counter 0)
   (defun …
    )

instead of:

   (defun …
      …
      (unless (boundp 'my-macro-counter) (setq my-macro-counter 0))
      …)



-- 
__Pascal Bourguignon__                 http://www.informatimago.com/
“The factory of the future will have only two employees, a man and a
dog. The man will be there to feed the dog. The dog will be there to
keep the man from touching the equipment.” -- Carl Bass CEO Autodesk


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: when you gotta have a variable value for a symbol name
  2014-07-23 22:02 ` Drew Adams
       [not found]   ` <(message>
@ 2014-07-24 21:57   ` Robert Thorpe
  2014-07-25  0:06     ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2014-07-24 21:57 UTC (permalink / raw)
  To: Drew Adams; +Cc: buchs.kevin, help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

>> I want to evaluate (kmacro-name-last-macro variable), where I want the
>> value of "variable" passed as the symbol name. Despite years of trying,
>> I don't think I ever really conceptually "got" the distinction between
>> symbols and variables and that seems to be critical here. I'm working
>> with the code below, but it is not suceeding in naming the macros (no
>> error messages, however). Of course (kmacro-name-last-macro 'my-macro)
>> works just fine.

Lisp is like the insides of a compiler.  There's a big hash-map, the
obarray, which is the symbol-table.  It stores strings along with some
information about them.  These strings are "symbols".  There are three
pieces of information: the symbol's value as a variable, the symbols
value as a function and a property list.  An interned symbol is one that
is an entry in the obarray (there can be multiple obarrays though that
feature isn't used much).  An uninterned symbol is one that sits by
itself, it has the same parts as usual: string, function entry, variable
entry and plist, but it's not attached to an obarray.  If we have a
function call: (foo bar 'baz) then lisp treats each of these symbols
differently.  It finds the function slot for foo because that's the
first symbol, it finds the variable slot for bar because it's not first.
Finally, 'baz returns the symbol itself.  To be more careful: (quote
baz) returns a list containing the symbol, which evaluates to the
symbol.

(info "(elisp) Symbols")

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: when you gotta have a variable value for a symbol name
  2014-07-24 21:57   ` Robert Thorpe
@ 2014-07-25  0:06     ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-07-25  0:06 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: buchs.kevin, help-gnu-emacs

> Drew Adams <drew.adams@oracle.com> writes:
...

Quoted text, none of which I wrote...



^ permalink raw reply	[flat|nested] 838+ messages in thread

* When do you prefer frames instead of windows?
@ 2014-11-24 16:40 Raffaele Ricciardi
  2014-11-24 17:20 ` Drew Adams
                   ` (10 more replies)
  0 siblings, 11 replies; 838+ messages in thread
From: Raffaele Ricciardi @ 2014-11-24 16:40 UTC (permalink / raw)
  To: help-gnu-emacs

The usefulness of frames is evident for buffers that update their 
content according to the current buffer (like Speedbar and ECB). 
Besides this kind of use, when do you prefer frames instead of windows?

Thank you.


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
@ 2014-11-24 17:20 ` Drew Adams
  2014-11-25  8:03   ` Gian Uberto Lauri
                     ` (2 more replies)
       [not found] ` <mailman.14479.1416849631.1147.help-gnu-emacs@gnu.org>
                   ` (9 subsequent siblings)
  10 siblings, 3 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-24 17:20 UTC (permalink / raw)
  To: Raffaele Ricciardi, help-gnu-emacs

> The usefulness of frames is evident for buffers that update their
> content according to the current buffer (like Speedbar and ECB).
> Besides this kind of use, when do you prefer frames instead of
> windows?

Personally, almost always.  A window-manager window (Emacs frame)
is more flexible than an Emacs window - more features/possibilities.

Emacs windows were conceived long, long ago - before window
managers were supported/recognized by Emacs and even, for the
most part, before they existed.  They are vestigial organs that
have some limited uses but are generally not the best way to
interact, IMO.

I generally don't like apps to try to lock everything they do into
a single window-mgr window (frame) and provide their own internal
windows within that frame.  That applies to Emacs also.  Whenever
possible/practical, I free such internal windows to become normal
window-mgr windows.  With Emacs this is even better, as you can
manipulate frames using the keyboard, not just the mouse.

However, out of the box, support for using Emacs frames is pretty
primitive.  So I jump through a bunch of configuration hooks to
be able to use them easily (including keyboard manipulation).

Just one (minority) opinion.

I would ask an opposite question: IF you could use Emacs frames
as easily as you can use Emacs windows, in what scenarios would
you prefer using Emacs windows, and why?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
       [not found] ` <mailman.14479.1416849631.1147.help-gnu-emacs@gnu.org>
@ 2014-11-24 17:47   ` Barry Margolin
  2014-11-24 18:06     ` Jai Dayal
  2014-11-25 17:32   ` Joost Kremers
       [not found]   ` <<slrnm79f8k.a37.joost.m.kremers@j.kremers4.news.arnhem.chello.nl>
  2 siblings, 1 reply; 838+ messages in thread
From: Barry Margolin @ 2014-11-24 17:47 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.14479.1416849631.1147.help-gnu-emacs@gnu.org>,
 Drew Adams <drew.adams@oracle.com> wrote:

> > The usefulness of frames is evident for buffers that update their
> > content according to the current buffer (like Speedbar and ECB).
> > Besides this kind of use, when do you prefer frames instead of
> > windows?
> 
> Personally, almost always.  A window-manager window (Emacs frame)
> is more flexible than an Emacs window - more features/possibilities.
> 
> Emacs windows were conceived long, long ago - before window
> managers were supported/recognized by Emacs and even, for the
> most part, before they existed.  They are vestigial organs that
> have some limited uses but are generally not the best way to
> interact, IMO.

Yes, they came about on ASCII terminals, long before graphical 
interfaces became common.

Since I've been using Emacs since those days, I long got used to using a 
single frame with Emacs windows in it. Now, even though I use it on a 
Mac with a wide screen, I still can't get into the habit of using 
multiple frames.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 17:47   ` Barry Margolin
@ 2014-11-24 18:06     ` Jai Dayal
  0 siblings, 0 replies; 838+ messages in thread
From: Jai Dayal @ 2014-11-24 18:06 UTC (permalink / raw)
  To: Barry Margolin; +Cc: help-gnu-emacs

I just use them when I like having different window arrangements based on
content. For example, I like my code buffers split one way, but for
actually running the application's workflow, I like having a window with 4
different ansi-terms split in quarters. Being able to switch easily between
the different frames makes it very easy.

On Mon, Nov 24, 2014 at 12:47 PM, Barry Margolin <barmar@alum.mit.edu>
wrote:

> In article <mailman.14479.1416849631.1147.help-gnu-emacs@gnu.org>,
>  Drew Adams <drew.adams@oracle.com> wrote:
>
> > > The usefulness of frames is evident for buffers that update their
> > > content according to the current buffer (like Speedbar and ECB).
> > > Besides this kind of use, when do you prefer frames instead of
> > > windows?
> >
> > Personally, almost always.  A window-manager window (Emacs frame)
> > is more flexible than an Emacs window - more features/possibilities.
> >
> > Emacs windows were conceived long, long ago - before window
> > managers were supported/recognized by Emacs and even, for the
> > most part, before they existed.  They are vestigial organs that
> > have some limited uses but are generally not the best way to
> > interact, IMO.
>
> Yes, they came about on ASCII terminals, long before graphical
> interfaces became common.
>
> Since I've been using Emacs since those days, I long got used to using a
> single frame with Emacs windows in it. Now, even though I use it on a
> Mac with a wide screen, I still can't get into the habit of using
> multiple frames.
>
> --
> Barry Margolin, barmar@alum.mit.edu
> Arlington, MA
> *** PLEASE post questions in newsgroups, not directly to me ***
>


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
  2014-11-24 17:20 ` Drew Adams
       [not found] ` <mailman.14479.1416849631.1147.help-gnu-emacs@gnu.org>
@ 2014-11-24 19:10 ` MBR
  2014-11-24 19:14   ` Drew Adams
  2014-11-24 22:12 ` H. Dieter Wilhelm
                   ` (7 subsequent siblings)
  10 siblings, 1 reply; 838+ messages in thread
From: MBR @ 2014-11-24 19:10 UTC (permalink / raw)
  To: Raffaele Ricciardi, help-gnu-emacs

I use M-x compare-windows a LOT.  So, I'll usually have at least one 
frame big enough to hold two side-by-side 80 column windows, and that's 
where I'll do most of my work.  However I tend to open a new frame for 
things where I want to see an additional file briefly.

Also, I'm frequently running a local terminal emulator, and from that 
emulator's shell prompt I've got an ssh connection to a remote host on 
which I'm running emacs.  Under those circumstances, frames are not an 
option, so I use emacs windows for everything.

    Mark Rosenthal

On 11/24/14 11:40 AM, Raffaele Ricciardi wrote:
> The usefulness of frames is evident for buffers that update their 
> content according to the current buffer (like Speedbar and ECB). 
> Besides this kind of use, when do you prefer frames instead of windows?
>
> Thank you.
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-24 19:10 ` MBR
@ 2014-11-24 19:14   ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-24 19:14 UTC (permalink / raw)
  To: MBR, Raffaele Ricciardi, help-gnu-emacs

> I use M-x compare-windows a LOT.

Thanks for the reminder.  That is one of the few cases where I do split
a frame into windows. Only because `compare-windows' (unlike Ediff, for
example) does not work across frames.  I should probably code up an
enhancement for it that does, but I don't use `compare-windows' that
often anymore, for some reason.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
                   ` (2 preceding siblings ...)
  2014-11-24 19:10 ` MBR
@ 2014-11-24 22:12 ` H. Dieter Wilhelm
       [not found] ` <mailman.14497.1416867184.1147.help-gnu-emacs@gnu.org>
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 838+ messages in thread
From: H. Dieter Wilhelm @ 2014-11-24 22:12 UTC (permalink / raw)
  To: help-gnu-emacs

Raffaele Ricciardi <rfflrccrd@gmail.com> writes:

> The usefulness of frames is evident for buffers that update their
> content according to the current buffer (like Speedbar and
> ECB). Besides this kind of use, when do you prefer frames instead of
> windows?

To preserve sane window layouts despite a multitude of major modes.

For example: Barry Margolin pointed out that he prefers 4 ansi terminals
in a "shell frame".  I like to have a "file manager" frame with two
dired buffers side by side. Gnus literally "demands" his own frame in
its default mode of operation!

Here's an illustration of my frame setup which is based on Alan
Mackenzie work, so that I'm able to open frames with predefined window
layouts according to various tasks or - if a task frame already exists,
just switch to it.

;; ======================================================================
;; `frames' based on Alan Mackenzie's setup

(set-frame-name "Work")
(modify-frame-parameters (selected-frame) '((acm-no . 2)))
(find-file "~/org/blog/dddlll.org")

(defun assign-acm-no (frame)
  "FRAME is a (typically newly created) frame.  Give it an acm-no
frame-parameter if there is one free (in the range 0..11).
Return that number or nil."
  (let ((assigned (make-bool-vector 12 nil)) (f (frame-list)) n)
    (while f
      (if (setq n (frame-parameter (car f) 'acm-no))
	  (aset assigned n t))
      (setq f (cdr f)))
    (setq n 0)
    (while (and (< n 12) (aref assigned n))
      (setq n (1+ n)))
    (if (= n 12)
	nil
      (modify-frame-parameters frame `((acm-no . ,n)))
      n)))

;(add-hook 'after-make-frame-functions 'assign-acm-no)

(defun find-acm-no-frame (n)
  "Return the frame with parameter (acm-no . N), or nil."
  (let ((f (frame-list)))
    (while (and f (not (eq (frame-parameter (car f) 'acm-no) n)))
      (setq f (cdr f)))
    (car f)))

(defun focus-frame-acm-no (n)
  "Select the frame with acm-no frame-parameter N, or do nothing."
  (let ((frame (find-acm-no-frame n)))
    (when frame (select-frame-set-input-focus frame))
    (framep frame)))

;; frame 2, 3, ...
(defun focus-or-make-named-frame ( no)
  "bla"
  (unless (focus-frame-acm-no no)
    (let ((frame (make-frame-command)))
      (select-frame-set-input-focus frame)
      (cond
       ((= no 1)
	(modify-frame-parameters frame '((acm-no . 1)))
	(set-frame-name "F1 Informations, info, eww")
	(unless (get-buffer "*info*")
	  (info))
	)
       ((= no 2)
	(modify-frame-parameters frame '((acm-no . 2)))
	(set-frame-name "F2 Work")
	)
      ((= no 3)
	(modify-frame-parameters frame '((acm-no . 3)))
	(set-frame-name "F3 Communications Gnus, BBDB")
	(unless (get-buffer "*Group*")
	  (gnus-unplugged))
	)
       ((= no 4)
	(modify-frame-parameters frame '((acm-no . 4)))
	(set-frame-name "F4 OS terminal, shell")
	(split-window-horizontally)
	(unless (get-buffer "*terminal*")
	  (term "/bin/bash"))
	)
       ((= no 5)
	(modify-frame-parameters frame '((acm-no . 5)))
	(set-frame-name "Time Management and Planning")
	(unless (get-buffer "*Calendar*")
	  (calendar))
	)
       ((= no 6)
	(modify-frame-parameters frame '((acm-no . 6)))
	(set-frame-name "Programming and Configuration")
	(unless (get-buffer "init.el")
	  (find-file "~/.emacs.d/init.el"))
	)
       ((= no 7)
	(modify-frame-parameters frame '((acm-no . 7)))
	(set-frame-name "Dired File Manipulations")
	(dired "~"))
       ((= no 8)
	(modify-frame-parameters frame '((acm-no . 8)))
	(set-frame-name "Helper Frame"))
       ((= no 9)
	(modify-frame-parameters frame '((acm-no . 9)))
	(set-frame-name "ERC"))
       ((= no 10)
	(modify-frame-parameters frame '((acm-no . 9)))
	(set-frame-name "Image Dired"))
       ))))

(global-set-key [f1]  (lambda () "Switch to frame 1"  (interactive) (focus-or-make-named-frame 1)))
(global-set-key [f2]  (lambda () "Switch to frame 2"  (interactive) (focus-or-make-named-frame 2)))
(global-set-key [f3]  (lambda () "Switch to frame 3"  (interactive) (focus-or-make-named-frame 3)))
(global-set-key [f4]  (lambda () "Switch to frame 4"  (interactive) (focus-or-make-named-frame 4)))
(global-set-key [f5]  (lambda () "Switch to frame 5"  (interactive) (focus-or-make-named-frame 5)))
(global-set-key [f6]  (lambda () "Switch to frame 6"  (interactive) (focus-or-make-named-frame 6)))
(global-set-key [f7]  (lambda () "Switch to frame 7"  (interactive) (focus-or-make-named-frame 7)))
(global-set-key [f8]  (lambda () "Switch to frame 8"  (interactive) (focus-or-make-named-frame 8)))
(global-set-key [f9]  (lambda () "Switch to frame 9"  (interactive) (focus-or-make-named-frame 9)))
(global-set-key [f10] (lambda () "Switch to frame 10" (interactive) (focus-or-make-named-frame 10)))
;; F11 is toggle full-screen
;; (global-set-key [f12] (lambda () "Switch to frame 12" (interactive) (focus-or-make-named-frame 12)))


   Dieter
-- 
Best wishes
H. Dieter Wilhelm
Darmstadt, Germany



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
       [not found] ` <mailman.14497.1416867184.1147.help-gnu-emacs@gnu.org>
@ 2014-11-25  0:59   ` Barry Margolin
  0 siblings, 0 replies; 838+ messages in thread
From: Barry Margolin @ 2014-11-25  0:59 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.14497.1416867184.1147.help-gnu-emacs@gnu.org>,
 dieter@duenenhof-wilhelm.de (H. Dieter Wilhelm) wrote:

> For example: Barry Margolin pointed out that he prefers 4 ansi terminals
> in a "shell frame".  I like to have a "file manager" frame with two
> dired buffers side by side. Gnus literally "demands" his own frame in
> its default mode of operation!

That wasn't me, it was someone replying to my post.

I just said I use one frame because it's an old habit. I've been using 
Emacs since 1980, multiple frames weren't added until 1994.

Another advantage of windows over frames is they work the same whether 
you're using Emacs in a GUI or terminal. Although I admit that when I 
need to do a quick edit in a terminal, I usually use vi. This is usually 
when I'm ssh'ed into a server, and they usually don't have Emacs 
installed, and even if they did I wouldn't have all my extensions there.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
                   ` (4 preceding siblings ...)
       [not found] ` <mailman.14497.1416867184.1147.help-gnu-emacs@gnu.org>
@ 2014-11-25  1:29 ` Robert Thorpe
  2014-11-25  4:21   ` Drew Adams
  2014-11-25  1:45 ` Yuri Khan
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2014-11-25  1:29 UTC (permalink / raw)
  To: Raffaele Ricciardi; +Cc: help-gnu-emacs

Raffaele Ricciardi <rfflrccrd@gmail.com> writes:

> The usefulness of frames is evident for buffers that update their 
> content according to the current buffer (like Speedbar and ECB). 
> Besides this kind of use, when do you prefer frames instead of windows?

If I have two distinct tasks that each require a set of buffers then
sometimes I create two frames.

As others have mentioned there are advantages to using frames.  Modern X
Windows environments have keybindings for common operations on frames.
However, Microsoft Windows only has a few of those, to tiresome
switching between the keyboard and mouse is needed.  I use both X and MS
Windows daily.  I generally prefer using Emacs windows rather than frames
becuase they can be manipulated using the keyboard on all platforms.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
                   ` (5 preceding siblings ...)
  2014-11-25  1:29 ` Robert Thorpe
@ 2014-11-25  1:45 ` Yuri Khan
  2014-11-25  9:27 ` Ralf Fassel
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 838+ messages in thread
From: Yuri Khan @ 2014-11-25  1:45 UTC (permalink / raw)
  To: Raffaele Ricciardi; +Cc: help-gnu-emacs@gnu.org

On Mon, Nov 24, 2014 at 10:40 PM, Raffaele Ricciardi
<rfflrccrd@gmail.com> wrote:
> The usefulness of frames is evident for buffers that update their content
> according to the current buffer (like Speedbar and ECB). Besides this kind
> of use, when do you prefer frames instead of windows?

At my job, I have a dual monitor setup (16:9 24" + 4:3 20"). I split
my left monitor into two window stacks with i3wm, then put an Emacs
frame in each stack. This gives me roughly 100-character-wide frames
which happily coincides with my team’s coding standard.

This way, I can work with up to 4 buffers when necessary, or
independently switch any of the stacks to a different application
(xterm or Firefox or whatever).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25  1:29 ` Robert Thorpe
@ 2014-11-25  4:21   ` Drew Adams
  2014-11-25  8:54     ` Rainer M Krug
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2014-11-25  4:21 UTC (permalink / raw)
  To: Robert Thorpe, Raffaele Ricciardi; +Cc: help-gnu-emacs

> Modern X Windows environments have keybindings for common operations
> on frames.  However, Microsoft Windows only has a few of those, to
> tiresome switching between the keyboard and mouse is needed.  I use
> both X and MS Windows daily.  I generally prefer using Emacs windows
> rather than frames becuase they can be manipulated using the keyboard
> on all platforms.

It should be possible, out of the box, to do that in Emacs itself.
One set of keys for all platforms, and any set of keys you yourself
choose.

I wrote:

 > With Emacs this is even better, as you can manipulate frames
 > using the keyboard, not just the mouse.
 >
 > However, out of the box, support for using Emacs frames is pretty
 > primitive.  So I jump through a bunch of configuration hooks to
 > be able to use them easily (including keyboard manipulation).

You need to be able to do the same kinds of things with frames
that you can do with Emacs windows - *from the keyboard* (and with
a mouse). Including move around incrementally, resize incrementally,
cycle/choose, tile/split, and so on.

I use Emacs that way, but as I say, this is not provided out of the
box with `emacs -Q'.  (It should be, IMO.)

I really would be interested in people's answers to my question, BTW:

 > IF you could use Emacs frames as easily as you can use Emacs
 > windows, in what scenarios would you prefer using Emacs windows,
 > and why?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-24 17:20 ` Drew Adams
@ 2014-11-25  8:03   ` Gian Uberto Lauri
  2014-11-25 15:46     ` Drew Adams
  2014-11-25  8:33   ` When do you prefer windows instead of frames? Was: " H. Dieter Wilhelm
  2014-11-25  8:52   ` Rainer M Krug
  2 siblings, 1 reply; 838+ messages in thread
From: Gian Uberto Lauri @ 2014-11-25  8:03 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs, Raffaele Ricciardi

Drew Adams writes:

 > I would ask an opposite question: IF you could use Emacs frames
 > as easily as you can use Emacs windows, in what scenarios would
 > you prefer using Emacs windows, and why?

My favourite use of windows is for mail reading, sql interaction
and when working on two parts of the same file or two files with
a macro.

For e-mail, I think you all know at least one between rmail, gnus and
vm.

For sql interaction a sql editing buffer and a db connection buffer
are really a nice way to shot queries to a db for test and debug
purposes.

In these situations I feel that Emacs is "running an application" and
I feel more comfortable with all the application windows in the same
frame.

If the frames could really be used like windows, then, it could be
that I would be comfortable with separate frames.

On the other hand, my favourite use of frames is on an application
specific basis.

One frame for e-mail, one for DB-interaction... Some version ago Emacs
had a nice bug/feature that allowed you to create several WindowMaker
application icons with a single Emacs instance, and using a different
image for each application icon.

This was nice because that let me associate a certain frame with a
certain workspace (i.e. e-mail on workspace 1 and db-interaction on
workspace 6) and use a click on the application icon to jump to that
workspace.

[Now I can just assign different images to different miniwindows.]

-- 
 /\           ___                                    Ubuntu: ancient
/___/\_|_|\_|__|___Gian Uberto Lauri_____               African word
  //--\| | \|  |   Integralista GNUslamico            meaning "I can
\/                 coltivatore diretto di software       not install
     già sistemista a tempo (altrui) perso...                Debian"

Warning: gnome-config-daemon considered more dangerous than GOTO



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer windows instead of frames? Was: When do you prefer frames instead of windows?
  2014-11-24 17:20 ` Drew Adams
  2014-11-25  8:03   ` Gian Uberto Lauri
@ 2014-11-25  8:33   ` H. Dieter Wilhelm
  2014-11-25 15:46     ` Drew Adams
  2014-11-25  8:52   ` Rainer M Krug
  2 siblings, 1 reply; 838+ messages in thread
From: H. Dieter Wilhelm @ 2014-11-25  8:33 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

..

> I would ask an opposite question: IF you could use Emacs frames
> as easily as you can use Emacs windows, in what scenarios would
> you prefer using Emacs windows, and why?

For supporting tasks only: Imagine you are starting from a full-screen
window and want to see temporarily a variable definition in a second
window while still hacking away.  The advantage is that window
operations, like C-x } enlarge-window-horizontally,
delete-other-windows-vertically,... operate simultaneously on all
windows.  In such situations it seems to me much more convenient to use
windows than set it up with frames.

      Dieter
-- 
Best wishes
H. Dieter Wilhelm
Darmstadt, Germany



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 17:20 ` Drew Adams
  2014-11-25  8:03   ` Gian Uberto Lauri
  2014-11-25  8:33   ` When do you prefer windows instead of frames? Was: " H. Dieter Wilhelm
@ 2014-11-25  8:52   ` Rainer M Krug
  2 siblings, 0 replies; 838+ messages in thread
From: Rainer M Krug @ 2014-11-25  8:52 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs, Raffaele Ricciardi

[-- Attachment #1: Type: text/plain, Size: 2783 bytes --]

Drew Adams <drew.adams@oracle.com> writes:

>> The usefulness of frames is evident for buffers that update their
>> content according to the current buffer (like Speedbar and ECB).
>> Besides this kind of use, when do you prefer frames instead of
>> windows?
>
> Personally, almost always.  A window-manager window (Emacs frame)
> is more flexible than an Emacs window - more features/possibilities.
>
> Emacs windows were conceived long, long ago - before window
> managers were supported/recognized by Emacs and even, for the
> most part, before they existed.  They are vestigial organs that
> have some limited uses but are generally not the best way to
> interact, IMO.
>
> I generally don't like apps to try to lock everything they do into
> a single window-mgr window (frame) and provide their own internal
> windows within that frame.  That applies to Emacs also.  Whenever
> possible/practical, I free such internal windows to become normal
> window-mgr windows.  With Emacs this is even better, as you can
> manipulate frames using the keyboard, not just the mouse.
>
> However, out of the box, support for using Emacs frames is pretty
> primitive.  So I jump through a bunch of configuration hooks to
> be able to use them easily (including keyboard manipulation).
>
> Just one (minority) opinion.
>
> I would ask an opposite question: IF you could use Emacs frames
> as easily as you can use Emacs windows, in what scenarios would
> you prefer using Emacs windows, and why?

In the old Windows (95, 98, 2000 - after that I gave up with Windows)
there were also the options to have in e.g. the Turbo Pascal IDE the
windows in one application window (as "windows" under emacs) or as
separate windows (as frames under emacs). And everybody had different
preferences. And I think it it the same here.

One major advantage under Linux when using frames instead of windows, is
"focus follows mouse" - you can simply switch between different emacs
frames by moving the mouse, which you can't when using windows. I know -
I take cover - real emacs user don't use the mose, but for me it was
faster to move the mouse then switching to a different frame, especially
when more then one frame was present.

Now I am using a Mac - not because I don not like Linux anymore, but
because I think the hardware is simply brilliant - with OSX (Linux does
not play nicely along with the retina display and the touch pad the last
time I teried it out) the focus does not follow the mouse, so I am using
frames as kind of topical separation for my buffers.

One other advantage of using frames is multiple monitors - one frame per
monitor.

Cheers,

Rainer

>
>

-- 
Rainer M. Krug
email: Rainer<at>krugs<dot>de
PGP: 0x0F52F982

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 494 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-25  4:21   ` Drew Adams
@ 2014-11-25  8:54     ` Rainer M Krug
  2014-11-25 15:47       ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Rainer M Krug @ 2014-11-25  8:54 UTC (permalink / raw)
  To: Drew Adams; +Cc: Raffaele Ricciardi, help-gnu-emacs, Robert Thorpe

[-- Attachment #1: Type: text/plain, Size: 1760 bytes --]

Drew Adams <drew.adams@oracle.com> writes:

>> Modern X Windows environments have keybindings for common operations
>> on frames.  However, Microsoft Windows only has a few of those, to
>> tiresome switching between the keyboard and mouse is needed.  I use
>> both X and MS Windows daily.  I generally prefer using Emacs windows
>> rather than frames becuase they can be manipulated using the keyboard
>> on all platforms.
>
> It should be possible, out of the box, to do that in Emacs itself.
> One set of keys for all platforms, and any set of keys you yourself
> choose.
>
> I wrote:
>
>  > With Emacs this is even better, as you can manipulate frames
>  > using the keyboard, not just the mouse.
>  >
>  > However, out of the box, support for using Emacs frames is pretty
>  > primitive.  So I jump through a bunch of configuration hooks to
>  > be able to use them easily (including keyboard manipulation).
>
> You need to be able to do the same kinds of things with frames
> that you can do with Emacs windows - *from the keyboard* (and with
> a mouse). Including move around incrementally, resize incrementally,
> cycle/choose, tile/split, and so on.
>
> I use Emacs that way, but as I say, this is not provided out of the
> box with `emacs -Q'.  (It should be, IMO.)

You are throwing teaser around - is your emacs config some=where on=ine,
so that I could take a look at your configuration regarding frames?

>
> I really would be interested in people's answers to my question, BTW:
>
>  > IF you could use Emacs frames as easily as you can use Emacs
>  > windows, in what scenarios would you prefer using Emacs windows,
>  > and why?
>
>

-- 
Rainer M. Krug
email: Rainer<at>krugs<dot>de
PGP: 0x0F52F982

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 494 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
                   ` (6 preceding siblings ...)
  2014-11-25  1:45 ` Yuri Khan
@ 2014-11-25  9:27 ` Ralf Fassel
  2014-11-25 15:47   ` Drew Adams
       [not found]   ` <mailman.14554.1416930453.1147.help-gnu-emacs@gnu.org>
  2014-11-25 22:28 ` Bob Proulx
                   ` (2 subsequent siblings)
  10 siblings, 2 replies; 838+ messages in thread
From: Ralf Fassel @ 2014-11-25  9:27 UTC (permalink / raw)
  To: help-gnu-emacs

* Raffaele Ricciardi <rfflrccrd@gmail.com>
| The usefulness of frames is evident for buffers that update their
| content according to the current buffer (like Speedbar and
| ECB). Besides this kind of use, when do you prefer frames instead of
| windows?

Single frame for Ediff: A on top, B in the middle, Control at bottom.
The separate control frame is a nuisance with focus-follows-mouse, it
almost always is out of focus, loses the cursor, or misbehaves in other
fashions...

R'


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25  8:03   ` Gian Uberto Lauri
@ 2014-11-25 15:46     ` Drew Adams
  2014-11-25 15:54       ` Gian Uberto Lauri
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2014-11-25 15:46 UTC (permalink / raw)
  To: Gian Uberto Lauri; +Cc: help-gnu-emacs, Raffaele Ricciardi

>  > I would ask an opposite question: IF you could use Emacs frames
>  > as easily as you can use Emacs windows, in what scenarios would
>  > you prefer using Emacs windows, and why?
> 
> ...mail reading, sql interaction and when working on two parts of
> the same file or two files with a macro...
> 
> If the frames could really be used like windows, then, it could be
> that I would be comfortable with separate frames.

That was the question.  "IF you could use frames as easily as you
can use Emacs windows..."  I certainly agree that currently you
cannot, especially with just vanilla Emacs.  But if you could...

> create several WindowMaker application icons with a single Emacs
> instance, and using a different image for each application icon.

That sounds like something that would pertain only to certain
platforms, since different platforms have different notions of
"icon" etc.  But the ability you mention sounds like it might
be useful.

> This was nice because that let me associate a certain frame with a
> certain workspace (i.e. e-mail on workspace 1 and db-interaction on
> workspace 6) and use a click on the application icon to jump to that
> workspace.

FYI, you can use bookmarks to similar effect.  With Bookmark+ you
can just jump to this or that desktop bookmark, to change between
Emacs "workspaces", as defined by desktop.el.  And it doesn't
matter whether you use one frame or 37 frames for such a workspace.

http://www.emacswiki.org/BookmarkPlus#DesktopBookmarks



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer windows instead of frames? Was: When do you prefer frames instead of windows?
  2014-11-25  8:33   ` When do you prefer windows instead of frames? Was: " H. Dieter Wilhelm
@ 2014-11-25 15:46     ` Drew Adams
  2014-11-25 18:40       ` MBR
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2014-11-25 15:46 UTC (permalink / raw)
  To: dieter, help-gnu-emacs

> > I would ask an opposite question: IF you could use Emacs frames
> > as easily as you can use Emacs windows, in what scenarios would
> > you prefer using Emacs windows, and why?
> 
> For supporting tasks only: Imagine you are starting from a full-screen
> window and want to see temporarily a variable definition in a second
> window while still hacking away.  The advantage is that window
> operations, like C-x } enlarge-window-horizontally,
> delete-other-windows-vertically,... operate simultaneously on all
> windows.  In such situations it seems to me much more convenient to
> use windows than set it up with frames.

Again - but what "IF you could use Emacs frames as easily as you
can use Emacs windows"?  That's the question.

Pop up a *Help* frame instead of a *Help* window to show help.  Hit
`C-x 0' to get rid of that frame when you're done.  You probably do
not need to resize the frame (e.g., if the frame is automatically
fit to the size of just the *Help* text).  But if you do, then use
keys to resize it, just as you would for a window.

IOW, think past what you can do with a window (resize, move, control
where it pops up, etc.) that you think you cannot easily do with a
frame now.

I certainly agree that if frames are not made as convenient to
interact with (i.e., the same kinds of operations you use on
windows) then Emacs windows remain useful.  But if Emacs *did*
support such operations with frames, out of the box,...



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25  9:27 ` Ralf Fassel
@ 2014-11-25 15:47   ` Drew Adams
       [not found]   ` <mailman.14554.1416930453.1147.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-25 15:47 UTC (permalink / raw)
  To: Ralf Fassel, help-gnu-emacs

> Single frame for Ediff: A on top, B in the middle, Control at
> bottom.  The separate control frame is a nuisance with
> focus-follows-mouse, it almost always is out of focus, loses
> the cursor, or misbehaves in other fashions...

Seems like that is something that could be fixed.  Have you
thought about filing a bug report / enhancement request?
(`M-x report-emacs-bug')

FWIW, I've been using Ediff with separate frames for decades,
and I don't have any such problem.  But I don't use
`focus-follows-mouse'.

In principle, Ediff should play well with separate frames.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25  8:54     ` Rainer M Krug
@ 2014-11-25 15:47       ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-25 15:47 UTC (permalink / raw)
  To: Rainer M Krug; +Cc: Raffaele Ricciardi, help-gnu-emacs, Robert Thorpe

> > You need to be able to do the same kinds of things with frames
> > that you can do with Emacs windows - *from the keyboard* (and with
> > a mouse). Including move around incrementally, resize
> > incrementally, cycle/choose, tile/split, and so on.
> >
> > I use Emacs that way, but as I say, this is not provided out of
> > the box with `emacs -Q'.  (It should be, IMO.)
> 
> You are throwing teaser around - is your emacs config some=where
> on=ine, so that I could take a look at your configuration regarding
> frames?

I really did not mean it that way.  I'm more interested here in
looking at the use cases that people might think really apply to
Emacs windows inherently.

It's about a thought experiment: WHAT IF you could easily do with
frames what you do with windows, using the keyboard (or the mouse)?
Would you still see some scenarios where you would prefer to use
a window?  If so, what would they be?

I do use code that tries to make frames more convenient to use, but
that really is beside the point of my question.  What I would like
is for vanilla Emacs to provide frame-friendly manipulation.

I do understand that Emacs does not have real control over
window-manager windows (i.e., frames); it can only request/suggest
changes to be made by the window manager.  And different platforms
& window managers are different, so it is likely that there would
never be a 100% cross-platform solution with the level of control
that we have with Emacs windows.

Still, I know from my own experience that it is possible to obtain
pretty much all of the control I expect, at least across GNU/Linux,
UNIX, and MS Windows - I can't vouch for others.


[If you do want to try the code I use, just to get an idea of what
I mean, look here: http://www.emacswiki.org/OneOnOneEmacs.
But again, I'm *not* proposing such code as the solution or even
as *a* solution to the problem of easily doing with frames what
you do with Emacs windows.  This is code that I use to try to
overcome the problem, imperfectly.  That's all.]



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25 15:46     ` Drew Adams
@ 2014-11-25 15:54       ` Gian Uberto Lauri
  0 siblings, 0 replies; 838+ messages in thread
From: Gian Uberto Lauri @ 2014-11-25 15:54 UTC (permalink / raw)
  To: Drew Adams; +Cc: Raffaele Ricciardi, help-gnu-emacs, Gian Uberto Lauri

Drew Adams writes:
 > >  > I would ask an opposite question: IF you could use Emacs frames
 > >  > as easily as you can use Emacs windows, in what scenarios would
 > >  > you prefer using Emacs windows, and why?
 > > 
 > > ...mail reading, sql interaction and when working on two parts of
 > > the same file or two files with a macro...
 > > 
 > > If the frames could really be used like windows, then, it could be
 > > that I would be comfortable with separate frames.
 > 
 > That was the question.  "IF you could use frames as easily as you
 > can use Emacs windows..."  I certainly agree that currently you
 > cannot, especially with just vanilla Emacs.  But if you could...

Frankly, the answer is "I can't answer until I see it working".
But it could be yes, especially if it changes my habits only slightly.

 > FYI, you can use bookmarks to similar effect.  With Bookmark+ you
 > can just jump to this or that desktop bookmark, to change between
 > Emacs "workspaces", as defined by desktop.el.  And it doesn't
 > matter whether you use one frame or 37 frames for such a workspace.
 > 
 > http://www.emacswiki.org/BookmarkPlus#DesktopBookmarks

I will give it a look, thank you!

-- 
 /\           ___                                    Ubuntu: ancient
/___/\_|_|\_|__|___Gian Uberto Lauri_____               African word
  //--\| | \|  |   Integralista GNUslamico            meaning "I can
\/                 coltivatore diretto di software       not install
     già sistemista a tempo (altrui) perso...                Debian"

Warning: gnome-config-daemon considered more dangerous than GOTO



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
       [not found]   ` <mailman.14554.1416930453.1147.help-gnu-emacs@gnu.org>
@ 2014-11-25 15:57     ` Ralf Fassel
  2014-11-25 16:57       ` Drew Adams
                         ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Ralf Fassel @ 2014-11-25 15:57 UTC (permalink / raw)
  To: help-gnu-emacs

* Drew Adams <drew.adams@oracle.com>
| > Single frame for Ediff: A on top, B in the middle, Control at
| > bottom.  The separate control frame is a nuisance with
| > focus-follows-mouse, it almost always is out of focus, loses
| > the cursor, or misbehaves in other fashions...
>
| Seems like that is something that could be fixed.  Have you
| thought about filing a bug report / enhancement request?
| (`M-x report-emacs-bug')

It's not a bug... :-) I don't think there is anything that emacs can do
about it.  If I want focus-follows-mouse (and I want it :-), then moving
the mouse out of the ediff control frame really should move the mouse
out of it, and not try to be helpful and force the mouse inside the
control frame or such nonsense.

I now have bound a key to get my ediff control panel back:
    <C-M-up> runs the command (lambda nil (interactive) (let ((buf
    (get-buffer "*Ediff Control Panel*"))) (if buf (pop-to-buffer buf)))),
    which is an interactive Lisp function.
and then C-l recenters everything (could even pack that in the
keybinding, but...)

My EUR 0.02
R'


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25 15:57     ` Ralf Fassel
@ 2014-11-25 16:57       ` Drew Adams
       [not found]       ` <mailman.14564.1416934703.1147.help-gnu-emacs@gnu.org>
  2014-11-26  5:02       ` Yuri Khan
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-25 16:57 UTC (permalink / raw)
  To: Ralf Fassel, help-gnu-emacs

> | > Single frame for Ediff: A on top, B in the middle, Control at
> | > bottom.  The separate control frame is a nuisance with
> | > focus-follows-mouse, it almost always is out of focus, loses
> | > the cursor, or misbehaves in other fashions...
> >
> | Seems like that is something that could be fixed.  Have you
> | thought about filing a bug report / enhancement request?
> | (`M-x report-emacs-bug')
> 
> It's not a bug... :-) I don't think there is anything that emacs can
> do about it.  If I want focus-follows-mouse (and I want it :-), then
> moving the mouse out of the ediff control frame really should move the
> mouse out of it, and not try to be helpful and force the mouse inside
> the control frame or such nonsense.

Is that not what happens?  I would think that that is a bug.
I agree that with focus-follow-mouse the focus should follow
the mouse. ;-)

And if it did do that?  What would the problem be with Ediff, in that
case?  I should think that there would be no problem.

If you leave your mouse in the Ediff Control Panel frame then focus
should stay there, and if you move it out of that frame, into another
frame, then focus should leave that frame.  That should be no different
from turning off focus-follows-mouse and clicking in a frame to focus
it.

Assuming that this worked (if it does not), what would the problem be
for Ediff, for your use?

> I now have bound a key to get my ediff control panel back:
>     <C-M-up> runs the command (lambda nil (interactive) (let ((buf
>     (get-buffer "*Ediff Control Panel*"))) (if buf (pop-to-buffer
>     buf)))),
>     which is an interactive Lisp function.
> and then C-l recenters everything (could even pack that in the
> keybinding, but...)

I don't think Ediff should be grabbing focus back, if you have
asked that focus move elsewhere (which you do when you move the
mouse out of the control frame).  This sounds like a bug, to me (FWIW).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
       [not found]       ` <mailman.14564.1416934703.1147.help-gnu-emacs@gnu.org>
@ 2014-11-25 17:16         ` Ralf Fassel
  2014-11-25 18:09           ` Drew Adams
  2014-11-25 22:02           ` Subhan Michael Tindall
  0 siblings, 2 replies; 838+ messages in thread
From: Ralf Fassel @ 2014-11-25 17:16 UTC (permalink / raw)
  To: help-gnu-emacs

* Drew Adams <drew.adams@oracle.com>
| If you leave your mouse in the Ediff Control Panel frame then focus
| should stay there, and if you move it out of that frame, into another
| frame, then focus should leave that frame.  That should be no
| different from turning off focus-follows-mouse and clicking in a frame
| to focus it.

Agreed, and that is exactly what happens.  No fault of emacs anywhere in
sight.  Problem is completely located between chair and screen.

| Assuming that this worked (if it does not), what would the problem be
| for Ediff, for your use?

During an Ediff Session, sometimes I have to leave the Control Panel to
check something in a different window or buffer, or even on a different
desktop.  When I get back to Ediff: where is my Control Panel?  Yes, of
course it is still where I left it, upper right corner of the screen,
but obscured now by the terminal, firefox or any other odd window I
happened to raise over it during my check-something-outside-of-ediff.
And even if the Control Panel is still visible on the screen, the mouse
is no longer inside that Control Panel.

In order to get my ediff session back, I have to accurately raise the
control panel, raise emacs (I *think* they are connected somehow, so
maybe this is not necessary), place mouse accurately inside (tiny)
Control Panel, pay attention not to nudge it out of there etc etc.

Compare to single frame ediff: move mouse anywhere into (large) emacs
window, press C-M-Up, press C-L, continue with ediff.

And no, I will *not* enter a bug report for this, even if it were one ;-)

R'


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
       [not found] ` <mailman.14479.1416849631.1147.help-gnu-emacs@gnu.org>
  2014-11-24 17:47   ` Barry Margolin
@ 2014-11-25 17:32   ` Joost Kremers
       [not found]   ` <<slrnm79f8k.a37.joost.m.kremers@j.kremers4.news.arnhem.chello.nl>
  2 siblings, 0 replies; 838+ messages in thread
From: Joost Kremers @ 2014-11-25 17:32 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams wrote:
> I would ask an opposite question: IF you could use Emacs frames
> as easily as you can use Emacs windows, in what scenarios would
> you prefer using Emacs windows, and why?

The one thing I like about Emacs windows as opposed to frames is that
they resize automatically: when you create one, another window is
reduced in size, so that the new window doesn't cover it, and when you
delete one, another one grows in order to occupy the space that becomes
available.

I tend to work in a single window occupying a maximised frame, and when
I want/need to do something else, I usually switch to that buffer. (I'm
perfectly happy letting mu4e or ebib or ediff or whatever take over the
entire window, hiding what I was working on before.) When I do split the
one window, it's usually for something I only need to take a quick look
at (help buffer, error messages, etc.) I don't want that window to cover
what is in my "main" window, and I want to get rid of the extra window
as soon as I'm done with it.

AFAIK this automatic resizing isn't possible or at least not as easy
with frames. I find this a definite advantage of windows over frames,
and to be honest, I don't see what advantages frames have over windows.
(You mention they have more features/possibilities, but I'm not sure
which features you mean...)


-- 
Joost Kremers                                   joostkremers@fastmail.fm
Selbst in die Unterwelt dringt durch Spalten Licht
EN:SiS(9)


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25 17:16         ` Ralf Fassel
@ 2014-11-25 18:09           ` Drew Adams
  2014-11-25 22:08             ` Subhan Michael Tindall
       [not found]             ` <mailman.14600.1416953316.1147.help-gnu-emacs@gnu.org>
  2014-11-25 22:02           ` Subhan Michael Tindall
  1 sibling, 2 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-25 18:09 UTC (permalink / raw)
  To: Ralf Fassel, help-gnu-emacs

> During an Ediff Session, sometimes I have to leave the Control Panel
> to check something in a different window or buffer, or even on a
> different desktop.  When I get back to Ediff: where is my Control Panel?
> Yes, of course it is still where I left it, upper right corner of the
> screen, but obscured now by the terminal, firefox or any other odd
> window I happened to raise over it during my check-something-outside-of-
> ediff.  And even if the Control Panel is still visible on the screen,
> the mouse is no longer inside that Control Panel.

Yes, this is why Emacs should provide simple key sequences to raise
and refocus frames.

It's no different from what happens if you (one way or another)
select another window, if that window obscures (e.g. replaces) the
window you previously had selected.  You need an easy way to select
arbitrary windows and frames, including from the keyboard.

Wrt frames obscuring/overlapping other frames (for which the window
analogy is windows replacing other windows, or windows simply being
removed), it helps a lot if you let frames be automatically fit to
the size of their displayed text (within max & min limits you set).

> In order to get my ediff session back, I have to accurately raise
> the control panel, raise emacs (I *think* they are connected somehow,
> so maybe this is not necessary), place mouse accurately inside (tiny)
> Control Panel, pay attention not to nudge it out of there etc etc.

Yup.  A PITA.

> Compare to single frame ediff: move mouse anywhere into (large)
> emacs window, press C-M-Up, press C-L, continue with ediff.

Yes.

Consider binding a key to refocus the Ediff Control Panel frame.
You can bind it for just the duration of the Ediff command.  (The
function to raise and focus a frame is `select-frame-set-input-focus'.)

> And no, I will *not* enter a bug report for this, even if it were
> one ;-)

OK.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
       [not found]   ` <<slrnm79f8k.a37.joost.m.kremers@j.kremers4.news.arnhem.chello.nl>
@ 2014-11-25 18:09     ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-25 18:09 UTC (permalink / raw)
  To: Joost Kremers, help-gnu-emacs

> > I would ask an opposite question: IF you could use Emacs frames
> > as easily as you can use Emacs windows, in what scenarios would
> > you prefer using Emacs windows, and why?
> 
> The one thing I like about Emacs windows as opposed to frames is
> that they resize automatically: when you create one, another window
> is reduced in size, so that the new window doesn't cover it, and
> when you delete one, another one grows in order to occupy the space
> that becomes available.

Agreed, but in a way you are making a virtue of necessity.  From
the moment that the design is such that windows cannot overlap,
they *must* be resized, repositioned within the frame, or replaced
by another window, as the only possible adjustments for visibility.

Frames can overlap.  That is a strength, not a weakness.  It is
an additional possibility, but they need not overlap.

Nothing prevents a set of frames from having the same limited
behavior that you like in Emacs windows: tiling, replacing each
other, resizing relative to others shown, etc.  In addition
or alternatively, frames can overlap each other (by default).

Are there advantages to overlapping and arbitrary (pixel-level)
positioning?  I think so.  The analog to overlapping, for windows,
is to turn on line truncation and allow an adjacent window more
space.  IOW, when you want to see more of one and are willing to
forego seeing some of the other (but still see some of it), that's
what you do with windows.  (For the vertical case, just resize.)

> I tend to work in a single window occupying a maximised frame,
> and when I want/need to do something else, I usually switch to
> that buffer.  AFAIK this automatic resizing isn't possible or
> at least not as easy with frames. 

It is possible.  It is not provided (so no, it is not as easy).  

> I find this a definite advantage of windows over frames,

Agreed.

> and to be honest, I don't see what advantages frames have over
> windows.  (You mention they have more features/possibilities,
> but I'm not sure which features you mean...)

Whatever can be done with windows could be done with frames,
AFAICT.  That all of that is not easily available is another
story.

In addition, frames can be positioned arbitrarily.  They are
not constrained to be within anything, other than your display.
And positioning is at the pixel level.  That's about it, AFAIK.

There are some other frame parameters that might not have
analogs for  windows (can't think of them, offhand), but
essentially it's about arbitrary positioning.

(There is also iconifying, but whether you look at that as a
useful feature is up to you.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer windows instead of frames? Was: When do you prefer frames instead of windows?
  2014-11-25 15:46     ` Drew Adams
@ 2014-11-25 18:40       ` MBR
  2014-11-25 18:52         ` Drew Adams
                           ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: MBR @ 2014-11-25 18:40 UTC (permalink / raw)
  To: Drew Adams, dieter, help-gnu-emacs

Be very careful with the phrase "use ... as easily as you can use ...".  
There are some people out there who consider pointing with the mouse 
easy.  I, on the other hand find it easier to use the keyboard.  The 
keyboard, along with Emacs' wide array of cursor positioning commands, 
gives me the ability to quickly and easily get to specific precise 
positions - at least precise based on character position in a character 
cell terminal or editor window.

There are probably other areas where different Emacs users would have 
diametrically opposite views on what they consider to be easy.

    Mark Rosenthal

On 11/25/14 10:46 AM, Drew Adams wrote:
>>> I would ask an opposite question: IF you could use Emacs frames
>>> as easily as you can use Emacs windows, in what scenarios would
>>> you prefer using Emacs windows, and why?
>> For supporting tasks only: Imagine you are starting from a full-screen
>> window and want to see temporarily a variable definition in a second
>> window while still hacking away.  The advantage is that window
>> operations, like C-x } enlarge-window-horizontally,
>> delete-other-windows-vertically,... operate simultaneously on all
>> windows.  In such situations it seems to me much more convenient to
>> use windows than set it up with frames.
> Again - but what "IF you could use Emacs frames as easily as you
> can use Emacs windows"?  That's the question.
>
> Pop up a *Help* frame instead of a *Help* window to show help.  Hit
> `C-x 0' to get rid of that frame when you're done.  You probably do
> not need to resize the frame (e.g., if the frame is automatically
> fit to the size of just the *Help* text).  But if you do, then use
> keys to resize it, just as you would for a window.
Yes, but typing C-x o is something I can do easily because it involves 
two fingers on the left hand immediately followed by one finger on the 
right hand, without fingers my ever having to leave home position.  C-x 
5 o, on the other hand involves my typing two successive characters with 
my left hand before I can switch to the right hand for the "o".  And, 
worse than that, "x" is in the bottom row but "5" is in the top row, 
which means that even though my fingers' average position is over home 
position, they're jumping Saturday as far as they ever do on vertically.

All this means that my mental focus on the code I'm writing doesn't get 
distracted when I type C-x 0, but when I type C-x 5 o, I have to take 
some of my focus away from the code to make sure I don't miss the "5" 
after the "x".
>
> IOW, think past what you can do with a window (resize, move, control
> where it pops up, etc.) that you think you cannot easily do with a
> frame now.
>
> I certainly agree that if frames are not made as convenient to
> interact with (i.e., the same kinds of operations you use on
> windows) then Emacs windows remain useful.  But if Emacs *did*
> support such operations with frames, out of the box,...
>
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer windows instead of frames? Was: When do you prefer frames instead of windows?
  2014-11-25 18:40       ` MBR
@ 2014-11-25 18:52         ` Drew Adams
  2014-11-26  2:31         ` Yuri Khan
  2014-12-19 16:08         ` Jude DaShiell
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-25 18:52 UTC (permalink / raw)
  To: MBR, dieter, help-gnu-emacs

> Be very careful with the phrase "use ... as easily as you
> can use ...".  There are some people out there who consider
> pointing with the mouse easy.

As easily as you can using whatever way you currently interact
with windows - keyboard, mouse, foot pedals,...

And I made it clear that being able to use only the keyboard
(if a user prefers that) is required.  That's definitely part
of being able to use windows easily and would need to be part
of being able to use frames easily.  I thought I was clear
about this.

> There are probably other areas where different Emacs users
> would have diametrically opposite views on what they consider
> to be easy.

Emacs accommodates them all, now, for windows.  It would be
good for it to do likewise for frames too.  That's the point.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25 17:16         ` Ralf Fassel
  2014-11-25 18:09           ` Drew Adams
@ 2014-11-25 22:02           ` Subhan Michael Tindall
  1 sibling, 0 replies; 838+ messages in thread
From: Subhan Michael Tindall @ 2014-11-25 22:02 UTC (permalink / raw)
  To: Ralf Fassel, help-gnu-emacs@gnu.org



> -----Original Message-----
> From: help-gnu-emacs-bounces+subhant=familycareinc.org@gnu.org
> [mailto:help-gnu-emacs-bounces+subhant=familycareinc.org@gnu.org] On
> Behalf Of Ralf Fassel
> Sent: Tuesday, November 25, 2014 9:16 AM
> To: help-gnu-emacs@gnu.org
> Subject: Re: When do you prefer frames instead of windows?
> 
> * Drew Adams <drew.adams@oracle.com>
> | If you leave your mouse in the Ediff Control Panel frame then focus
> | should stay there, and if you move it out of that frame, into another
> | frame, then focus should leave that frame.  That should be no
> | different from turning off focus-follows-mouse and clicking in a frame
> | to focus it.
> 
> Agreed, and that is exactly what happens.  No fault of emacs anywhere in
> sight.  Problem is completely located between chair and screen.
> 
> | Assuming that this worked (if it does not), what would the problem be
> | for Ediff, for your use?
> 
> During an Ediff Session, sometimes I have to leave the Control Panel to check
> something in a different window or buffer, or even on a different desktop.
> When I get back to Ediff: where is my Control Panel?  Yes, of course it is still
> where I left it, upper right corner of the screen, but obscured now by the
> terminal, firefox or any other odd window I happened to raise over it during
> my check-something-outside-of-ediff.
> And even if the Control Panel is still visible on the screen, the mouse is no
> longer inside that Control Panel.
> 
> In order to get my ediff session back, I have to accurately raise the control
> panel, raise emacs (I *think* they are connected somehow, so maybe this is
> not necessary), place mouse accurately inside (tiny) Control Panel, pay
> attention not to nudge it out of there etc etc.
> 
> Compare to single frame ediff: move mouse anywhere into (large) emacs
> window, press C-M-Up, press C-L, continue with ediff.[>] 

Compare with frames: C-x 5 o to cycle through the frames until you're back to the control panel(1-n times depending on how many other frames you have).  Works way better than trying to raise/lower/etc. 


> 
> And no, I will *not* enter a bug report for this, even if it were one ;-)
> 
> R'

This message is intended for the sole use of the individual and entity to which it is addressed and may contain information that is privileged, confidential and exempt from disclosure under applicable law. If you are not the intended addressee, nor authorized to receive for the intended addressee, you are hereby notified that you may not use, copy, disclose or distribute to anyone the message or any information contained in the message. If you have received this message in error, please immediately advise the sender by reply email and delete the message.  Thank you.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25 18:09           ` Drew Adams
@ 2014-11-25 22:08             ` Subhan Michael Tindall
  2014-11-25 22:22               ` Drew Adams
       [not found]             ` <mailman.14600.1416953316.1147.help-gnu-emacs@gnu.org>
  1 sibling, 1 reply; 838+ messages in thread
From: Subhan Michael Tindall @ 2014-11-25 22:08 UTC (permalink / raw)
  To: Drew Adams, Ralf Fassel, help-gnu-emacs@gnu.org



> -----Original Message-----
> From: help-gnu-emacs-bounces+subhant=familycareinc.org@gnu.org
> [mailto:help-gnu-emacs-bounces+subhant=familycareinc.org@gnu.org] On
> Behalf Of Drew Adams
> Sent: Tuesday, November 25, 2014 10:10 AM
> To: Ralf Fassel; help-gnu-emacs@gnu.org
> Subject: RE: When do you prefer frames instead of windows?
> 
[SNIP]
> 
> Yes, this is why Emacs should provide simple key sequences to raise and
> refocus frames.
Raise-frame and lower-frame can be easily bound to whatever keys you like. 
Other-frame is already bound by default to C-x 5 0
It can't get much easier than that.
There's a host of functions for frame management, try C-h a frame for many more
Hope this makes your world less frustrating,
Subhan


This message is intended for the sole use of the individual and entity to which it is addressed and may contain information that is privileged, confidential and exempt from disclosure under applicable law. If you are not the intended addressee, nor authorized to receive for the intended addressee, you are hereby notified that you may not use, copy, disclose or distribute to anyone the message or any information contained in the message. If you have received this message in error, please immediately advise the sender by reply email and delete the message.  Thank you.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25 22:08             ` Subhan Michael Tindall
@ 2014-11-25 22:22               ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-25 22:22 UTC (permalink / raw)
  To: Subhan Michael Tindall, Ralf Fassel, help-gnu-emacs

> > Yes, this is why Emacs should provide simple key sequences to
> > raise and refocus frames.
>
> Raise-frame and lower-frame can be easily bound to whatever keys
> you like.

Of course.

> Other-frame is already bound by default to C-x 5 0
> It can't get much easier than that.

Yes, it can.  If you have 30 frames then you don't want to cycle
through them to get to the frame you want.  Same problem with
windows and `C-x o', but there you are limited to the windows
in a single frame (by default), and it is less likely that you
will have 30 of them, or even 10.

Cycling through lots of candidates, even given the additional
(prefix-arg) possibility of specifying how many to go forward
or back, is a pretty rudimentary UI when there are many candidates.

It can definitely get easier than that.  One possibility is to
let you (i.e., optionally) choose a window/frame by name, with
completion.

> There's a host of functions for frame management, try C-h a
> frame for many more

Still not good enough, IMHO.  There is lots of room for
improving how Emacs plays with frames.

FWIW, this is what I bind to `C-x o':

,----
| C-x o runs the command icicle-other-window-or-frame, which is an
| interactive compiled Lisp function in `icicles-cmd1.el'.
| 
| It is bound to C-x o.
| 
| (icicle-other-window-or-frame ARG)
| 
| Select a window or frame, by name or by order.
| This command combines Emacs commands `other-window' and `other-frame',
| together with Icicles commands `icicle-select-window',
| `icicle-select-frame', and `icicle-choose-window-for-buffer-display'.
| Use the prefix argument to choose the behavior, as follows:
| 
|  With no prefix arg or a non-zero numeric prefix arg:
|   If the selected frame has multiple windows, then this is
|   `other-window'.  Otherwise, it is `other-frame'.
| 
|  With a zero prefix arg (e.g. `C-0'):
|   If the selected frame has multiple windows, then this is
|   `icicle-select-window' with windows in the frame as candidates.
|   Otherwise (single-window frame), this is `icicle-select-frame'.
| 
|  With plain `C-u':
|   If the selected frame has multiple windows, then this is
|   `icicle-select-window' with windows from all visible frames as
|   candidates.  Otherwise, this is `icicle-select-frame'.
| 
|  With plain `C-u C-u':
|   Same as `icicle-select-window' with a negative prefix arg: Select a
|   window from any frame, including iconified and invisible frames.
|   
|  With plain `C-u C-u C-u':
|   This is `icicle-choose-window-for-buffer-display', with windows from
|   all frames (i.e., iconified and invisible) frames as candidates. 
| 
| If you use library `oneonone.el' with a standalone minibuffer frame,
| and if option `1on1-remap-other-frame-command-flag' is non-nil, then
| frame selection can include the standalone minibuffer frame.
| 
| By default, Icicle mode remaps all key sequences that are normally
| bound to `other-window' to `icicle-other-window-or-frame'.  If you do
| not want this remapping, then customize option
| `icicle-top-level-key-bindings'.
`----



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
                   ` (7 preceding siblings ...)
  2014-11-25  9:27 ` Ralf Fassel
@ 2014-11-25 22:28 ` Bob Proulx
  2014-11-25 22:54   ` Drew Adams
  2014-11-26 16:37 ` Ken Goldman
  2014-11-27 21:02 ` Chris F.A. Johnson
  10 siblings, 1 reply; 838+ messages in thread
From: Bob Proulx @ 2014-11-25 22:28 UTC (permalink / raw)
  To: help-gnu-emacs

Raffaele Ricciardi wrote:
> The usefulness of frames is evident for buffers that update their content
> according to the current buffer (like Speedbar and ECB). Besides this kind
> of use, when do you prefer frames instead of windows?

I have seen a lot of commentary about frames.  One thing that has been
missing is the discussion of the window manager used to manage those
frames.  It really isn't possible to talk about emacs and frame
management without also involving the window manager.  "Ay, there's
the rub."  And that is as personal of a choice as the choice of
editor.  Focus follows mouse?  Click to focus?  Click to raise?
Autoraise?  Tiling?  Single or multiple screens?  The combination of
possibilities will create a large number of answers.  None of which is
canonically correct.  All are correct for that individual.

Personally I tend to use one frame for everything.  I sometimes use
additional frames but only rarely.

Bob



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-25 22:28 ` Bob Proulx
@ 2014-11-25 22:54   ` Drew Adams
  2014-11-26  8:12     ` Alan Schmitt
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2014-11-25 22:54 UTC (permalink / raw)
  To: Bob Proulx, help-gnu-emacs

> I have seen a lot of commentary about frames.  One thing that has
> been missing is the discussion of the window manager used to manage
> those frames.  It really isn't possible to talk about emacs and frame
> management without also involving the window manager.  "Ay, there's
> the rub."  And that is as personal of a choice as the choice of
> editor.  Focus follows mouse?  Click to focus?  Click to raise?
> Autoraise?  Tiling?  Single or multiple screens?  The combination of
> possibilities will create a large number of answers.  None of which
> is canonically correct.  All are correct for that individual.

Of course.  But Emacs does provide basic operations for manipulating
frames, and they work across platforms, and they already take into
account user choices (focus follows mouse etc.).

What is missing out of the box, IMO are:

* Better UI - commands and bindings, to do things that we
  currently do with windows.
* Better interaction between the rest of Emacs and frames.

The second one is harder to fix in one sense: doing so probably
will involve fixes across different platforms.

But the main obstacle, IMO, is that few people use frames a lot,
and with fewer users there is not the necessary consideration
of cross-functional behavior (e.g. how this or that feature
plays well with frames).  Emacs developers, like most Emacs users,
do not pay as much attention to the case of using frames instead
of windows.  Less attention when it comes to design and
implementation, and less attention when it comes to updates & bugs.

That's just the way it is, and it's normal: more attention
goes to what more people use more often.

> Personally I tend to use one frame for everything.  I sometimes use
> additional frames but only rarely.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer windows instead of frames? Was: When do you prefer frames instead of windows?
  2014-11-25 18:40       ` MBR
  2014-11-25 18:52         ` Drew Adams
@ 2014-11-26  2:31         ` Yuri Khan
  2014-12-19 16:08         ` Jude DaShiell
  2 siblings, 0 replies; 838+ messages in thread
From: Yuri Khan @ 2014-11-26  2:31 UTC (permalink / raw)
  To: MBR; +Cc: dieter, help-gnu-emacs@gnu.org

On Wed, Nov 26, 2014 at 12:40 AM, MBR <mbr@arlsoft.com> wrote:

> Be very careful with the phrase "use ... as easily as you can use ...".
[…]
> Yes, but typing C-x o is something I can do easily because it involves two
> fingers on the left hand immediately followed by one finger on the right
> hand, without fingers my ever having to leave home position.  C-x 5 o, on
> the other hand[…]

Here you presuppose existing Emacs bindings. Which, as already known,
do not satisfy the “as easily as” criterion.

On the other hand, consider the windmove and framemove packages.
windmove gives you easy bindings, by default Shift+arrows[1], that
switch to an adjacent window in the given direction. Then, framemove
hooks into that and when you don’t have an adjacent window in the
indicated direction, it switches to an adjacent frame in that
direction.

[1]: if you use cua-mode, it makes sense to rebind windmove to e.g. Alt+arrows.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-25 15:57     ` Ralf Fassel
  2014-11-25 16:57       ` Drew Adams
       [not found]       ` <mailman.14564.1416934703.1147.help-gnu-emacs@gnu.org>
@ 2014-11-26  5:02       ` Yuri Khan
  2 siblings, 0 replies; 838+ messages in thread
From: Yuri Khan @ 2014-11-26  5:02 UTC (permalink / raw)
  To: Ralf Fassel; +Cc: help-gnu-emacs@gnu.org

On Tue, Nov 25, 2014 at 9:57 PM, Ralf Fassel <ralfixx@gmx.de> wrote:

> I now have bound a key to get my ediff control panel back:
>     <C-M-up> runs the command (lambda nil (interactive) (let ((buf
>     (get-buffer "*Ediff Control Panel*"))) (if buf (pop-to-buffer buf)))),
>     which is an interactive Lisp function.
> and then C-l recenters everything (could even pack that in the
> keybinding, but...)

You might want to go further (I know I do!) and make bindings that (1)
temporarily switch to the ediff control panel, (2) perform an ediff
control panel command, (3) switch back to the buffer you were in — for
each command that you frequently use in ediff. (Personally I find
next-difference and previous-difference sufficient.)

Something like this:

(require 'cl)

(defun yk-global-ediff--find-session (buffer)
  "Return the control buffer of the first ediff session involving
BUFFER, or the control buffer of the first ediff session, or nil."
  (or (cl-find-if (lambda (control-buffer)
                    (with-current-buffer control-buffer
                      (memq buffer (list ediff-buffer-A ediff-buffer-B
ediff-buffer-C))))
                  ediff-session-registry)
      (car-safe ediff-session-registry)))

(defun yk-global-ediff-next-difference ()
  "Go to the next difference according to the ediff session involving
the current buffer, or if there is no such session, according to the
first ediff session."
  (interactive)
  (let ((session (yk-global-ediff--find-session (current-buffer))))
    (when session
      (save-window-excursion
        (with-current-buffer session
          (ediff-next-difference))))))

(defun yk-global-ediff-previous-difference ()
  "Go to the previous difference according to the ediff session
involving the current buffer, or if there is no such session, according
to the first ediff session."
  (interactive)
  (let ((session (yk-global-ediff--find-session (current-buffer))))
    (when session
      (save-window-excursion
        (with-current-buffer session
          (ediff-previous-difference))))))

(define-minor-mode yk-global-ediff-navigation-mode
  "Toggle global ediff navigation mode."
  :global t
  :lighter " E≜"
  :init-value nil
  :keymap `((,(kbd "M-n") . yk-global-ediff-next-difference)
            (,(kbd "M-p") . yk-global-ediff-previous-difference)))

(defun yk-global-ediff--cleanup ()
  (unless ediff-session-registry
    (yk-global-ediff-navigation-mode 0)))

(add-hook 'ediff-mode-hook 'yk-global-ediff-navigation-mode)
(add-hook 'ediff-cleanup-hook 'yk-global-ediff--cleanup)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-25 22:54   ` Drew Adams
@ 2014-11-26  8:12     ` Alan Schmitt
  2014-11-26 13:42       ` H. Dieter Wilhelm
  2014-11-28 13:51       ` Tom Davey
  0 siblings, 2 replies; 838+ messages in thread
From: Alan Schmitt @ 2014-11-26  8:12 UTC (permalink / raw)
  To: help-gnu-emacs

[-- Attachment #1: Type: text/plain, Size: 1069 bytes --]

On 2014-11-25 14:54, Drew Adams <drew.adams@oracle.com> writes:

> But the main obstacle, IMO, is that few people use frames a lot,
> and with fewer users there is not the necessary consideration
> of cross-functional behavior (e.g. how this or that feature
> plays well with frames).

The main reason why I don't use frames is because the window manager on
OS X lacks too many features (in particular regarding multiple desktops
and keyboard navigation). So I use a single emacs frame in full screen
mode, and workgroups2 to manage several groups of windows (this is quite
useful for modes that enjoy destroying carefully arranged windows, yes
gnus I'm looking at you).

I was using multiple (full screen) frames instead of workgroups at some
point, but I stopped because ERC notifications would not be aware of the
frame being visible or not, so I would get no notification at all. Also,
the possibility of restoring frames using desktop.el was not available
then (I think it's new in emacs 24.4).

Alan

-- 
OpenPGP Key ID : 040D0A3B4ED2E5C7

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 494 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
       [not found]             ` <mailman.14600.1416953316.1147.help-gnu-emacs@gnu.org>
@ 2014-11-26  9:34               ` Joost Kremers
  0 siblings, 0 replies; 838+ messages in thread
From: Joost Kremers @ 2014-11-26  9:34 UTC (permalink / raw)
  To: help-gnu-emacs

Subhan Michael Tindall wrote:
> Other-frame is already bound by default to C-x 5 0

`C-x 5 0` is bound to `delete-frame`. `other-frame` is bound to `C-x 5
o`. That's the letter `o`, not the number `0`. :-)


-- 
Joost Kremers                                   joostkremers@fastmail.fm
Selbst in die Unterwelt dringt durch Spalten Licht
EN:SiS(9)


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-26  8:12     ` Alan Schmitt
@ 2014-11-26 13:42       ` H. Dieter Wilhelm
  2014-11-28 13:51       ` Tom Davey
  1 sibling, 0 replies; 838+ messages in thread
From: H. Dieter Wilhelm @ 2014-11-26 13:42 UTC (permalink / raw)
  To: help-gnu-emacs

Alan Schmitt <alan.schmitt@polytechnique.org> writes:

> I was using multiple (full screen) frames instead of workgroups at some
> point, but I stopped because ERC notifications would not be aware of the
> frame being visible or not, so I would get no notification at all. Also,

Hello,

setting erc-track-visibility to 'selected-visible should do.

        Dieter
-- 
Best wishes
H. Dieter Wilhelm
Darmstadt, Germany



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
                   ` (8 preceding siblings ...)
  2014-11-25 22:28 ` Bob Proulx
@ 2014-11-26 16:37 ` Ken Goldman
  2014-11-27 21:02 ` Chris F.A. Johnson
  10 siblings, 0 replies; 838+ messages in thread
From: Ken Goldman @ 2014-11-26 16:37 UTC (permalink / raw)
  To: help-gnu-emacs

On 11/24/2014 11:40 AM, Raffaele Ricciardi wrote:
> The usefulness of frames is evident for buffers that update their
> content according to the current buffer (like Speedbar and ECB). Besides
> this kind of use, when do you prefer frames instead of windows?

I always have 10's of frames open when coding, so I can easily switch 
between them, while each is a full window.

I use windows a lot in conjunction with keyboard macros.  The macro will 
do something in one window, switch to the other window to do something 
else, then back.

E.g., converting a big case statement <-> macro #defines, making 
function prototypes from functions, any repetitive multi-file macro.






^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
                   ` (9 preceding siblings ...)
  2014-11-26 16:37 ` Ken Goldman
@ 2014-11-27 21:02 ` Chris F.A. Johnson
  10 siblings, 0 replies; 838+ messages in thread
From: Chris F.A. Johnson @ 2014-11-27 21:02 UTC (permalink / raw)
  To: help-gnu-emacs

On Mon, 24 Nov 2014, Raffaele Ricciardi wrote:

> The usefulness of frames is evident for buffers that update their content 
> according to the current buffer (like Speedbar and ECB). Besides this kind of 
> use, when do you prefer frames instead of windows?

    I use a new frame only when I want it on a different workspace.

    I use a second (or, occasionally, a third) window when I need to
    refer to one buffer while working in another (e.g.
    http://t.cfaj.ca/emacs-cv.jpg).

    Other than that, I use multiple buffers, often having as many as
    50 open at once.

-- 
Chris F.A. Johnson, <http://cfajohnson.com>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer frames instead of windows?
  2014-11-26  8:12     ` Alan Schmitt
  2014-11-26 13:42       ` H. Dieter Wilhelm
@ 2014-11-28 13:51       ` Tom Davey
  2014-11-28 15:39         ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Tom Davey @ 2014-11-28 13:51 UTC (permalink / raw)
  To: help-gnu-emacs

Alan Schmitt writes:

> So I use a single emacs frame in full screen
> mode, and workgroups2 to manage several groups of windows

This. Workgroups is an outstanding extension. It seems to me that, for all
the presumed uses of frames for managing multiple groups of windows,
workgroups can do it better, providing out of the box most of what this
thread is seeking from frames.

On Wed, Nov 26, 2014 at 3:12 AM, Alan Schmitt <
alan.schmitt@polytechnique.org> wrote:

> On 2014-11-25 14:54, Drew Adams <drew.adams@oracle.com> writes:
>
> > But the main obstacle, IMO, is that few people use frames a lot,
> > and with fewer users there is not the necessary consideration
> > of cross-functional behavior (e.g. how this or that feature
> > plays well with frames).
>
> The main reason why I don't use frames is because the window manager on
> OS X lacks too many features (in particular regarding multiple desktops
> and keyboard navigation). So I use a single emacs frame in full screen
> mode, and workgroups2 to manage several groups of windows (this is quite
> useful for modes that enjoy destroying carefully arranged windows, yes
> gnus I'm looking at you).
>
> I was using multiple (full screen) frames instead of workgroups at some
> point, but I stopped because ERC notifications would not be aware of the
> frame being visible or not, so I would get no notification at all. Also,
> the possibility of restoring frames using desktop.el was not available
> then (I think it's new in emacs 24.4).
>
> Alan
>
> --
> OpenPGP Key ID : 040D0A3B4ED2E5C7
>



-- 
--
Tom Davey
tom@tomdavey.com
New York NY USA


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: When do you prefer frames instead of windows?
  2014-11-28 13:51       ` Tom Davey
@ 2014-11-28 15:39         ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2014-11-28 15:39 UTC (permalink / raw)
  To: Tom Davey, help-gnu-emacs

> > So I use a single emacs frame in full screen
> > mode, and workgroups2 to manage several groups of windows
> 
> This. Workgroups is an outstanding extension. It seems to me that,
> for all the presumed uses of frames for managing multiple groups
> of windows, workgroups can do it better, 

OK, that's one point.

> providing out of the box most of what this thread is seeking
> from frames.

But that's a different point.

I'm not familiar with workgroups2, but "managing multiple groups
of [Emacs] windows" is not "most of what this thread is seeking
from frames."

IOW, so far, it sounds like workgroups2 might be an argument
*not* to use Emacs windows instead of frames.  But so far, it
does not sound like an argument for using workgroups2 (or
using Emacs windows) instead of frames.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: When do you prefer windows instead of frames? Was: When do you prefer frames instead of windows?
  2014-11-25 18:40       ` MBR
  2014-11-25 18:52         ` Drew Adams
  2014-11-26  2:31         ` Yuri Khan
@ 2014-12-19 16:08         ` Jude DaShiell
  2 siblings, 0 replies; 838+ messages in thread
From: Jude DaShiell @ 2014-12-19 16:08 UTC (permalink / raw)
  To: MBR; +Cc: dieter, help-gnu-emacs

For those of you who find keyboards easier than mice to use have you 
ever tried using a track bal and if so how do you grade that in 
comparison to use of the mouse?

On Tue, 25 Nov 2014, MBR wrote:

> Be very careful with the phrase "use ... as easily as you can use ...".  There
> are some people out there who consider pointing with the mouse easy.  I, on
> the other hand find it easier to use the keyboard.  The keyboard, along with
> Emacs' wide array of cursor positioning commands, gives me the ability to
> quickly and easily get to specific precise positions - at least precise based
> on character position in a character cell terminal or editor window.
> 
> There are probably other areas where different Emacs users would have
> diametrically opposite views on what they consider to be easy.
> 
>    Mark Rosenthal
> 
> On 11/25/14 10:46 AM, Drew Adams wrote:
> > > > I would ask an opposite question: IF you could use Emacs frames
> > > > as easily as you can use Emacs windows, in what scenarios would
> > > > you prefer using Emacs windows, and why?
> > > For supporting tasks only: Imagine you are starting from a full-screen
> > > window and want to see temporarily a variable definition in a second
> > > window while still hacking away.  The advantage is that window
> > > operations, like C-x } enlarge-window-horizontally,
> > > delete-other-windows-vertically,... operate simultaneously on all
> > > windows.  In such situations it seems to me much more convenient to
> > > use windows than set it up with frames.
> > Again - but what "IF you could use Emacs frames as easily as you
> > can use Emacs windows"?  That's the question.
> >
> > Pop up a *Help* frame instead of a *Help* window to show help.  Hit
> > `C-x 0' to get rid of that frame when you're done.  You probably do
> > not need to resize the frame (e.g., if the frame is automatically
> > fit to the size of just the *Help* text).  But if you do, then use
> > keys to resize it, just as you would for a window.
> Yes, but typing C-x o is something I can do easily because it involves two
> fingers on the left hand immediately followed by one finger on the right hand,
> without fingers my ever having to leave home position.  C-x 5 o, on the other
> hand involves my typing two successive characters with my left hand before I
> can switch to the right hand for the "o".  And, worse than that, "x" is in the
> bottom row but "5" is in the top row, which means that even though my fingers'
> average position is over home position, they're jumping Saturday as far as
> they ever do on vertically.
> 
> All this means that my mental focus on the code I'm writing doesn't get
> distracted when I type C-x 0, but when I type C-x 5 o, I have to take some of
> my focus away from the code to make sure I don't miss the "5" after the "x".
> >
> > IOW, think past what you can do with a window (resize, move, control
> > where it pops up, etc.) that you think you cannot easily do with a
> > frame now.
> >
> > I certainly agree that if frames are not made as convenient to
> > interact with (i.e., the same kinds of operations you use on
> > windows) then Emacs windows remain useful.  But if Emacs *did*
> > support such operations with frames, out of the box,...
> >
> >
> 
> 

jude <jdashiel@shellworld.net>
Twitter: @jdashiel




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
       [not found] <mailman.16504.1419019164.1147.help-gnu-emacs@gnu.org>
@ 2014-12-29  4:21 ` Emanuel Berg
  2014-12-29 11:24   ` Marcin Borkowski
                     ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Emanuel Berg @ 2014-12-29  4:21 UTC (permalink / raw)
  To: help-gnu-emacs

Tom <adatgyujto@gmail.com> writes:

> The other day it occurred to me I could use simple
> abbrevs for elisp programming, but defining these
> manually is tiresome, so I did some automation ...
> The idea is trivial ...

Not exactly trivial I would say, and certainly not the
implementation.

> so I collected the usage statistics of all elisp
> symbols from the emacs lisp sources

Cool: most likely there isn't a better example for how
to properly use Elisp for real software, than Emacs
and the associated software and libraries.

But even so, what if some guy is the other way around,
e.g., he prefers `garbage-collect' to `goto-char'? Is
that easily rerouted in some automatically generated
(but after that manually editable) abbrev table?

> so probably somebody has done something like this
> already

Yes: I've seen something similar but I think that was
the typing of commands after M-x, and not the whole
Elisp language when typing it in a buffer.

Personally, though I think this an interesting/cool
project, I don't have a problem typing (on the
contrary, I like it very much) and I am actually very
fond of the Elisp verbose style (compare the C style
with very short names, with "undelimited"
abbreviations and often digits and such in between and
all over) - I mean, I like C, and when I do C I do
that as well, but when I do Elisp, I really enjoy
those long this-is-a-function-that-does-something - it
isn't too slow to type as long as it is normal words
and normal chars, not
asymmetric-asynchronous-continuous-anonymous or
anything.

My second concern is that if this is abbrevs, don't
you get crazy from them expanding all the time as you
type?

But anyway, thumbs up for activity and zeal!

-- 
underground experts united


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2014-12-29  4:21 ` Abbrevs for the most frequent elisp symbols Emanuel Berg
@ 2014-12-29 11:24   ` Marcin Borkowski
  2014-12-29 13:09     ` Robert Thorpe
  2014-12-29 13:26     ` Stefan Monnier
  2014-12-29 15:49   ` Tom
       [not found]   ` <mailman.16844.1419852282.1147.help-gnu-emacs@gnu.org>
  2 siblings, 2 replies; 838+ messages in thread
From: Marcin Borkowski @ 2014-12-29 11:24 UTC (permalink / raw)
  To: help-gnu-emacs


On 2014-12-29, at 05:21, Emanuel Berg <embe8573@student.uu.se> wrote:

> Tom <adatgyujto@gmail.com> writes:
>
>> The other day it occurred to me I could use simple
>> abbrevs for elisp programming, but defining these
>> manually is tiresome, so I did some automation ...
>> The idea is trivial ...
>
> Not exactly trivial I would say, and certainly not the
> implementation.
>
>> so I collected the usage statistics of all elisp
>> symbols from the emacs lisp sources
>
> Cool: most likely there isn't a better example for how
> to properly use Elisp for real software, than Emacs
> and the associated software and libraries.

False assumption: that Emacs libraries contain good practices only.  I
know you dislike Emacs.SE, but there was a question there about good
Elisp code to read (to learn Elisp), and someone warned about reading
Emacs code (especially older libraries).  Recently, I grepped the Emacs
Lisp sources for occurences of `mapcar', and there is *no* consistency
in e.g. using ' versus #', or quoted lambdas (which I hear are a no-no
unless in special circumstances, like macros).

> But even so, what if some guy is the other way around,
> e.g., he prefers `garbage-collect' to `goto-char'? Is
> that easily rerouted in some automatically generated
> (but after that manually editable) abbrev table?
>
>> so probably somebody has done something like this
>> already
>
> Yes: I've seen something similar but I think that was
> the typing of commands after M-x, and not the whole
> Elisp language when typing it in a buffer.

BTW: what's wrong with Yasnippet?

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2014-12-29 11:24   ` Marcin Borkowski
@ 2014-12-29 13:09     ` Robert Thorpe
  2014-12-29 15:28       ` Drew Adams
  2014-12-29 13:26     ` Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2014-12-29 13:09 UTC (permalink / raw)
  To: help-gnu-emacs; +Cc: Tom, Emanuel Berg, Marcin Borkowski

There are the dynamic abbrevs facilities, M-\ and C-M-\.  They search
through the open buffers looking for completion candidates.  They're
included by default in hippie-expand's completers.  Personally, I prefer
that style of completion to abbrev.

You could use a similar strategy with normal abbrev though.  Load up a
set of Elisp files that are typical of your personal usage.  You could
then use the code in dabbrev-expand or dabbrev-completion to find the
completions you want.  You could wrap that in a bit of Elisp and run it
once to generate a table, then decide on the abbrevs manually or by
taking a prefix.

Martin mentions that the Emacs sources themselves contain some code
that's frowned upon these days.  That's true, there are many old parts
of Emacs.  The parts that are new are a good guide though.  There are
some peculiarities even there though, Emacs code doesn't use certain
features to avoid loading them when Emacs starts, easymenu for example.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2014-12-29 11:24   ` Marcin Borkowski
  2014-12-29 13:09     ` Robert Thorpe
@ 2014-12-29 13:26     ` Stefan Monnier
  2014-12-29 13:40       ` Marcin Borkowski
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2014-12-29 13:26 UTC (permalink / raw)
  To: help-gnu-emacs

> Elisp code to read (to learn Elisp), and someone warned about reading
> Emacs code (especially older libraries).

That's one person's opinion.

> Recently, I grepped the Emacs Lisp sources for occurences of `mapcar',
> and there is *no* consistency in e.g. using ' versus #',

Indeed.  But to a large extend, for quoted function names, the
difference between the two is a question of taste.  IOW there are
usually much bigger elephants to deal with before it's worth worrying
about such details.

> or quoted lambdas (which I hear are a no-no unless in special
> circumstances, like macros).

AFAIK there have been no quoted lambdas left in Emacs's own code for
quite a few years now.  There are still some backquoted lambdas which
should be converted to closures, admittedly (usually it's either
because converting those packages to lexical-binding is a bit more
tricky than usual, so it hasn't been done yet, or it's because the
conversion can't be done because the package is also distributed
outside Emacs and needs to work on Emacs<24).

>> Yes: I've seen something similar but I think that was
>> the typing of commands after M-x, and not the whole
>> Elisp language when typing it in a buffer.

That also works in Elisp buffers, actually: type "(g-c" and then M-TAB
and you'll be offered completion on all the
g<something>-c<something> functions.  It's not really the same as the
OP's abbrevs, tho, because there are *many* functions matching "(g-c".


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2014-12-29 13:26     ` Stefan Monnier
@ 2014-12-29 13:40       ` Marcin Borkowski
  2014-12-29 14:57         ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2014-12-29 13:40 UTC (permalink / raw)
  To: help-gnu-emacs


On 2014-12-29, at 14:26, Stefan Monnier <monnier@iro.umontreal.ca> wrote:

>> Elisp code to read (to learn Elisp), and someone warned about reading
>> Emacs code (especially older libraries).
>
> That's one person's opinion.

No offence meant; Emacs is older than many people on this list
(including me), both the language and the libraries did evolve quite a
bit, and then there is the problem of manpower - no surprise some code
in Emacs is rather dated.

>> Recently, I grepped the Emacs Lisp sources for occurences of `mapcar',
>> and there is *no* consistency in e.g. using ' versus #',
>
> Indeed.  But to a large extend, for quoted function names, the
> difference between the two is a question of taste.  IOW there are
> usually much bigger elephants to deal with before it's worth worrying
> about such details.

Maybe - I just wrote about something I noticed, I don't read Emacs
sources on a daily basis (and I'm not competent enough in Elisp to
notice many things).

>> or quoted lambdas (which I hear are a no-no unless in special
>> circumstances, like macros).
>
> AFAIK there have been no quoted lambdas left in Emacs's own code for
> quite a few years now.  There are still some backquoted lambdas which
> should be converted to closures, admittedly (usually it's either
> because converting those packages to lexical-binding is a bit more
> tricky than usual, so it hasn't been done yet, or it's because the
> conversion can't be done because the package is also distributed
> outside Emacs and needs to work on Emacs<24).

I have Emacs 24.3, maybe that's the reason.

>         Stefan

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2014-12-29 13:40       ` Marcin Borkowski
@ 2014-12-29 14:57         ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2014-12-29 14:57 UTC (permalink / raw)
  To: help-gnu-emacs

>> AFAIK there have been no quoted lambdas left in Emacs's own code for
>> quite a few years now.  There are still some backquoted lambdas which
>> should be converted to closures, admittedly (usually it's either
>> because converting those packages to lexical-binding is a bit more
>> tricky than usual, so it hasn't been done yet, or it's because the
>> conversion can't be done because the package is also distributed
>> outside Emacs and needs to work on Emacs<24).
> I have Emacs 24.3, maybe that's the reason.

No: "quite a few years" here means something like since before
Emacs-24.1, IIRC.  If you see a quoted lambda in Emacs's code, report it
as a bug.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Abbrevs for the most frequent elisp symbols
  2014-12-29 13:09     ` Robert Thorpe
@ 2014-12-29 15:28       ` Drew Adams
  2014-12-29 16:28         ` Robert Thorpe
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2014-12-29 15:28 UTC (permalink / raw)
  To: Robert Thorpe, help-gnu-emacs; +Cc: Emanuel Berg, Tom, Marcin Borkowski

> There are the dynamic abbrevs facilities, M-\ and C-M-\.  

And the little-known but there-forever and useful `dynamic-completion-mode,
from built-in library `completions.el'.  (The file Commentary is the doc.)
The keys for it are, by default, `C-RET' and `M-RET'.

> They search through the open buffers looking for completion candidates.
> They're included by default in hippie-expand's completers.  Personally,
> I prefer that style of completion to abbrev.

The use is different, but yes, very useful.

> You could use a similar strategy with normal abbrev though.  Load up
> a set of Elisp files that are typical of your personal usage.  You
> could then use the code in dabbrev-expand or dabbrev-completion to find
> the completions you want.  You could wrap that in a bit of Elisp and run
> it once to generate a table, then decide on the abbrevs manually or by
> taking a prefix.

Yes.

> Martin mentions that the Emacs sources themselves contain some code
> that's frowned upon these days.  That's true, there are many old
> parts of Emacs.  The parts that are new are a good guide though.  There
> are some peculiarities even there though, Emacs code doesn't use certain
> features to avoid loading them when Emacs starts, easymenu for
> example.

+1.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2014-12-29  4:21 ` Abbrevs for the most frequent elisp symbols Emanuel Berg
  2014-12-29 11:24   ` Marcin Borkowski
@ 2014-12-29 15:49   ` Tom
       [not found]   ` <mailman.16844.1419852282.1147.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 838+ messages in thread
From: Tom @ 2014-12-29 15:49 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <embe8573 <at> student.uu.se> writes:
> 
> Tom <adatgyujto <at> gmail.com> writes:
> 
> But even so, what if some guy is the other way around,
> e.g., he prefers `garbage-collect' to `goto-char'? Is
> that easily rerouted in some automatically generated
> (but after that manually editable) abbrev table?

Something like this could be added, but I don't see
the reason, because I think the elisp sources are
fairly representative of the usage frequency of symbols.

I'm pretty sure most people use goto-char more often
than garbage-collect.

The aim was to provide a very convenient way to type
the most frequent symbols. For the less frequent one
you always have some kind of completion.

I was tired of typing save-exursion, etc. all the time
and while I use completion (company) for elisp symbols
it's still cumbersome to type for the most frequent
symbols while typing simply 'se' is very convenient.

> My second concern is that if this is abbrevs, don't
> you get crazy from them expanding all the time as you
> type?

There was one problematic abbrev I found when I tried
it 'if' which mapped to some lesser used function, don't
remember which, so I deleted it manually.

Otherwise, the abbrevs are surprisingly unique and 
didn't interfere with normal typing, though I haven't
tested it extensively.







^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2014-12-29 15:28       ` Drew Adams
@ 2014-12-29 16:28         ` Robert Thorpe
  0 siblings, 0 replies; 838+ messages in thread
From: Robert Thorpe @ 2014-12-29 16:28 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs, embe8573, adatgyujto, mbork

Drew Adams <drew.adams@oracle.com> writes:

>> There are the dynamic abbrevs facilities, M-\ and C-M-\.  
>
> And the little-known but there-forever and useful `dynamic-completion-mode,
> from built-in library `completions.el'.  (The file Commentary is the doc.)
> The keys for it are, by default, `C-RET' and `M-RET'.

Thanks.  I didn't know about that, I'll give it a try.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
       [not found]   ` <mailman.16844.1419852282.1147.help-gnu-emacs@gnu.org>
@ 2015-01-03  2:25     ` Emanuel Berg
  2015-01-04  0:19       ` Artur Malabarba
       [not found]       ` <mailman.17204.1420330787.1147.help-gnu-emacs@gnu.org>
  2015-01-03  2:31     ` Emanuel Berg
  1 sibling, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2015-01-03  2:25 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski <mbork@wmi.amu.edu.pl> writes:

> False assumption: that Emacs libraries contain good
> practices only. I know you dislike Emacs.SE

No, not really. I supported it from day one (verbally,
I mean). When they do a message-mode/Gnus-like
interface, I might even use it! But only once or twice
for my favorite questions so they perhaps reach a
wider audience... I can't say I like it but I don't
dislike it.

> but there was a question there about good Elisp code
> to read (to learn Elisp), and someone warned about
> reading Emacs code (especially older libraries).

That reading Emacs code in any way should be harmful
of course I don't believe in. I always emphasize
activity rather than consumption but if there is room
for any consumption reading Emacs code is a good
choice for any programmer, no doubt.

> Recently, I grepped the Emacs Lisp sources for
> occurences of `mapcar', and there is *no*
> consistency in e.g. using ' versus #', or quoted
> lambdas (which I hear are a no-no unless in special
> circumstances, like macros).

Yeah, I have no illusions that it is consistent or
perfect in the abstract sense. Of course it isn't as
so many people worked on it. Still, the definition of
good software is what it can do, or, what it enables
you to do. You can't beat that. It is good.

-- 
underground experts united


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
       [not found]   ` <mailman.16844.1419852282.1147.help-gnu-emacs@gnu.org>
  2015-01-03  2:25     ` Emanuel Berg
@ 2015-01-03  2:31     ` Emanuel Berg
  1 sibling, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2015-01-03  2:31 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski <mbork@wmi.amu.edu.pl> writes:

> BTW: what's wrong with Yasnippet?

What's wrong with typing? All those expanders are like
ants in a colony. I want it to be a bare mountain and
a clear horizon. I don't want to type less. If you do
it 18 hours a day I can see the point: it could save
your fingers from disintegrating. But I don't do it
all day long so when I do it I think typing is
superior to all those schemes. But the OP is of course
not me: he wants it and he did it, the same goes for
Yasnippet, whoever wrote that, so CRED to them.

-- 
underground experts united


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2015-01-03  2:25     ` Emanuel Berg
@ 2015-01-04  0:19       ` Artur Malabarba
       [not found]       ` <mailman.17204.1420330787.1147.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Artur Malabarba @ 2015-01-04  0:19 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs

> No, not really. I supported it from day one (verbally,
> I mean). When they do a message-mode/Gnus-like
> interface, I might even use it!

You might like sx.el.
I don't know if I'd call it gnus-like, but it's pretty good.


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
       [not found]       ` <mailman.17204.1420330787.1147.help-gnu-emacs@gnu.org>
@ 2015-01-05 21:16         ` Emanuel Berg
  2015-01-08 20:53           ` Artur Malabarba
  0 siblings, 1 reply; 838+ messages in thread
From: Emanuel Berg @ 2015-01-05 21:16 UTC (permalink / raw)
  To: help-gnu-emacs

Artur Malabarba <arturmalabarba@gmail.com> writes:

>> No, not really. I supported it from day one
>> (verbally, I mean). When they do a
>> message-mode/Gnus-like interface, I might even use
>> it!
>
> You might like sx.el. I don't know if I'd call it
> gnus-like, but it's pretty good.

Yes, I found it in melpa ("sx", version
20150105.1006), but it requires "let-alist-1.0.3"
which "is an orphan package" - what does that mean? no
parents as in dependencies up the ladder? - but worse,
the package itself seems to be missing. Here is what
Help says:

    Status: Orphan.
    Archive: n/a
    Summary:

And I can't find it, either.

Anyway, I would really push for sx and other attempts
to access/use the SX sites from Emacs, be included in
Emacs when they reach maturity, if they didn't
already...

Ha! melpa sure is fun. How about this:

    sunny-day-theme ... Emacs24 theme with a light background.

:)

-- 
underground experts united


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Abbrevs for the most frequent elisp symbols
  2015-01-05 21:16         ` Emanuel Berg
@ 2015-01-08 20:53           ` Artur Malabarba
  0 siblings, 0 replies; 838+ messages in thread
From: Artur Malabarba @ 2015-01-08 20:53 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs

> Yes, I found it in melpa ("sx", version
> 20150105.1006), but it requires "let-alist-1.0.3"
> which "is an orphan package" - what does that mean? no
> parents as in dependencies up the ladder? - but worse,
> the package itself seems to be missing.

It's on GNU Elpa, do you not have it configured by any chance?


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Info: how to get back from a footnote
@ 2015-01-14 22:12 Marcin Borkowski
  2015-01-15  2:42 ` Robert Thorpe
  0 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2015-01-14 22:12 UTC (permalink / raw)
  To: Help Gnu Emacs mailing list

Hi, it's me again!

Oftentimes I read something in Info and follow a link to a footnote
(within the same node).

How? To? Come? Back? to the footnote reference?  C-x SPC didn't help...

TIA

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Info: how to get back from a footnote
  2015-01-14 22:12 Info: how to get back from a footnote Marcin Borkowski
@ 2015-01-15  2:42 ` Robert Thorpe
  2015-01-15  3:11   ` Drew Adams
  2015-01-15  5:51   ` Marcin Borkowski
  0 siblings, 2 replies; 838+ messages in thread
From: Robert Thorpe @ 2015-01-15  2:42 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs

Marcin Borkowski <mbork@wmi.amu.edu.pl> writes:
> Oftentimes I read something in Info and follow a link to a footnote
> (within the same node).
>
> How? To? Come? Back? to the footnote reference?  C-x SPC didn't help...

How do you do that?  I've never been able to find a command to follow
footnotes.  Do you mean things like "(1)"?  Is this a function of something like Info+ or Icicles?

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Info: how to get back from a footnote
  2015-01-15  2:42 ` Robert Thorpe
@ 2015-01-15  3:11   ` Drew Adams
  2015-01-15  5:51   ` Marcin Borkowski
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2015-01-15  3:11 UTC (permalink / raw)
  To: Robert Thorpe, Marcin Borkowski; +Cc: help-gnu-emacs

> Is this a function of something like Info+ or Icicles?

Nope.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Info: how to get back from a footnote
  2015-01-15  2:42 ` Robert Thorpe
  2015-01-15  3:11   ` Drew Adams
@ 2015-01-15  5:51   ` Marcin Borkowski
  2015-01-16  2:38     ` Robert Thorpe
  1 sibling, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2015-01-15  5:51 UTC (permalink / raw)
  To: help-gnu-emacs


On 2015-01-15, at 03:42, Robert Thorpe <rt@robertthorpeconsulting.com> wrote:

> Marcin Borkowski <mbork@wmi.amu.edu.pl> writes:
>> Oftentimes I read something in Info and follow a link to a footnote
>> (within the same node).
>>
>> How? To? Come? Back? to the footnote reference?  C-x SPC didn't help...

Stupid me.  Pressing RET on the link to the footnote jumps there,
pressing RET again (on the footnote number next to its text) gets me
back.

> How do you do that?  I've never been able to find a command to follow
> footnotes.  Do you mean things like "(1)"?  Is this a function of something like Info+ or Icicles?

No idea.  It Just Works (in GNU Emacs 25.0.50.1).

> BR,
> Robert Thorpe

Regards,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Info: how to get back from a footnote
  2015-01-15  5:51   ` Marcin Borkowski
@ 2015-01-16  2:38     ` Robert Thorpe
  0 siblings, 0 replies; 838+ messages in thread
From: Robert Thorpe @ 2015-01-16  2:38 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs

Marcin Borkowski <mbork@wmi.amu.edu.pl> writes:

>> How do you do that?  I've never been able to find a command to follow
>> footnotes.  Do you mean things like "(1)"?  Is this a function of something like Info+ or Icicles?
>
> No idea.  It Just Works (in GNU Emacs 25.0.50.1).

I was looking at Emacs 24.3, it's a new feature in Emacs 24.4.  And very
useful too.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Opening a bookmark in the init file
@ 2015-03-03  0:47 Robert Thorpe
  2015-03-03  0:56 ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2015-03-03  0:47 UTC (permalink / raw)
  To: help-gnu-emacs

For years I've setup Emacs so it presents me with my ToDo list at
startup.  It doesn't put me in the right place in the file though.  I
can bookmark the place in the file, but using bookmark-jump in the init
file doesn't work and it doesn't work in emacs-startup-hook either.

I know I can use desktop.el to save and restore everything.  I don't
want all the other buffers saved and restored though.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Opening a bookmark in the init file
  2015-03-03  0:47 Opening a bookmark in the init file Robert Thorpe
@ 2015-03-03  0:56 ` Drew Adams
  2015-03-03  2:32   ` Robert Thorpe
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2015-03-03  0:56 UTC (permalink / raw)
  To: Robert Thorpe, help-gnu-emacs

> For years I've setup Emacs so it presents me with my ToDo list at
> startup.  It doesn't put me in the right place in the file though.  I
> can bookmark the place in the file, but using bookmark-jump in the init
> file doesn't work and it doesn't work in emacs-startup-hook either.

Why doesn't it work in your init file? Of course you will need to
load your bookmarks file before trying to jump to the bookmark.

But doing that and jumping to a bookmark is just invoking Lisp
functions.  Nothing special - you can invoke pretty much any
Lisp functions you like from your init file.

I suggest that you specify in detail what you have tried, and
perhaps people here will be able to help.  If you do that, keep
it simple - an init file that does only what you are trying to
do in this regard.

Start by just trying to jump to a simple bookmark from your init
file - not a special bookmark (just a static file position),
not involving any other code, whether Org to-do stuff or anything
else, and with a bookmarks file that contains very little - maybe
only that bookmark.  And start from `emacs -Q`, of course.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Opening a bookmark in the init file
  2015-03-03  0:56 ` Drew Adams
@ 2015-03-03  2:32   ` Robert Thorpe
  2015-03-08 19:18     ` Robert Thorpe
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2015-03-03  2:32 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

>> For years I've setup Emacs so it presents me with my ToDo list at
>> startup.  It doesn't put me in the right place in the file though.  I
>> can bookmark the place in the file, but using bookmark-jump in the init
>> file doesn't work and it doesn't work in emacs-startup-hook either.
>
> Why doesn't it work in your init file? Of course you will need to
> load your bookmarks file before trying to jump to the bookmark.

That was the problem.  When I loaded the file with (bookmark-load
"~/.emacs.bmk") it worked.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Opening a bookmark in the init file
  2015-03-03  2:32   ` Robert Thorpe
@ 2015-03-08 19:18     ` Robert Thorpe
  2015-03-08 21:24       ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2015-03-08 19:18 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs

Robert Thorpe <rt@robertthorpeconsulting.com> writes:

> Drew Adams <drew.adams@oracle.com> writes:
>
>>> For years I've setup Emacs so it presents me with my ToDo list at
>>> startup.  It doesn't put me in the right place in the file though.  I
>>> can bookmark the place in the file, but using bookmark-jump in the init
>>> file doesn't work and it doesn't work in emacs-startup-hook either.
>>
>> Why doesn't it work in your init file? Of course you will need to
>> load your bookmarks file before trying to jump to the bookmark.
>
> That was the problem.  When I loaded the file with (bookmark-load
> "~/.emacs.bmk") it worked.

This fix only worked for a while.  In my .emacs file I put:

(bookmark-load "~/.emacs.bmk")
(add-hook 'emacs-startup-hook '(lambda () (bookmark-jump "TODO")))

It worked for a few days but I noticed Emacs was becoming slow to
startup.  Today I had to restart Emacs a few times.  The last time it
took several minutes to starts.  The bookmark file was the culprit.  For
some reason every entry had been duplicated with the text <2> in front
of it.  Then it had been duplicated again with the text <3> in front of
that, and so one.  This caused by bookmark file to double in size on
every restart until it was ~50MB long.  I found that the two lines above
are the cause.  If you add a bookmark-jump to emacs-startup-hook then
something goes wrong somewhere.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Opening a bookmark in the init file
  2015-03-08 19:18     ` Robert Thorpe
@ 2015-03-08 21:24       ` Drew Adams
  2015-03-08 21:48         ` Robert Thorpe
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2015-03-08 21:24 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs

> In my .emacs file I put:
> (bookmark-load "~/.emacs.bmk")
> (add-hook 'emacs-startup-hook '(lambda () (bookmark-jump "TODO")))
> 
> It worked for a few days but I noticed Emacs was becoming slow to
> startup.  Today I had to restart Emacs a few times.  The last time it
> took several minutes to starts.  The bookmark file was the culprit.  For
> some reason every entry had been duplicated with the text <2> in front
> of it.  Then it had been duplicated again with the text <3> in front of
> that, and so one.  This caused by bookmark file to double in size on
> every restart until it was ~50MB long.  I found that the two lines above
> are the cause.  If you add a bookmark-jump to emacs-startup-hook then
> something goes wrong somewhere.

For some reason, you chose to call function `bookmark-load'.
If you do that it behooves you to check its doc first ;-):

,----
| bookmark-load is an interactive autoloaded Lisp function in
| `bookmark.el'.
| 
| It is bound to <menu-bar> <edit> <bookmark> <load>.
| 
| (bookmark-load FILE &optional OVERWRITE NO-MSG)
| 
| Load bookmarks from FILE (which must be in bookmark format).
| Appends loaded bookmarks to the front of the list of bookmarks.  If
| optional second argument OVERWRITE is non-nil, existing bookmarks are
| destroyed.  Optional third arg NO-MSG means don't display any messages
| while loading.
| 
| If you load a file that doesn't contain a proper bookmark alist, you
| will corrupt Emacs's bookmark list.  Generally, you should only load
| in files that were created with the bookmark functions in the first
| place.  Your own personal bookmark file, `~/.emacs.bmk', is
| maintained automatically by Emacs; you shouldn't need to load it
| explicitly.
| 
| If you load a file containing bookmarks with the same names as
| bookmarks already present in your Emacs, the new bookmarks will get
| unique numeric suffixes "<2>", "<3>", etc.
`----

See the last paragraph.  You are loading your bookmark file more
than once.  Most likely you are doing an explicit `bookmark-load'
when your bookmark file has already been loaded.  Don't do that. ;-)

You can use function `bookmark-maybe-load-default-file'
instead of `bookmark-load'.  (There is also variable
`bookmarks-already-loaded', but you should not need to check it.)

But before bothering to fiddle with such things, check what you
are really doing, to see how/why/where else you are loading your
bookmark file, and perhaps simplify your code accordingly.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Opening a bookmark in the init file
  2015-03-08 21:24       ` Drew Adams
@ 2015-03-08 21:48         ` Robert Thorpe
  2015-03-08 22:52           ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2015-03-08 21:48 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

> For some reason, you chose to call function `bookmark-load'.
> If you do that it behooves you to check its doc first ;-):

Good point.

> You can use function `bookmark-maybe-load-default-file'
> instead of `bookmark-load'.  (There is also variable
> `bookmarks-already-loaded', but you should not need to check it.)

Using that works without any problems.  Thanks.

> But before bothering to fiddle with such things, check what you
> are really doing, to see how/why/where else you are loading your
> bookmark file, and perhaps simplify your code accordingly.

I'm loading the bookmark file because it doesn't work otherwise.  If I
just do:

(add-hook 'emacs-startup-hook '(lambda () (bookmark-jump "TODO")))

Then Emacs gives an error "Invalid Bookmark TODO".  It seems that the
bookmarks are loaded after emacs-startup-hook, which is odd.  If I load
them before it works though.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Opening a bookmark in the init file
  2015-03-08 21:48         ` Robert Thorpe
@ 2015-03-08 22:52           ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2015-03-08 22:52 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs

> > But before bothering to fiddle with such things, check what you
> > are really doing, to see how/why/where else you are loading your
> > bookmark file, and perhaps simplify your code accordingly.
> 
> I'm loading the bookmark file because it doesn't work otherwise.
> If I just do:
> 
> (add-hook 'emacs-startup-hook '(lambda () (bookmark-jump "TODO")))
> 
> Then Emacs gives an error "Invalid Bookmark TODO".  It seems that the
> bookmarks are loaded after emacs-startup-hook, which is odd.  If I load
> them before it works though.

Many functions call `bookmark-maybe-load-default-file' (which loads
the bookmark file if it has not been loaded).

If you don't want to call that instead of `bookmark-load' then
try to find out what, during your startup, loads the file.
Do `M-x debug-on-entry RET bookmark-load RET' to see what calls
`bookmark-load' the first time.

There is no harm in calling `bookmark-maybe-load-default-file'.
I mention trying to find out what was causing the first load as a
way of helping you understanding what was happening.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Overriding emacs key bindings
@ 2016-05-13 14:20 xiongtk
  2016-05-16 18:04 ` Eli Zaretskii
  2016-05-16 18:59 ` Emanuel Berg
  0 siblings, 2 replies; 838+ messages in thread
From: xiongtk @ 2016-05-13 14:20 UTC (permalink / raw)
  To: help-gnu-emacs

Hi! I'm in a situation where I would like to override the following key
binding:

    /Applications/Emacs.app/Contents/Resources/lisp/international/mule-cmds.el.gz

    (define-key global-map "\C-\\" 'toggle-input-method)


Since this file is read only and it's not inside .emacs.d, I do not
want to change it directly if other solutions are possible.

I've tried with writing the following line in my personal customization
file:

    (define-key global-map (kbd "<f8>") 'toggle-input-method)
or
    (global-set-key (kbd "<f8>")  'toggle-input-method)

(I've tried both.)
Which assigns f8 to be the key binding.

However, checking the key binding with C-h a toggle-input-method gives me
the following message:

    Type M-x apropos-follow on an entry to view its full documentation.

    isearch-toggle-input-method   M-x ... RET
    Toggle input method in interactive search.
    toggle-input-method           <menu-bar> <options> <mule> <toggle-input-method>, <f8>, C-\
    :around advice: `ad-Advice-toggle-input-method'


Apparently my method does not override the original key binding. Any
suggestions?

P.S. About why I want to do that, I use evil-leader which uses "\" as
the leader key. To execute evil-leader key bindings in non normal mode of
evil-mode, I need to use C-\ as the leader key. So it conflicts with
the default key binding for toggle-input-method.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-13 14:20 Overriding emacs key bindings xiongtk
@ 2016-05-16 18:04 ` Eli Zaretskii
  2016-05-16 21:15   ` xiongtk
  2016-05-16 18:59 ` Emanuel Berg
  1 sibling, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2016-05-16 18:04 UTC (permalink / raw)
  To: help-gnu-emacs

> From: xiongtk <xiongtk@gmail.com>
> Date: Fri, 13 May 2016 16:20:58 +0200
> 
> Hi! I'm in a situation where I would like to override the following key
> binding:
> 
>     /Applications/Emacs.app/Contents/Resources/lisp/international/mule-cmds.el.gz
> 
>     (define-key global-map "\C-\\" 'toggle-input-method)
> 
> 
> Since this file is read only and it's not inside .emacs.d, I do not
> want to change it directly if other solutions are possible.
> 
> I've tried with writing the following line in my personal customization
> file:
> 
>     (define-key global-map (kbd "<f8>") 'toggle-input-method)
> or
>     (global-set-key (kbd "<f8>")  'toggle-input-method)
> 
> (I've tried both.)
> Which assigns f8 to be the key binding.
> 
> However, checking the key binding with C-h a toggle-input-method gives me
> the following message:
> 
>     Type M-x apropos-follow on an entry to view its full documentation.
> 
>     isearch-toggle-input-method   M-x ... RET
>     Toggle input method in interactive search.
>     toggle-input-method           <menu-bar> <options> <mule> <toggle-input-method>, <f8>, C-\
>     :around advice: `ad-Advice-toggle-input-method'
> 
> 
> Apparently my method does not override the original key binding.

Correct.  It just adds another binding.

> Any suggestions?

You want global-unset-key, evidently.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-13 14:20 Overriding emacs key bindings xiongtk
  2016-05-16 18:04 ` Eli Zaretskii
@ 2016-05-16 18:59 ` Emanuel Berg
  2016-05-16 21:14   ` xiongtk
  1 sibling, 1 reply; 838+ messages in thread
From: Emanuel Berg @ 2016-05-16 18:59 UTC (permalink / raw)
  To: help-gnu-emacs

xiongtk <xiongtk@gmail.com> writes:

> Since this file is read only and it's not
> inside .emacs.d, I do not want to change it
> directly if other solutions are possible.

Good call! Because then you'll loose it for
example when you upgrade Emacs, and each edit
would require a sudo detour...

> I've tried with writing the following line in
> my personal customization file:
>
>     (define-key global-map (kbd "<f8>")
> 'toggle-input-method) or (global-set-key (kbd
> "<f8>") 'toggle-input-method)

Instead of (kbd "<f8>"), you can do [f8].

(But: I don't recommend using the function keys
as they are remote (i.e., require arm movement
as opposed to just finger ditto, which in turn
implies a reset to typing position) - also they
are confusing (too alike) and thus difficult to
remember. And they don't work in a VT Emacs
instance! - not without special efforts [1]
at least.)

> Apparently my method does not override the
> original key binding. Any suggestions?

By "override", do you mean the new keystroke
won't work, or the old keystroke remains?

If the old keystroke remains, that is normal.
You can unset it like this:

    (global-unset-key "\C-hh")

If the new keystroke doesn't work, sometimes it
is the case that a *local* keymap has that key
assigned. Changing the global keymap doesn't
change the local map, of course, and the local
map has priority, as far as locally goes!

Here is some code to automatize setting
a global key, and then disabling the same key
for the desired local modes - if you want the
global key to be in effect there, as well.
Use the functions in the order they appear.

(defvar super-global-keys '())

(defun super-global-set-key (key function)
  "Make a super global KEY that invokes FUNCTION."
  (global-set-key key function)
  (add-to-list 'super-global-keys key) )

(defun disable-super-global-keys (&optional map)
  "Disable MAP super global keystrokes, so they can be assigned."
  (dolist (k super-global-keys)
    (define-key (or map (current-local-map)) k nil) ))

[1] http://user.it.uu.se/~embe8573/tty-emacs-keys.txt

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 30 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-16 18:59 ` Emanuel Berg
@ 2016-05-16 21:14   ` xiongtk
  2016-05-16 23:29     ` Emanuel Berg
  0 siblings, 1 reply; 838+ messages in thread
From: xiongtk @ 2016-05-16 21:14 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <embe8573@student.uu.se> writes:

> xiongtk <xiongtk@gmail.com> writes:
>
>> Since this file is read only and it's not
>> inside .emacs.d, I do not want to change it
>> directly if other solutions are possible.
>
> Good call! Because then you'll loose it for
> example when you upgrade Emacs, and each edit
> would require a sudo detour...
>
>> I've tried with writing the following line in
>> my personal customization file:
>>
>>     (define-key global-map (kbd "<f8>")
>> 'toggle-input-method) or (global-set-key (kbd
>> "<f8>") 'toggle-input-method)
>
> Instead of (kbd "<f8>"), you can do [f8].
>
> (But: I don't recommend using the function keys
> as they are remote (i.e., require arm movement
> as opposed to just finger ditto, which in turn
> implies a reset to typing position) - also they
> are confusing (too alike) and thus difficult to
> remember. And they don't work in a VT Emacs
> instance! - not without special efforts [1]
> at least.)
>
I kind of run out of keys on my keyboard. Since this function is rarely
used(I use English for 99% of the time), I think the function keys is fine.
>> Apparently my method does not override the
>> original key binding. Any suggestions?
>
> By "override", do you mean the new keystroke
> won't work, or the old keystroke remains?
>
> If the old keystroke remains, that is normal.
> You can unset it like this:
>
>     (global-unset-key "\C-hh")
>
> If the new keystroke doesn't work, sometimes it
> is the case that a *local* keymap has that key
> assigned. Changing the global keymap doesn't
> change the local map, of course, and the local
> map has priority, as far as locally goes!
>
> Here is some code to automatize setting
> a global key, and then disabling the same key
> for the desired local modes - if you want the
> global key to be in effect there, as well.
> Use the functions in the order they appear.
>
> (defvar super-global-keys '())
>
> (defun super-global-set-key (key function)
>   "Make a super global KEY that invokes FUNCTION."
>   (global-set-key key function)
>   (add-to-list 'super-global-keys key) )
>
> (defun disable-super-global-keys (&optional map)
>   "Disable MAP super global keystrokes, so they can be assigned."
>   (dolist (k super-global-keys)
>     (define-key (or map (current-local-map)) k nil) ))
>
> [1] http://user.it.uu.se/~embe8573/tty-emacs-keys.txt
I believe (global-unset-key ) is what I'm searching for. Thank you!




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-16 18:04 ` Eli Zaretskii
@ 2016-05-16 21:15   ` xiongtk
  0 siblings, 0 replies; 838+ messages in thread
From: xiongtk @ 2016-05-16 21:15 UTC (permalink / raw)
  To: help-gnu-emacs

Eli Zaretskii <eliz@gnu.org> writes:

>> From: xiongtk <xiongtk@gmail.com>
>> Date: Fri, 13 May 2016 16:20:58 +0200
>> 
>> Hi! I'm in a situation where I would like to override the following key
>> binding:
>> 
>>     /Applications/Emacs.app/Contents/Resources/lisp/international/mule-cmds.el.gz
>> 
>>     (define-key global-map "\C-\\" 'toggle-input-method)
>> 
>> 
>> Since this file is read only and it's not inside .emacs.d, I do not
>> want to change it directly if other solutions are possible.
>> 
>> I've tried with writing the following line in my personal customization
>> file:
>> 
>>     (define-key global-map (kbd "<f8>") 'toggle-input-method)
>> or
>>     (global-set-key (kbd "<f8>")  'toggle-input-method)
>> 
>> (I've tried both.)
>> Which assigns f8 to be the key binding.
>> 
>> However, checking the key binding with C-h a toggle-input-method gives me
>> the following message:
>> 
>>     Type M-x apropos-follow on an entry to view its full documentation.
>> 
>>     isearch-toggle-input-method   M-x ... RET
>>     Toggle input method in interactive search.
>>     toggle-input-method           <menu-bar> <options> <mule> <toggle-input-method>, <f8>, C-\
>>     :around advice: `ad-Advice-toggle-input-method'
>> 
>> 
>> Apparently my method does not override the original key binding.
>
> Correct.  It just adds another binding.
>
>> Any suggestions?
>
> You want global-unset-key, evidently.
Thanks for your advice!




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-16 21:14   ` xiongtk
@ 2016-05-16 23:29     ` Emanuel Berg
  2016-05-17  1:55       ` Robert Thorpe
                         ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-16 23:29 UTC (permalink / raw)
  To: help-gnu-emacs

xiongtk <xiongtk@gmail.com> writes:

> I kind of run out of keys on my keyboard.
> Since this function is rarely used(I use
> English for 99% of the time), I think the
> function keys is fine.

To each his own. And Emacs makes that much
easier to achieve. By changing Emacs, you
become a better programmer and better computer
user, and even Emacs gets better, until the
point you realize there is already a built-in
function, or module, that does what you have
done, only better, and then it all starts over
at a higher level... Because, if anything can
start anew, then everything must continue!

That said, if you rarely use the function,
there is no need for a shortcut. Remember,
"optimize the common case".

If you think it is to much to type the actual
function name, instead make an alias - or
several! You'll find that it is actually faster
to invoke as it is easier to remember and,
again, does not require arm movement way from
typing position.

Why several aliases? Because sometimes you
remember "test-colors", and sometimes
"color-test" - with aliases, they can all be
correct! But here, compare: will you remember
that "color-test" years ago was assigned F6?

So, e.g.,

    (defalias 'download 'w3m-dl-dwim)
    (defalias 'dl       'w3m-dl-dwim)

Regardless, I don't think you are running out
of shutcuts :)

Many shortcuts are assigned to stuff you never
use - you can replace those. It is not because
the stuff is bad - it can be just appealing to
another personality, or involve technology you
just don't use!

Here is a tool - eval, invoke, and start
hammering away, and you'll see:

    (defun show-key-command (&optional the-key command)
      (interactive)
      (let*((key-prompt           "(hit key! or C-g to quit)")
            (prompt               (if command (format " %s   %s " command key-prompt)
                                    key-prompt))
            (key                  (or the-key (read-key-sequence-vector prompt)))
            (new-command          (key-binding key))
            (command-or-undefined (or new-command "undefined")) )
        (if the-key (message "%s" command-or-undefined)
          (unless (equal key [7]) ; [7] is C-g
            (show-key-command nil command-or-undefined) ))))

If you really *do* run out of shortcuts, get
a new prefix key, e.g. C-o which is short and
close - check your hands when at asdf jkl; and
note the required movement to strike C-o!

Now even a new world of shortcuts opens. E.g.,

    (define-prefix-command        'C-o-prefix)
    (global-set-key        "\C-o" 'C-o-prefix)
    (global-set-key        "\C-ow" #'window-increase-size)

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 31 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-16 23:29     ` Emanuel Berg
@ 2016-05-17  1:55       ` Robert Thorpe
  2016-05-17  2:41         ` Emanuel Berg
                           ` (3 more replies)
  2016-05-17  4:43       ` Marcin Borkowski
  2016-05-17  4:49       ` Marcin Borkowski
  2 siblings, 4 replies; 838+ messages in thread
From: Robert Thorpe @ 2016-05-17  1:55 UTC (permalink / raw)
  To: Emanuel Berg, xiongtk; +Cc: help-gnu-emacs

Emanuel Berg <embe8573@student.uu.se> writes:

> xiongtk <xiongtk@gmail.com> writes:

>> I kind of run out of keys on my keyboard.
>> Since this function is rarely used(I use
>> English for 99% of the time), I think the
>> function keys is fine.
...
>
> If you really *do* run out of shortcuts, get
> a new prefix key, e.g. C-o which is short and
> close - check your hands when at asdf jkl; and
> note the required movement to strike C-o!
>
> Now even a new world of shortcuts opens. E.g.,

Personally, I'm very used to C-o being open-line.  That said, I agree
with Emmanuel in general about this.

There are a lot of options that people don't consider.  Emacs reserves
all keybindings of the type C-c C-<something> for modes.  However, if the
second key doesn't begin with ctrl then the user can use it.  The entire
C-c <something> keymap is reserved for the user.  The something can be
any key that's not prefixed by ctrl or meta.  Any key works, even the
numbers and symbols on the keyboard.  Capitals and small letters aren't
treated the same, so there's a huge space there for new keybindings.
Then there are rarely used prefix keys, like the key for marking text,
you can attach stuff to that one.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  1:55       ` Robert Thorpe
@ 2016-05-17  2:41         ` Emanuel Berg
  2016-05-17  4:07           ` Drew Adams
  2016-05-17  3:25         ` Kaushal Modi
                           ` (2 subsequent siblings)
  3 siblings, 1 reply; 838+ messages in thread
From: Emanuel Berg @ 2016-05-17  2:41 UTC (permalink / raw)
  To: help-gnu-emacs

Robert Thorpe <rt@robertthorpeconsulting.com>
writes:

> Personally, I'm very used to C-o being
> open-line. That said, I agree with Emmanuel
> in general about this.
>
> There are a lot of options that people don't
> consider. Emacs reserves all keybindings of
> the type C-c C-<something> for modes.
>
> However, if the second key doesn't begin with
> ctrl then the user can use it. The entire C-c
> <something> keymap is reserved for the user.

That is generous, however Emacs is even more
generous and the user can assign any shortcut.

I think C-o is better as 1) o is easier to hit
than c, and 2) with C-c, both keys are on the
left hand side (little and index finger hitting
the keys), while with C-o, there is a pleasant
combination of left and right, and the left
index finger remains at f!

(Now in Russia, there was once a civil war that
lay the entire land to ashes, and the dispute
was how to make the cross sign - either
initially horizontally, or vertically!
Talk about stupid...)

But I also suspect C-c "single key" is
underused. Luckily it is just a key so it
doesn't have hurt feelings.

> The something can be any key that's not
> prefixed by ctrl or meta. Any key works, even
> the numbers and symbols on the keyboard.
> Capitals and small letters aren't treated the
> same, so there's a huge space there for new
> keybindings. Then there are rarely used
> prefix keys, like the key for marking text,
> you can attach stuff to that one.

Absolutely, you don't have to hold a Ph.D.
in combinatorics to understand there are more
combinations than 99% of Joe Elisp Hackers
could ever use sensibly!

Because Emacs is like a workshop filled with
tools, or a library but not with fiction but
formulas and methods and strategies. You can
benefit several lifetimes (if you live that
long) from them tools and books, but you still
will never have laid hand on every single one
of them. It is just the way it goes.

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 32 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  1:55       ` Robert Thorpe
  2016-05-17  2:41         ` Emanuel Berg
@ 2016-05-17  3:25         ` Kaushal Modi
  2016-05-17  4:07           ` Drew Adams
                             ` (2 more replies)
  2016-05-17  4:07         ` Drew Adams
  2016-05-17  4:44         ` Overriding emacs key bindings Marcin Borkowski
  3 siblings, 3 replies; 838+ messages in thread
From: Kaushal Modi @ 2016-05-17  3:25 UTC (permalink / raw)
  To: Robert Thorpe, Emanuel Berg, xiongtk; +Cc: help-gnu-emacs

On Mon, May 16, 2016, 9:56 PM Robert Thorpe <rt@robertthorpeconsulting.com>
wrote:

> The entire
> C-c <something> keymap is reserved for the user.  The something can be
> any key that's not prefixed by ctrl or meta.  Any key works, even the
> numbers and symbols on the keyboard.


While I do agree that a wide range of user bindings are available with C-c
prefix, I would not recommend blindly using all available "C-c SYMBOL"
bindings without checking of org-mode already uses them especially if you
use org-mode a lot. I now first check if a new binding conflicts with
org-mode before creating a new personal C-c binding.

You can also check out the key-chord package from Melpa for a wider range
of bindings.
-- 

-- 
Kaushal Modi


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Overriding emacs key bindings
  2016-05-17  1:55       ` Robert Thorpe
  2016-05-17  2:41         ` Emanuel Berg
  2016-05-17  3:25         ` Kaushal Modi
@ 2016-05-17  4:07         ` Drew Adams
  2016-05-18  1:42           ` Emacs conventions (was: Re: Overriding emacs key bindings) Emanuel Berg
  2016-05-17  4:44         ` Overriding emacs key bindings Marcin Borkowski
  3 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2016-05-17  4:07 UTC (permalink / raw)
  To: Robert Thorpe, Emanuel Berg, xiongtk; +Cc: help-gnu-emacs

> Emacs reserves all keybindings of the type C-c C-<something>
> for modes.

No, it does not.  Emacs does not reserve any keys from users.
Users can bind any keys they like.

What Emacs reserves (by convention) are keys from modes.
It says that major modes should use only these keys and
minor modes should use only those keys.  And neither
major nor minor should use a third set of keys, which are
_only_ for users (again, by convention).

But users can use _any_ keys.

> However, if the second key doesn't begin with ctrl then
> the user can use it.

Doesn't matter what the first or second key is.  Users
can use all keys.  They can override any key bound by
any mode.

Thank goodness.  It would be silly if some keys were
reserved for modes and not allowed for users.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Overriding emacs key bindings
  2016-05-17  2:41         ` Emanuel Berg
@ 2016-05-17  4:07           ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2016-05-17  4:07 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

> > However, if the second key doesn't begin with
> > ctrl then the user can use it. The entire C-c
> > <something> keymap is reserved for the user.
> 
> That is generous, however Emacs is even more
> generous and the user can assign any shortcut.

Right.  Users can bind any keys.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Overriding emacs key bindings
  2016-05-17  3:25         ` Kaushal Modi
@ 2016-05-17  4:07           ` Drew Adams
  2016-05-17  4:15           ` Emanuel Berg
  2016-05-17 20:38           ` Robert Thorpe
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2016-05-17  4:07 UTC (permalink / raw)
  To: Kaushal Modi, Robert Thorpe, Emanuel Berg, xiongtk; +Cc: help-gnu-emacs

> While I do agree that a wide range of user bindings are available with C-c
> prefix, I would not recommend blindly using all available "C-c SYMBOL"
> bindings without checking of org-mode already uses them especially if you
> use org-mode a lot. I now first check if a new binding conflicts with
> org-mode before creating a new personal C-c binding.

Sure, if you use a mode that assigns certain keys, and if you want
to use those keys for that mode, then use those keys for that mode.

But if you want to use those keys for something else, you can
always bind different keys for use by the mode.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  3:25         ` Kaushal Modi
  2016-05-17  4:07           ` Drew Adams
@ 2016-05-17  4:15           ` Emanuel Berg
  2016-05-17 20:38           ` Robert Thorpe
  2 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-17  4:15 UTC (permalink / raw)
  To: help-gnu-emacs

Kaushal Modi <kaushal.modi@gmail.com> writes:

> While I do agree that a wide range of user
> bindings are available with C-c prefix,
> I would not recommend blindly using all
> available "C-c SYMBOL" bindings without
> checking of org-mode already uses them
> especially if you use org-mode a lot. I now
> first check if a new binding conflicts with
> org-mode before creating a new personal
> C-c binding.

Interesting - in other words, it is _org-mode_
that decides what keybindings you use...

Another idea, if you look for some intuitive
degree of consistency, is to identify "key"
concepts. For example, one such concept is "to
execute". In this message-mode, C-c C-c is to
send the message. I'd say that is to execute,
in the setting of typing a mail!
Likewise a piece of code - to execute is either
to launch the program, or to compile it.
Perhaps it is launch if it is a shell script,
but compile if it is LaTeX source! A global
DWIM function with branching can do this, or
each mode can have its own function that
locally is associated with C-c C-c. In Dired
(and a Gnus summary for that matter), there are
a bunch of things you can mark the files
(posts) so that it will happen when you -
execute. And in Emacs-w3m, you can fill forms
with data and submit with the same key!

Another axis of intuitiveness is the modes when
there is no typing. Here, the whole keyboard
can be used to fire of defuns! But even cooler
if this mirrors, only simplifies, the standard
keystrokes. Say you have scroll up one line
with M-i, and ditto down with M-j. You have
this all over Emacs. [1] But in w3m, which
doesn't require typing when you "browse" (yuk,
that word!) - here, make it super-comfortable
by keeping the M-i and M-j, but supplementing
with i and j, to do the same thing!

So there is no need to fear getting in the way
of what is already there. Instead think what
you would like to do.

[1] http://user.it.uu.se/~embe8573/conf/emacs-init/scroll.el

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 32 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-16 23:29     ` Emanuel Berg
  2016-05-17  1:55       ` Robert Thorpe
@ 2016-05-17  4:43       ` Marcin Borkowski
  2016-05-18  1:51         ` Emanuel Berg
  2016-05-17  4:49       ` Marcin Borkowski
  2 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2016-05-17  4:43 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2016-05-17, at 01:29, Emanuel Berg <embe8573@student.uu.se> wrote:

> If you really *do* run out of shortcuts, get
> a new prefix key, e.g. C-o which is short and
> close - check your hands when at asdf jkl; and
> note the required movement to strike C-o!

Why use such a key bound to such a useful command (`open-line') for
a new prefix key‽  Especially when C-z is totally useless (and in an
extreme case when it is what you want, `suspend-frame' is duplicated on
C-x C-z anyway)?

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  1:55       ` Robert Thorpe
                           ` (2 preceding siblings ...)
  2016-05-17  4:07         ` Drew Adams
@ 2016-05-17  4:44         ` Marcin Borkowski
  2016-05-17 20:37           ` Robert Thorpe
  3 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2016-05-17  4:44 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs, Emanuel Berg, xiongtk


On 2016-05-17, at 03:55, Robert Thorpe <rt@robertthorpeconsulting.com> wrote:

> Then there are rarely used prefix keys, like the key for marking text,
> you can attach stuff to that one.

Out of curiosity: what key do you mean?

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-16 23:29     ` Emanuel Berg
  2016-05-17  1:55       ` Robert Thorpe
  2016-05-17  4:43       ` Marcin Borkowski
@ 2016-05-17  4:49       ` Marcin Borkowski
  2016-05-18  2:02         ` Emanuel Berg
  2 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2016-05-17  4:49 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2016-05-17, at 01:29, Emanuel Berg <embe8573@student.uu.se> wrote:

> If you think it is to much to type the actual
> function name, instead make an alias - or
> several! You'll find that it is actually faster
> to invoke as it is easier to remember and,
> again, does not require arm movement way from
> typing position.

If remembering is an issue (as in seldom used commands), hydra comes to
the rescue.

But I also agree on the point that there's nothing wrong with using M-x
and a descriptive name for rarely used commands.  Though long names
don't bother me beacuse autocompletion (either vanilla Emacs, or
Icicles/Ivy/whatever).

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  4:44         ` Overriding emacs key bindings Marcin Borkowski
@ 2016-05-17 20:37           ` Robert Thorpe
  2016-05-18  2:21             ` Emanuel Berg
  2016-05-18 17:52             ` Marcin Borkowski
  0 siblings, 2 replies; 838+ messages in thread
From: Robert Thorpe @ 2016-05-17 20:37 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs, embe8573, xiongtk

Marcin Borkowski <mbork@mbork.pl> writes:

> On 2016-05-17, at 03:55, Robert Thorpe <rt@robertthorpeconsulting.com> wrote:
>
>> Then there are rarely used prefix keys, like the key for marking text,
>> you can attach stuff to that one.
>
> Out of curiosity: what key do you mean?

This is a picture of it:
http://i.stack.imgur.com/sgzBP.jpg

It's called "Menu" in X and "Apps" on MS Windows.  You can use it as a
prefix key.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  3:25         ` Kaushal Modi
  2016-05-17  4:07           ` Drew Adams
  2016-05-17  4:15           ` Emanuel Berg
@ 2016-05-17 20:38           ` Robert Thorpe
  2 siblings, 0 replies; 838+ messages in thread
From: Robert Thorpe @ 2016-05-17 20:38 UTC (permalink / raw)
  To: Kaushal Modi; +Cc: help-gnu-emacs, embe8573, xiongtk

Kaushal Modi <kaushal.modi@gmail.com> writes:

> While I do agree that a wide range of user bindings are available with C-c
> prefix, I would not recommend blindly using all available "C-c SYMBOL"
> bindings without checking of org-mode already uses them especially if you
> use org-mode a lot. I now first check if a new binding conflicts with
> org-mode before creating a new personal C-c binding.

You're right.  I didn't know that Org uses those keys.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Emacs conventions (was: Re: Overriding emacs key bindings)
  2016-05-17  4:07         ` Drew Adams
@ 2016-05-18  1:42           ` Emanuel Berg
  2016-05-18  4:38             ` Drew Adams
       [not found]             ` <mailman.37.1463546355.6543.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-18  1:42 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

> What Emacs reserves (by convention) are keys
> from modes. It says that major modes should
> use only these keys and minor modes should
> use only those keys. And neither major nor
> minor should use a third set of keys, which
> are _only_ for users (again, by convention).

Are those "Emacs conventions" - and not just
those who deal with keys -
summarized somewhere?

Because they are obviously good to be aware of,
so when you disregard them, it is something you
do because you think it'll benefit you, and not
because you are unaware of something that on
the contrary makes sense...

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 32 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  4:43       ` Marcin Borkowski
@ 2016-05-18  1:51         ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-18  1:51 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski <mbork@mbork.pl> writes:

> Why use such a key bound to such a useful
> command (`open-line') for a new prefix key
> Especially when C-z is totally useless (and
> in an extreme case when it is what you want,
> `suspend-frame' is duplicated on C-x C-z
> anyway)?

Personally, I never user use `open-line'.
I actually don't know what I do instead:
`C-a RET', perhaps?

But I do have `C-o a' undefined, so I'll put
`open-line' there, and perhaps this "opens"
a door to a new world of editing proficiency :)

If you use C-o for `open-line' all the time,
obviously it is not a good prefix key, unless
you can assign `open-line' another shortcut
just as good, and then reprogram your
brain/fingers, of course.

As for C-z, I like that even less than I like
C-c, for all the same reasons I dislike C-c
*plus* it involves the little finger (compared
to the index finger) and the keys are even
closer than C-c where they are too
close already.

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 32 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17  4:49       ` Marcin Borkowski
@ 2016-05-18  2:02         ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-18  2:02 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski <mbork@mbork.pl> writes:

> But I also agree on the point that there's
> nothing wrong with using M-x and
> a descriptive name for rarely used commands.
> Though long names don't bother me beacuse
> autocompletion (either vanilla Emacs, or
> Icicles/Ivy/whatever).

Autocompletion I don't like - it reminds me of
my VB5, Eclipse, MS SQL Server, and .net days
(which all were few but traumatic) - for sure,
in Emacs it is much better, as with TAB it
happens at your discretion, and not instantly,
all the time, and everywhere!

Still, 1) I don't like to see the "false hits"
as it takes 1 per mille of the mindfulness to
see "something-gnus", when you look for
"something-groff", and 2) I like to think my
memory improves from memorizing either the long
names, or, if too long, my aliases which are
shorter and should click with my memory better
as 1) I wrote them, and 2) the correspond to
my thinking.

Now this message is 1) written, and 2) sent.

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 32 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17 20:37           ` Robert Thorpe
@ 2016-05-18  2:21             ` Emanuel Berg
  2016-05-18 20:34               ` Robert Thorpe
  2016-05-18 17:52             ` Marcin Borkowski
  1 sibling, 1 reply; 838+ messages in thread
From: Emanuel Berg @ 2016-05-18  2:21 UTC (permalink / raw)
  To: help-gnu-emacs

Robert Thorpe <rt@robertthorpeconsulting.com>
writes:

> It's called "Menu" in X and "Apps" on
> MS Windows. You can use it as a prefix key.

Ha ha, "Apps" :)

Fittingly, that key doesn't work with Emacs in
a Linux VT - not without the efforts already
mentioned in this thread.

AltGr and the key with the MS flag on it
reports the same key, C-@.

But showkey(1) gives three different values for
them so all three can be put to into different
action - only, IMO they are not good keys so
I wouldn't bother...

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 33 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Emacs conventions (was: Re: Overriding emacs key bindings)
  2016-05-18  1:42           ` Emacs conventions (was: Re: Overriding emacs key bindings) Emanuel Berg
@ 2016-05-18  4:38             ` Drew Adams
  2016-05-18  5:22               ` Emanuel Berg
       [not found]             ` <mailman.37.1463546355.6543.help-gnu-emacs@gnu.org>
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2016-05-18  4:38 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

> > What Emacs reserves (by convention) are keys
> > from modes. It says that major modes should
> > use only these keys and minor modes should
> > use only those keys. And neither major nor
> > minor should use a third set of keys, which
> > are _only_ for users (again, by convention).
> 
> Are those "Emacs conventions" - and not just
> those who deal with keys - summarized somewhere?

(elisp) `Key Binding Conventions':
http://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Binding-Conventions.html

> Because they are obviously good to be aware of,
> so when you disregard them, it is something you
> do because you think it'll benefit you, and not
> because you are unaware of something that on
> the contrary makes sense...

Yes, they are good to be aware of.  But again, they are
for someone writing a library for more than personal use.
They are in no way restrictions on users.

There is no convention (that I know of) that restricts
key bindings for users or even suggests that users
should stay away from certain keys.

The exceptions I can think of, in terms of suggestions,
are `C-u' and `C-g'.  You might get into some difficulty
if you try to bind `C-u' (and a few users seem to want
to do that).  You can use another key in place of `C-g',
but there are some hard-coded bindings of `C-g' to its
usual behavior, AFAIK.

I would recommend that no one try to use `C-g' or `C-u'
for something else.  (But there is no restriction against
trying to do that.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Emacs conventions (was: Re: Overriding emacs key bindings)
  2016-05-18  4:38             ` Drew Adams
@ 2016-05-18  5:22               ` Emanuel Berg
  2016-05-18  5:36                 ` "First line is not a complete sentence" (was: Re: Emacs conventions (was: Re: Overriding emacs key bindings)) Emanuel Berg
       [not found]                 ` <mailman.40.1463549841.6543.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-18  5:22 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

> Yes, they are good to be aware of. But again,
> they are for someone writing a library for
> more than personal use. They are in no way
> restrictions on users.
>
> There is no convention (that I know of) that
> restricts key bindings for users or even
> suggests that users should stay away from
> certain keys.

OK.

No doubt, disregarding conventions in code that
is supposed to be shared - you should have
a very good reason for doing that! (The
assumption being the convention makes sense.)

Still, there is a hesitation in my mind doing
a to sharp division between libraries that are
professional, and then the user stuff... The
user stuff is the best school. So it is a good
place to start acting like a skilled
programmer, and that skilled programmer may
well write or contribute to a library, and that
doesn't have to take three decades like some
people think....

As they say in boxing, "you want to be
a champion? Start acting like one, today".

So a list of conventions, good habits, known
pitfalls, etc. is a good idea. (Perhaps it can
in large parts be compiled from different parts
of existing material.) Just a thought - I'm not
up for the job myself :)

But here is one thing that might help for code that
is a package:

    (defun check-package-style ()
      (interactive)
      (checkdoc-current-buffer t) ; TAKE-NOTES
      (message "Style check done.") )

Eh :)

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 33 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* "First line is not a complete sentence" (was: Re: Emacs conventions (was: Re: Overriding emacs key bindings))
  2016-05-18  5:22               ` Emanuel Berg
@ 2016-05-18  5:36                 ` Emanuel Berg
       [not found]                 ` <mailman.40.1463549841.6543.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-18  5:36 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <embe8573@student.uu.se> writes:

> (defun check-package-style ()
>   (interactive)
>   (checkdoc-current-buffer t) ; TAKE-NOTES
>   (message "Style check done.") )

By the way, if you put that into a package and
run it on itself, it says all interactive
functions should be documented, I think.

But with docstrings, there is a wierd behavior
- often, this is the "error":

    First line is not a complete sentence

What does that mean and what is the definition
of a complete sentence - besides that it should
end with a full stop?

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 33 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: "First line is not a complete sentence" (was: Re: Emacs conventions (was: Re: Overriding emacs key bindings))
       [not found]                 ` <mailman.40.1463549841.6543.help-gnu-emacs@gnu.org>
@ 2016-05-18 13:27                   ` Joost Kremers
  2016-05-19  4:32                     ` Emanuel Berg
  0 siblings, 1 reply; 838+ messages in thread
From: Joost Kremers @ 2016-05-18 13:27 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg wrote:
> But with docstrings, there is a wierd behavior
> - often, this is the "error":
>
>     First line is not a complete sentence
>
> What does that mean 

see (info "(elisp) Function Documentation"):

,----
|    The first line of the documentation string should stand on its own,
| because ‘apropos’ displays just this first line.  It should consist of
| one or two complete sentences that summarize the function’s purpose.
`----

> and what is the definition
> of a complete sentence - besides that it should
> end with a full stop?

Well, I suspect Emacs can only check whether it ends with a full stop,
but the idea is of course also that it is a full sentence from a
grammatical point of view. In essence, it should convey a clear and (in
the given context) unambiguous message.



-- 
Joost Kremers                                   joostkremers@fastmail.fm
Selbst in die Unterwelt dringt durch Spalten Licht
EN:SiS(9)


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Emacs conventions (was: Re: Overriding emacs key bindings)
       [not found]             ` <mailman.37.1463546355.6543.help-gnu-emacs@gnu.org>
@ 2016-05-18 14:31               ` Barry Margolin
  2016-05-19  4:38                 ` Emanuel Berg
  0 siblings, 1 reply; 838+ messages in thread
From: Barry Margolin @ 2016-05-18 14:31 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.37.1463546355.6543.help-gnu-emacs@gnu.org>,
 Drew Adams <drew.adams@oracle.com> wrote:

> Yes, they are good to be aware of.  But again, they are
> for someone writing a library for more than personal use.
> They are in no way restrictions on users.
> 
> There is no convention (that I know of) that restricts
> key bindings for users or even suggests that users
> should stay away from certain keys.

But if a user binds a key that's supposed to be for modes, and then they 
load a mode that also binds that key, they'll have a conflict. The point 
of these conventions is to avoid conflicts like this.

If you don't mind losing one of the mode's keybindings, that's fine, but 
you should do it with full knowledge of the potential conflict.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-17 20:37           ` Robert Thorpe
  2016-05-18  2:21             ` Emanuel Berg
@ 2016-05-18 17:52             ` Marcin Borkowski
  2016-05-18 20:30               ` Robert Thorpe
  1 sibling, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2016-05-18 17:52 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs, embe8573, xiongtk


On 2016-05-17, at 22:37, Robert Thorpe <rt@robertthorpeconsulting.com> wrote:

> Marcin Borkowski <mbork@mbork.pl> writes:
>
>> On 2016-05-17, at 03:55, Robert Thorpe <rt@robertthorpeconsulting.com> wrote:
>>
>>> Then there are rarely used prefix keys, like the key for marking text,
>>> you can attach stuff to that one.
>>
>> Out of curiosity: what key do you mean?
>
> This is a picture of it:
> http://i.stack.imgur.com/sgzBP.jpg
>
> It's called "Menu" in X and "Apps" on MS Windows.  You can use it as a
> prefix key.

Ah, that one, thanks!  I had no idea it had anything to do with marking
text.  I used to bind it to various stuff in my WM; this way, I could
release all those precious keys usually taken by the WM, like M-TAB.

> BR,
> Robert Thorpe

Best,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-18 17:52             ` Marcin Borkowski
@ 2016-05-18 20:30               ` Robert Thorpe
  0 siblings, 0 replies; 838+ messages in thread
From: Robert Thorpe @ 2016-05-18 20:30 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs, embe8573, xiongtk

Marcin Borkowski <mbork@mbork.pl> writes:


> Ah, that one, thanks!  I had no idea it had anything to do with marking
> text.  I used to bind it to various stuff in my WM; this way, I could
> release all those precious keys usually taken by the WM, like M-TAB.

That's a good idea, I might try that.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-18  2:21             ` Emanuel Berg
@ 2016-05-18 20:34               ` Robert Thorpe
  2016-05-19  1:33                 ` Emanuel Berg
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2016-05-18 20:34 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs

Emanuel Berg <embe8573@student.uu.se> writes:

> But showkey(1) gives three different values for
> them so all three can be put to into different
> action - only, IMO they are not good keys so
> I wouldn't bother...

On my keyboard the menu/apps key is next to ctrl.  While your fingers
are on the main part of the keyboard you can press ctrl using the bottom
of your index finger, the part between the finger and the palm.  You can
press the menu key in the same way, so I find it a useful key.  It
depends on your preference, and to some degree on the size of your
hands.

BR,
Rob



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Overriding emacs key bindings
  2016-05-18 20:34               ` Robert Thorpe
@ 2016-05-19  1:33                 ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-19  1:33 UTC (permalink / raw)
  To: help-gnu-emacs

Robert Thorpe <rt@robertthorpeconsulting.com>
writes:

> On my keyboard the menu/apps key is next to
> ctrl.

Yes, deeming from your image, I think we have
the same type of keyboard.

For many years I had a lovely Sun keyboard but
step by step it disintegrated and now I have
a mundane keyboard, along with the Microsoft
flag, and even the Swedish char layout!

Hideous - but I suppose it won't matter, as
I know where the US layout keys are by know.

Perhaps I should do like in the Angelina Jolie
movie, where the dude sprays his keyboard in
a uniform color. I did that myself with
a bicycle trailer when I created my new
office [1] so I don't see why it shouldn't
work again.

> While your fingers are on the main part of
> the keyboard you can press ctrl using the
> bottom of your index finger, the part between
> the finger and the palm. You can press the
> menu key in the same way.

... really? You do that? Far out :) Does that
have a name? Let me reveal my inexperience by
admitting I never heard of it. Myself, my claim
to fame is my dynamic signature, below - cute,
to say the least :)

Speaking of keys and stuff I never heard of,
the AltGr key ows its name from the following
fragment of computer history:

    AltGr was originally introduced as a means
    to produce box-drawing characters, also
    known as pseudographics, in text
    user interfaces. [2]

Facts - for fans! (Hey, reading that, I'm
almost starting to *like* the key...)

[1] http://user.it.uu.se/~embe8573/photos/supertramp-1.jpg

[2] https://en.wikipedia.org/w/index.php?title=AltGr&printable=yes

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 33 Blogomatic articles -                   




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: "First line is not a complete sentence" (was: Re: Emacs conventions (was: Re: Overriding emacs key bindings))
  2016-05-18 13:27                   ` Joost Kremers
@ 2016-05-19  4:32                     ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-19  4:32 UTC (permalink / raw)
  To: help-gnu-emacs

Joost Kremers <joost.m.kremers@gmail.com>
writes:

> see (info "(elisp) Function Documentation"):
>
> The first line of the documentation string
> should stand on its own, because ‘apropos’
> displays just this first line. It should
> consist of one or two complete sentences that
> summarize the function’s purpose.
>
>> and what is the definition of a complete
>> sentence - besides that it should end with
>> a full stop?
>
> Well, I suspect Emacs can only check whether
> it ends with a full stop

That was I joke which refered to that the error
message itself wasn't a full sentence :)


Because I get that error even tho there is
a full stop.

> but the idea is of course also that it is
> a full sentence from a grammatical point of
> view. In essence, it should convey a clear
> and (in the given context)
> unambiguous message.

Right, but if it cannot check that, it might as
well *always* report "Use correct English!"

No, I think it does something more sensible,
only it fails to communicate what exactly so it
is only confusing at this point.

Wait... now I understand, I think. One gets the
error if one ends the first line with \n!

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 33 Blogomatic articles -                   


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Emacs conventions (was: Re: Overriding emacs key bindings)
  2016-05-18 14:31               ` Emacs conventions (was: Re: Overriding emacs key bindings) Barry Margolin
@ 2016-05-19  4:38                 ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2016-05-19  4:38 UTC (permalink / raw)
  To: help-gnu-emacs

Barry Margolin <barmar@alum.mit.edu> writes:

>> There is no convention (that I know of) that
>> restricts key bindings for users or even
>> suggests that users should stay away from
>> certain keys.
>
> But if a user binds a key that's supposed to
> be for modes, and then they load a mode that
> also binds that key, they'll have a conflict.
> The point of these conventions is to avoid
> conflicts like this.

Thats exactly right.

Part of the reason a convention is useful is
that the convention itself makes sense, but
part of it has little to do with the particular
definition, and the usefulness lies in the
status as convention as such, and likely some
other definition would have worked just as
good...

-- 
underground experts united .... http://user.it.uu.se/~embe8573
Emacs Gnus Blogomatic ......... http://user.it.uu.se/~embe8573/blogomatic
                   - so far: 33 Blogomatic articles -                   


^ permalink raw reply	[flat|nested] 838+ messages in thread

* How to get back to a place in a buffer, or: what is a window configuration?
@ 2016-08-03  9:30 Marcin Borkowski
  2016-08-03 11:25 ` Kaushal Modi
                   ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Marcin Borkowski @ 2016-08-03  9:30 UTC (permalink / raw)
  To: Help Gnu Emacs mailing list

Hi all,

sometimes I work on a particular place in some buffer, and Emacs for
some reason scrolls me out of that place.  I want then to get back to
it.  Is there a way (in stock Emacs or with help of M?elpa) to
accomplish that?

Bonus points for a package/command which /temporarily/ disables C-v/M-v
and other commands that might result in scrolling text in the window.
(Narrowing to what is currently visible should do the trick, so
a combination of M-r, C-e and C-SPC would probably do what I want.
Coding that is three minutes, but maybe someone did it already?)

Note that it's not the same as keeping a position in a register.
A simple experiment shows that keeping a /window configurations/ seems
to do what I want, but from reading the manual I'm not sure what
a "window configuration" really is.  What does a "window configuration"
consist of, exactly?

TIA,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: How to get back to a place in a buffer, or: what is a window configuration?
  2016-08-03  9:30 How to get back to a place in a buffer, or: what is a window configuration? Marcin Borkowski
@ 2016-08-03 11:25 ` Kaushal Modi
  2016-08-03 18:31   ` Marcin Borkowski
  2016-08-03 14:42 ` Drew Adams
  2016-08-03 21:47 ` Robert Thorpe
  2 siblings, 1 reply; 838+ messages in thread
From: Kaushal Modi @ 2016-08-03 11:25 UTC (permalink / raw)
  To: Marcin Borkowski, Help Gnu Emacs mailing list

Here are a couple of things that might help you:

(1) Setting scroll-preserve-screen-position to a non-nil value.
If you happen to C-c/M-v so that the point changes its position, but if the
above is set to t and you reverse the scroll direction, you will find the
cursor at the exact same position where you last left it.
https://www.gnu.org/software/emacs/manual/html_node/emacs/Scrolling.html

(2) Use C-u C-SPC
When you do large vertical positions, emacs auto-saves the previous marks
to the mark-ring. It is very convenient to jump back to those older marks
by hitting C-u C-SPC.
https://www.gnu.org/software/emacs/manual/html_node/emacs/Mark-Ring.html

(3) Use winner-mode
This is a golden mode, used to conveniently jump back and forth window
configurations. The awesome thing is that you do not need to manually save
those configurations. All window configuration changes are auto-saved.
https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Convenience.html

(4) Create mini wrapper functions to scroll current/other window without
moving the cursor position. I have the below in my config.

;;; Scrolling
;; Keep point at its screen position if the scroll command moved it
vertically
;; out of the window, e.g. when scrolling by full screens using C-v.
(setq scroll-preserve-screen-position t)

;; Scroll without moving the point/cursor
(defun modi/scroll-up (ln)
  "Scroll up by LN lines without moving the point.
If LN is nil, defaults to 1 line."
  (interactive "p")
  (scroll-up ln))

(defun modi/scroll-down (ln)
  "Scroll down by LN lines without moving the point.
If LN is nil, defaults to 1 line."
  (interactive "p")
  (scroll-down ln))

(defun modi/scroll-other-window-up (ln)
  "Scroll other window up by LN lines without moving the point.
If LN is nil, defaults to 1 line."
  (interactive "p")
  (scroll-other-window ln))

(defun modi/scroll-other-window-down (ln)
  "Scroll other window down by LN lines without moving the point.
If LN is nil, defaults to 1 line."
  (interactive "p")
  (scroll-other-window (- ln)))

;; Below bindings are made in global map and not in my minor mode as I want
;; other modes to override those bindings.
(bind-keys
("<C-M-up>"    . modi/scroll-down)
("<C-M-down>"  . modi/scroll-up)
("<C-M-left>"  . modi/scroll-other-window-down)
("<C-M-right>" . modi/scroll-other-window-up))

On Wed, Aug 3, 2016, 5:32 AM Marcin Borkowski <mbork@mbork.pl> wrote:

> Hi all,
>
> sometimes I work on a particular place in some buffer, and Emacs for
> some reason scrolls me out of that place.  I want then to get back to
> it.  Is there a way (in stock Emacs or with help of M?elpa) to
> accomplish that?
>
> Bonus points for a package/command which /temporarily/ disables C-v/M-v
> and other commands that might result in scrolling text in the window.
> (Narrowing to what is currently visible should do the trick, so
> a combination of M-r, C-e and C-SPC would probably do what I want.
> Coding that is three minutes, but maybe someone did it already?)
>
> Note that it's not the same as keeping a position in a register.
> A simple experiment shows that keeping a /window configurations/ seems
> to do what I want, but from reading the manual I'm not sure what
> a "window configuration" really is.  What does a "window configuration"
> consist of, exactly?
>
> TIA,
>
> --
> Marcin Borkowski
> http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
> Faculty of Mathematics and Computer Science
> Adam Mickiewicz University
>
> --

Kaushal Modi


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: How to get back to a place in a buffer, or: what is a window configuration?
  2016-08-03  9:30 How to get back to a place in a buffer, or: what is a window configuration? Marcin Borkowski
  2016-08-03 11:25 ` Kaushal Modi
@ 2016-08-03 14:42 ` Drew Adams
  2016-08-03 18:42   ` Marcin Borkowski
  2016-08-03 21:47 ` Robert Thorpe
  2 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2016-08-03 14:42 UTC (permalink / raw)
  To: Marcin Borkowski, Help Gnu Emacs mailing list

> sometimes I work on a particular place in some buffer,

A place (position) in a buffer has little or nothing to do with
windows.

It sounds, from the rest of your question, like you are more
interested in restoring a window configuration.  But your
question is still unclear, to me.  Hopefully, Kaushal's answer
gives you what you want.

> and Emacs for some reason scrolls me out of that place.  I want
> then to get back to it.

Getting back to a buffer position is simple - you can use
temporary bookmarks or the mark ring or other methods.  But
I don't think that's really what you're asking.

> Is there a way (in stock Emacs or with help of M?elpa) to
> accomplish that?
> 
> Bonus points for a package/command which /temporarily/ disables C-v/M-v
> and other commands that might result in scrolling text in the window.

I don't see the connection between that and your request
(apparently) to restore a window config.  Is it that you really
(or additionally?) want to prevent moving `window-point'?
or perhaps prevent it from moving too far?  The underlying
question or use case is not clear to me.

> (Narrowing to what is currently visible should do the trick, so
> a combination of M-r, C-e and C-SPC would probably do what I want.
> Coding that is three minutes, but maybe someone did it already?)

If narrowing to what is currently shown in the window is
what you're looking for, then yes, you can easily code that.

(If you use library zones.el then you can easily flip among
multiple narrowings, in case that is related to what you want.
https://www.emacswiki.org/emacs/MultipleNarrowings)

> Note that it's not the same as keeping a position in a register.
> A simple experiment shows that keeping a /window configurations/ seems
> to do what I want,

`C-x r w' puts window-config in a register.  `C-x r j' restores it.

> but from reading the manual I'm not sure what
> a "window configuration" really is.  What does a "window
> configuration" consist of, exactly?

What part of (elisp) `Window Configurations' is unclear to you?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: How to get back to a place in a buffer, or: what is a window configuration?
  2016-08-03 11:25 ` Kaushal Modi
@ 2016-08-03 18:31   ` Marcin Borkowski
  0 siblings, 0 replies; 838+ messages in thread
From: Marcin Borkowski @ 2016-08-03 18:31 UTC (permalink / raw)
  To: Kaushal Modi; +Cc: Help Gnu Emacs mailing list


On 2016-08-03, at 13:25, Kaushal Modi <kaushal.modi@gmail.com> wrote:

> Here are a couple of things that might help you:
>
> (1) Setting scroll-preserve-screen-position to a non-nil value.
> If you happen to C-c/M-v so that the point changes its position, but if the
> above is set to t and you reverse the scroll direction, you will find the
> cursor at the exact same position where you last left it.
> https://www.gnu.org/software/emacs/manual/html_node/emacs/Scrolling.html

I know that, and I set scroll-preserve-screen-position to t in my
init.el a long time ago.  But thanks anyway, it is not very well known!

> (2) Use C-u C-SPC
> When you do large vertical positions, emacs auto-saves the previous marks
> to the mark-ring. It is very convenient to jump back to those older marks
> by hitting C-u C-SPC.
> https://www.gnu.org/software/emacs/manual/html_node/emacs/Mark-Ring.html

I know that, too, and I use it often.  But point position is not what
I'm asking for; I also want the point to get in the same place onthe
screen, IOW, I want to preserve the first visible line.

> (3) Use winner-mode
> This is a golden mode, used to conveniently jump back and forth window
> configurations. The awesome thing is that you do not need to manually save
> those configurations. All window configuration changes are auto-saved.
> https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Convenience.html

I've heard about it, now that you recommend it, I'll try it out some
day, probably sooner than later, thanks!

> (4) Create mini wrapper functions to scroll current/other window without
> moving the cursor position. I have the below in my config.

I also had such functions some time ago, I must have deleted them from
my config.  OTOH, C-v/M-v with prefix arg seem to do the same, so hey
seem a bit redundant to me.

> ;;; Scrolling
> ;; Keep point at its screen position if the scroll command moved it
> vertically
> ;; out of the window, e.g. when scrolling by full screens using C-v.
> (setq scroll-preserve-screen-position t)
>
> ;; Scroll without moving the point/cursor
> (defun modi/scroll-up (ln)
>   "Scroll up by LN lines without moving the point.
> If LN is nil, defaults to 1 line."
>   (interactive "p")
>   (scroll-up ln))
>
> (defun modi/scroll-down (ln)
>   "Scroll down by LN lines without moving the point.
> If LN is nil, defaults to 1 line."
>   (interactive "p")
>   (scroll-down ln))
>
> (defun modi/scroll-other-window-up (ln)
>   "Scroll other window up by LN lines without moving the point.
> If LN is nil, defaults to 1 line."
>   (interactive "p")
>   (scroll-other-window ln))
>
> (defun modi/scroll-other-window-down (ln)
>   "Scroll other window down by LN lines without moving the point.
> If LN is nil, defaults to 1 line."
>   (interactive "p")
>   (scroll-other-window (- ln)))
>
> ;; Below bindings are made in global map and not in my minor mode as I want
> ;; other modes to override those bindings.
> (bind-keys
> ("<C-M-up>"    . modi/scroll-down)
> ("<C-M-down>"  . modi/scroll-up)
> ("<C-M-left>"  . modi/scroll-other-window-down)
> ("<C-M-right>" . modi/scroll-other-window-up))

Thanks a lot!

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: How to get back to a place in a buffer, or: what is a window configuration?
  2016-08-03 14:42 ` Drew Adams
@ 2016-08-03 18:42   ` Marcin Borkowski
  2016-08-03 19:39     ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2016-08-03 18:42 UTC (permalink / raw)
  To: Drew Adams; +Cc: Help Gnu Emacs mailing list


On 2016-08-03, at 16:42, Drew Adams <drew.adams@oracle.com> wrote:

>> sometimes I work on a particular place in some buffer,
>
> A place (position) in a buffer has little or nothing to do with
> windows.

By "place", I meant two things: (1) where the point is and (2) what is
the first (topmost) actually displayed (visible) line.

> It sounds, from the rest of your question, like you are more
> interested in restoring a window configuration.  But your
> question is still unclear, to me.  Hopefully, Kaushal's answer
> gives you what you want.

More or less.  I'm now convinced that window configurations were what
I was looking for.

>> and Emacs for some reason scrolls me out of that place.  I want
>> then to get back to it.
>
> Getting back to a buffer position is simple - you can use
> temporary bookmarks or the mark ring or other methods.  But
> I don't think that's really what you're asking.

Right, it's not what I meant.

>> Is there a way (in stock Emacs or with help of M?elpa) to
>> accomplish that?
>> 
>> Bonus points for a package/command which /temporarily/ disables C-v/M-v
>> and other commands that might result in scrolling text in the window.
>
> I don't see the connection between that and your request
> (apparently) to restore a window config.  Is it that you really
> (or additionally?) want to prevent moving `window-point'?
> or perhaps prevent it from moving too far?  The underlying
> question or use case is not clear to me.

My goal (though probably not my words;-), sorry) is simple: I want the
"place" (in the sense of the above definition) to stay the same, /or/
I want to be able to easily restore it.  The former should be doable
with narrowing, the latter probably with window configurations.

>> (Narrowing to what is currently visible should do the trick, so
>> a combination of M-r, C-e and C-SPC would probably do what I want.
>> Coding that is three minutes, but maybe someone did it already?)
>
> If narrowing to what is currently shown in the window is
> what you're looking for, then yes, you can easily code that.
>
> (If you use library zones.el then you can easily flip among
> multiple narrowings, in case that is related to what you want.
> https://www.emacswiki.org/emacs/MultipleNarrowings)

I heard about it, though I don't really see much use (for me, not in
general).  OTOH, I use narrowing quite a lot, so maybe I could give it
a try.

>> Note that it's not the same as keeping a position in a register.
>> A simple experiment shows that keeping a /window configurations/ seems
>> to do what I want,
>
> `C-x r w' puts window-config in a register.  `C-x r j' restores it.

I learned about it today while rereading the manual.  Very useful
indeed!

>> but from reading the manual I'm not sure what
>> a "window configuration" really is.  What does a "window
>> configuration" consist of, exactly?
>
> What part of (elisp) `Window Configurations' is unclear to you?

Well, now I see it...

But look at this:

,----[ (emacs) Configuration Registers ]
| You can save the window configuration of the selected frame in a
| register, or even the configuration of all windows in all frames, and
| restore the configuration later.  *Note Windows::, for information about
| window configurations.
`----

,----[ (emacs) Window Convenience ]
| Winner mode is a global minor mode that records the changes in the
| window configuration (i.e., how the frames are partitioned into
| windows), so that you can undo them.
`----

See?  Basically nothing in the /Emacs manual/ explains precisely what
a "window configuration" is.  On the other hand, the /Elisp reference/
is pretty clear.  I'd consider this a bug in the docs: a /user/ should
not need to consult the Elisp reference.  I'll try to come up with
a patch for the docs soon.

Thanks,

-- 
Marcin Borkowski
http://octd.wmi.amu.edu.pl/en/Marcin_Borkowski
Faculty of Mathematics and Computer Science
Adam Mickiewicz University



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: How to get back to a place in a buffer, or: what is a window configuration?
  2016-08-03 18:42   ` Marcin Borkowski
@ 2016-08-03 19:39     ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2016-08-03 19:39 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: Help Gnu Emacs mailing list

> > (If you use library zones.el then you can easily flip among
> > multiple narrowings, in case that is related to what you want.
> > https://www.emacswiki.org/emacs/MultipleNarrowings)
> 
> I heard about it, though I don't really see much use (for me, not in
> general).  OTOH, I use narrowing quite a lot, so maybe I could give
> it a try.

If it doesn't help, don't use it. ;-) The idea is simple: Emacs
lets you narrow to different restrictions, but there is only one
level of widening: `widen'.  This is analogous to simple copy+paste
systems: you can copy different things at different times, but when
you paste you get just the last thing copied.

With this extension to narrowing: when you narrow, the restriction
is pushed to a ring - analogously to copying/killing text to the
`kill-ring'.  And just as you can yank anything that is on the
`kill-ring', so you can restore any restriction (narrowing) from
the ring.  (And you can have multiple rings, buffer-local or not.)

As for whether you will find that useful: it might depend on how
much you use narrowing.  And perhaps also on what you are used to
(habit).  People used to simple copy+paste might not find the
`kill-ring' very useful at first...

> > What part of (elisp) `Window Configurations' is unclear to you?
> 
> Well, now I see it...  But look at this:
> ,----[ (emacs) Configuration Registers ]
...
> ,----[ (emacs) Window Convenience ]
...
> See?  Basically nothing in the /Emacs manual/ explains precisely what
> a "window configuration" is.  On the other hand, the /Elisp reference/
> is pretty clear.  I'd consider this a bug in the docs: a /user/ should
> not need to consult the Elisp reference.  I'll try to come up with
> a patch for the docs soon.

What do you think a user should know about what a window config is?
That's the question, if you think the Emacs manual needs more info.
(`M-x report-emacs-bug').  (Note that there can also be links between
the manuals.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: How to get back to a place in a buffer, or: what is a window configuration?
  2016-08-03  9:30 How to get back to a place in a buffer, or: what is a window configuration? Marcin Borkowski
  2016-08-03 11:25 ` Kaushal Modi
  2016-08-03 14:42 ` Drew Adams
@ 2016-08-03 21:47 ` Robert Thorpe
  2016-08-03 22:06   ` Drew Adams
  2 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2016-08-03 21:47 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs

Marcin Borkowski <mbork@mbork.pl> writes:

> Hi all,
>
> sometimes I work on a particular place in some buffer, and Emacs for
> some reason scrolls me out of that place.

I used to have the problem.  I found it was caused by using
auto-revert-mode.  It was either applying auto-revert-mode to dired
buffers or applying it to buffer lists that caused the problem, I can't
remember which.  Try disabling those and see if it fixes it.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: How to get back to a place in a buffer, or: what is a window configuration?
  2016-08-03 21:47 ` Robert Thorpe
@ 2016-08-03 22:06   ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2016-08-03 22:06 UTC (permalink / raw)
  To: Robert Thorpe, Marcin Borkowski; +Cc: help-gnu-emacs

> > sometimes I work on a particular place in some buffer, and Emacs for
> > some reason scrolls me out of that place.
> 
> I used to have the problem.  I found it was caused by using
> auto-revert-mode.  It was either applying auto-revert-mode to dired
> buffers or applying it to buffer lists that caused the problem, I can't
> remember which.  Try disabling those and see if it fixes it.

Reverting a Dired buffer centers the line that was current, and puts
the cursor at the beginning of the file name on that line.  This happens
regardless of how you revert (using `g' or using `auto-rever-mode').

For buffer reverting, you have `after-revert-hook' (and `before...'),
which you could no doubt use to counteract any such window and point
movement.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* [PATCH] Fixing package-initialize, adding early init file
@ 2017-09-18 21:57 Radon Rosborough
  2017-09-19 12:30 ` Stefan Monnier
  2017-10-10 16:52 ` Robert Weiner
  0 siblings, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2017-09-18 21:57 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 904 bytes --]

Hello all,

Attached is a preliminary patch for fixing "the package-initialize
problem" (see [1] [2] [3]) by adding an early init file. Feedback
welcome. In particular,

- do we want to try to factor out some common logic in loading the
  early init file versus the regular init file?
- have I broken anything in moving the check for an invalid username
  earlier in startup.el? what about moving package-initialize earlier?
- should `early-init-file' be defined in C?
- did I miss any documentation fixes?
- have I broken any style guidelines for the repository?

Additional question: if we moved forward with this patch, would it
make it into Emacs 26.1?

Best,
Radon Rosborough

[1]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
[2]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
[3]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 24502 bytes --]

From dc8ff75037f90938f1d3eb9676f674aad868c2da Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Sep 2017 22:17:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* src/lread.c (Vearly_init_file): New variable, for the filename of
  the early init file that was loaded.

* lisp/startup.el: Load the early init file, if it is found. Move the
  check for an invalid username to just before that, and move the
  initialization of the package system to just after.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove. Burn
  with fire. Remove related code and documentation.

* doc/lispref/os.texi: Document early init file.

* doc/lispref/package.texi: Document changes to when
  package-initialize is called, and advise against calling it in the
  init file.

* doc/emacs/package.texi: Document changes to when package-initialize
  is called.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
  init file.

* etc/NEWS: Document changes to startup and package.el.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
---
 doc/emacs/package.texi     |  28 ++-----
 doc/lispref/os.texi        |  14 ++++
 doc/lispref/package.texi   |  16 +++-
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  18 ++++
 lisp/emacs-lisp/package.el |  71 +---------------
 lisp/startup.el            | 204 +++++++++++++++++++++++++++++++++------------
 src/lread.c                |   9 ++
 8 files changed, 212 insertions(+), 152 deletions(-)

diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 215f50cb40..bd7cccce6c 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -253,30 +253,16 @@ Package Installation
 consult the package's help buffer.
 
   By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+subsequent Emacs sessions.  This happens at startup, before processing
+the init file but after processing the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an
+exception, Emacs does not load packages at startup if invoked with the
+@samp{-q} or @samp{--no-init-file} options (@xref{Initial Options}).
 
 @vindex package-enable-at-startup
   To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
-
-@findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+@code{package-enable-at-startup} to @code{nil}.  You must do this in
+the early init file.  Currently it cannot be done via Customize.
 
 @vindex package-load-list
   For finer control over package loading, you can use the variable
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 441fda5d82..062aa28222 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -361,6 +361,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +385,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+  @dfn{early init file}, if it exists.  This is a file named
+  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
+  home directory.  The difference is that the early init file is
+  loaded much earlier during the startup process, so you can use it to
+  customize some things that are initialized before loading the
+  regular init file.  For example, here you can customize the process
+  of loading installed packages, by setting variables such as
+  @var{package-load-list} or
+  @var{package-enable-at-startup}. @xref{Package Installation,,,
+  emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 153ee48741..2e93f29bd2 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -106,10 +106,12 @@ Packaging Basics
 
   Whenever Emacs starts up, it automatically calls the function
 @code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+after loading the early init file, but before loading the early init
+file and abbrev file (if any) and before running
+@code{after-init-hook} (@pxref{Startup Summary}).  Automatic package
+loading is disabled if the user option
+@code{package-enable-at-startup} is @code{nil}.  (Of course, the
+setting of this user option must be done in the early init file.)
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
@@ -123,6 +125,12 @@ Packaging Basics
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
 loading them; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index ca57501f3d..c487d43a13 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -891,9 +891,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index 371cdf686c..80678551c7 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -28,6 +28,24 @@ When you add a new item, use the appropriate mark if you are sure it applies,
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called early-init.el, in `user-emacs-directory'.  It is
+loaded very early in the startup process: in particular, before
+graphical elements such as the tool bar are initialized, and before
+the package manager is initialized.
+
++++
+** Emacs now initializes package.el before loading the init-file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to (package-initialize) into the
+init-file, which was previously done when Emacs was started.  Users
+who do not configure package.el variables such as `package-load-list'
+and `package-user-dir' need not make any configuration changes.  Users
+who do configure such variables should place the configuration into
+the newly introduced early init file, which is loaded before
+package.el is initialized.
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 8b101c1323..305453a4ba 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1436,16 +1436,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1454,13 +1449,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1877,64 +1866,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 7cf6fee425..56f688e334 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -1021,6 +1021,156 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial (if (eq init-file-debug t)
+                                    'startup
+                                  init-file-debug))
+        (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
+    (let ((debug-on-error debug-on-error-initial)
+          (inner
+           (lambda ()
+             ;; If no username, don't load the init file.
+             (when init-file-user
+               (let ((early-init-file-1
+                      (expand-file-name
+                       "early-init"
+                       (file-name-as-directory
+                        (concat "~" init-file-user "/.emacs.d")))))
+                 ;; Setting `user-init-file' to t tells `load' to
+                 ;; store the name of the file that was loaded, if
+                 ;; possible, into `user-init-file'. We're not using
+                 ;; `user-init-file' yet, so we can re-use it here for
+                 ;; the early init file.
+                 (setq user-init-file t)
+
+                 ;; Attempt to load the early init file. If it doesn't
+                 ;; exist, do nothing.
+                 (load early-init-file-1 t t)
+
+                 ;; If the init file could be loaded, move its
+                 ;; discovered filename from `user-init-file' into
+                 ;; `early-init-file', where it belongs.
+                 (unless (eq user-init-file t)
+                   (setq early-init-file user-init-file)
+                   (when (and early-init-file
+                              (equal (file-name-extension early-init-file)
+                                     "elc"))
+                     (let* ((source (file-name-sans-extension early-init-file))
+                            (alt (concat source ".el")))
+                       (setq source (cond ((file-exists-p alt) alt)
+                                          ((file-exists-p source) source)
+                                          (t nil)))
+                       (when source
+                         (when (file-newer-than-file-p source early-init-file)
+                           (message "Warning: %s is newer than %s"
+                                    source early-init-file)
+                           (sit-for 1))
+                         (setq early-init-file source))))))))))
+      (if init-file-debug
+          (funcall inner)
+        (condition-case error
+            (progn
+              (funcall inner)
+              (setq init-file-had-error nil))
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            ;; Use `user-init-file' here because if
+                            ;; there was an error while loading the
+                            ;; init file, then `early-init-file' may
+                            ;; not have been reassigned; but
+                            ;; `user-init-file' will still be set by
+                            ;; `load'.
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+    (if debug-on-error-should-be-set
+	  (setq debug-on-error debug-on-error-from-init-file))
+      (unless (or (default-value 'enable-multibyte-characters)
+		  (eq orig-enable-multibyte (default-value
+					      'enable-multibyte-characters)))
+	;; Init file changed to unibyte.  Reset existing multibyte
+	;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
+	;; Arguably this should only be done if they're free of
+	;; multibyte characters.
+	(mapc (lambda (buffer)
+		(with-current-buffer buffer
+		  (if enable-multibyte-characters
+		      (set-buffer-multibyte nil))))
+	      (buffer-list))
+	;; Also re-set the language environment in case it was
+	;; originally done before unibyte was set and is sensitive to
+	;; unibyte (display table, terminal coding system &c).
+	(set-language-environment current-language-environment)))
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1127,33 +1277,6 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
     (let (debug-on-error-from-init-file
 	  debug-on-error-should-be-set
@@ -1312,33 +1435,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
diff --git a/src/lread.c b/src/lread.c
index 6bc93b1481..b4823956e7 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4910,6 +4910,15 @@ While Emacs loads and evaluates the init file, value is the real name
 of the file, regardless of whether or not it has the `.elc' extension.  */);
   Vuser_init_file = Qnil;
 
+  DEFVAR_LISP ("early-init-file", Vearly_init_file,
+               doc: /* File name, including directory, of user's early init file.
+If the file loaded had extension `.elc', and the corresponding source file
+exists, this variable contains the name of source file, suitable for use
+by functions like `custom-save-all' which edit the init file.
+While Emacs loads and evaluates the init file, value is the real name
+of the file, regardless of whether or not it has the `.elc' extension.  */);
+  Vearly_init_file = Qnil;
+
   DEFVAR_LISP ("current-load-list", Vcurrent_load_list,
 	       doc: /* Used for internal purposes by `load'.  */);
   Vcurrent_load_list = Qnil;
-- 
2.13.3


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-18 21:57 [PATCH] Fixing package-initialize, adding early init file Radon Rosborough
@ 2017-09-19 12:30 ` Stefan Monnier
  2017-09-25 16:27   ` Radon Rosborough
  2017-10-10 16:52 ` Robert Weiner
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2017-09-19 12:30 UTC (permalink / raw)
  To: emacs-devel

> Attached is a preliminary patch for fixing "the package-initialize
> problem" (see [1] [2] [3]) by adding an early init file. Feedback
> welcome. In particular,

Thanks, comments below.

>  ;;;###autoload
>  (defun package-initialize (&optional no-activate)
[...]
> +  (setq package-enable-at-startup nil)

BTW, in a subsequent patch we could rename this to package-initialized,
so the name reflects what the variable contains rather than what it's
used for.

> +  DEFVAR_LISP ("early-init-file", Vearly_init_file,
> +               doc: /* File name, including directory, of user's early init file.
> +If the file loaded had extension `.elc', and the corresponding source file
> +exists, this variable contains the name of source file, suitable for use
> +by functions like `custom-save-all' which edit the init file.
> +While Emacs loads and evaluates the init file, value is the real name
> +of the file, regardless of whether or not it has the `.elc' extension.  */);
> +  Vearly_init_file = Qnil;

This is not used from C code, so make it a plain old defvar in startup.el.

I haven't yet looked at the startup.el part, sorry.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-19 12:30 ` Stefan Monnier
@ 2017-09-25 16:27   ` Radon Rosborough
  2017-09-25 16:54     ` John Wiegley
                       ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Radon Rosborough @ 2017-09-25 16:27 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 534 bytes --]

> BTW, in a subsequent patch we could rename this to
> package-initialized, so the name reflects what the variable contains
> rather than what it's used for.

I don't think that's a good idea, since the most common usage of this
variable will be

    (setq package-initialized nil)

in the early init file, and that doesn't make much sense from a
readability perspective (are we asserting that package.el wasn't
initialized?).

> This is not used from C code, so make it a plain old defvar in
> startup.el.

Done. New patch attached.

[-- Attachment #1.2: Type: text/html, Size: 810 bytes --]

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 24190 bytes --]

From 9d2e25b8c7c0f11fc8e5fb46047701d43e69af6f Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Sep 2017 22:17:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* lisp/startup.el: New variable `early-init-file', for the filename of
  the early init file that was loaded.  Load the early init file, if
  it is found.  Move the check for an invalid username to just before
  that, and move the initialization of the package system to just
  after.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove. Burn
  with fire. Remove related code and documentation.

* doc/lispref/os.texi: Document early init file.

* doc/lispref/package.texi: Document changes to when
  package-initialize is called, and advise against calling it in the
  init file.

* doc/emacs/package.texi: Document changes to when package-initialize
  is called.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
  init file.

* etc/NEWS: Document changes to startup and package.el.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
---
 doc/emacs/package.texi     |  28 ++----
 doc/lispref/os.texi        |  14 +++
 doc/lispref/package.texi   |  16 +++-
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  18 ++++
 lisp/emacs-lisp/package.el |  71 +--------------
 lisp/startup.el            | 213 +++++++++++++++++++++++++++++++++------------
 7 files changed, 212 insertions(+), 152 deletions(-)

diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 215f50cb40..bd7cccce6c 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -253,30 +253,16 @@ Package Installation
 consult the package's help buffer.
 
   By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+subsequent Emacs sessions.  This happens at startup, before processing
+the init file but after processing the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an
+exception, Emacs does not load packages at startup if invoked with the
+@samp{-q} or @samp{--no-init-file} options (@xref{Initial Options}).
 
 @vindex package-enable-at-startup
   To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
-
-@findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+@code{package-enable-at-startup} to @code{nil}.  You must do this in
+the early init file.  Currently it cannot be done via Customize.
 
 @vindex package-load-list
   For finer control over package loading, you can use the variable
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 441fda5d82..062aa28222 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -361,6 +361,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +385,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+  @dfn{early init file}, if it exists.  This is a file named
+  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
+  home directory.  The difference is that the early init file is
+  loaded much earlier during the startup process, so you can use it to
+  customize some things that are initialized before loading the
+  regular init file.  For example, here you can customize the process
+  of loading installed packages, by setting variables such as
+  @var{package-load-list} or
+  @var{package-enable-at-startup}. @xref{Package Installation,,,
+  emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 153ee48741..2e93f29bd2 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -106,10 +106,12 @@ Packaging Basics
 
   Whenever Emacs starts up, it automatically calls the function
 @code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+after loading the early init file, but before loading the early init
+file and abbrev file (if any) and before running
+@code{after-init-hook} (@pxref{Startup Summary}).  Automatic package
+loading is disabled if the user option
+@code{package-enable-at-startup} is @code{nil}.  (Of course, the
+setting of this user option must be done in the early init file.)
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
@@ -123,6 +125,12 @@ Packaging Basics
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
 loading them; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index ca57501f3d..c487d43a13 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -891,9 +891,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index 371cdf686c..80678551c7 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -28,6 +28,24 @@ When you add a new item, use the appropriate mark if you are sure it applies,
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called early-init.el, in `user-emacs-directory'.  It is
+loaded very early in the startup process: in particular, before
+graphical elements such as the tool bar are initialized, and before
+the package manager is initialized.
+
++++
+** Emacs now initializes package.el before loading the init-file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to (package-initialize) into the
+init-file, which was previously done when Emacs was started.  Users
+who do not configure package.el variables such as `package-load-list'
+and `package-user-dir' need not make any configuration changes.  Users
+who do configure such variables should place the configuration into
+the newly introduced early init file, which is loaded before
+package.el is initialized.
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 8b101c1323..305453a4ba 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1436,16 +1436,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1454,13 +1449,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1877,64 +1866,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 7cf6fee425..52fd1f9cf5 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -312,6 +312,15 @@ inhibit-startup-hooks
 Currently this applies to: `emacs-startup-hook', `term-setup-hook',
 and `window-setup-hook'.")
 
+(defvar early-init-file nil
+  "File name, including directory, of user's early init file.
+If the file loaded had extension `.elc', and the corresponding
+source file exists, this variable contains the name of source
+file, suitable for use by functions like `custom-save-all' which
+edit the init file.  While Emacs loads and evaluates the init
+file, value is the real name of the file, regardless of whether
+or not it has the `.elc' extension.")
+
 (defvar keyboard-type nil
   "The brand of keyboard you are using.
 This variable is used to define the proper function and keypad
@@ -1021,6 +1030,156 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial (if (eq init-file-debug t)
+                                    'startup
+                                  init-file-debug))
+        (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
+    (let ((debug-on-error debug-on-error-initial)
+          (inner
+           (lambda ()
+             ;; If no username, don't load the init file.
+             (when init-file-user
+               (let ((early-init-file-1
+                      (expand-file-name
+                       "early-init"
+                       (file-name-as-directory
+                        (concat "~" init-file-user "/.emacs.d")))))
+                 ;; Setting `user-init-file' to t tells `load' to
+                 ;; store the name of the file that was loaded, if
+                 ;; possible, into `user-init-file'. We're not using
+                 ;; `user-init-file' yet, so we can re-use it here for
+                 ;; the early init file.
+                 (setq user-init-file t)
+
+                 ;; Attempt to load the early init file. If it doesn't
+                 ;; exist, do nothing.
+                 (load early-init-file-1 t t)
+
+                 ;; If the init file could be loaded, move its
+                 ;; discovered filename from `user-init-file' into
+                 ;; `early-init-file', where it belongs.
+                 (unless (eq user-init-file t)
+                   (setq early-init-file user-init-file)
+                   (when (and early-init-file
+                              (equal (file-name-extension early-init-file)
+                                     "elc"))
+                     (let* ((source (file-name-sans-extension early-init-file))
+                            (alt (concat source ".el")))
+                       (setq source (cond ((file-exists-p alt) alt)
+                                          ((file-exists-p source) source)
+                                          (t nil)))
+                       (when source
+                         (when (file-newer-than-file-p source early-init-file)
+                           (message "Warning: %s is newer than %s"
+                                    source early-init-file)
+                           (sit-for 1))
+                         (setq early-init-file source))))))))))
+      (if init-file-debug
+          (funcall inner)
+        (condition-case error
+            (progn
+              (funcall inner)
+              (setq init-file-had-error nil))
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            ;; Use `user-init-file' here because if
+                            ;; there was an error while loading the
+                            ;; init file, then `early-init-file' may
+                            ;; not have been reassigned; but
+                            ;; `user-init-file' will still be set by
+                            ;; `load'.
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+    (if debug-on-error-should-be-set
+	  (setq debug-on-error debug-on-error-from-init-file))
+      (unless (or (default-value 'enable-multibyte-characters)
+		  (eq orig-enable-multibyte (default-value
+					      'enable-multibyte-characters)))
+	;; Init file changed to unibyte.  Reset existing multibyte
+	;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
+	;; Arguably this should only be done if they're free of
+	;; multibyte characters.
+	(mapc (lambda (buffer)
+		(with-current-buffer buffer
+		  (if enable-multibyte-characters
+		      (set-buffer-multibyte nil))))
+	      (buffer-list))
+	;; Also re-set the language environment in case it was
+	;; originally done before unibyte was set and is sensitive to
+	;; unibyte (display table, terminal coding system &c).
+	(set-language-environment current-language-environment)))
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1127,33 +1286,6 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
     (let (debug-on-error-from-init-file
 	  debug-on-error-should-be-set
@@ -1312,33 +1444,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
-- 
2.14.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 16:27   ` Radon Rosborough
@ 2017-09-25 16:54     ` John Wiegley
  2017-09-25 19:38       ` Radon Rosborough
  2017-09-25 16:58     ` Stefan Monnier
  2017-10-09 23:17     ` Radon Rosborough
  2 siblings, 1 reply; 838+ messages in thread
From: John Wiegley @ 2017-09-25 16:54 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: Stefan Monnier, emacs-devel

>>>>> "RR" == Radon Rosborough <radon.neon@gmail.com> writes:

RR> Done. New patch attached.

This seems like a lot of changes that add new complications to the startup of
Emacs. Since I don't have time just now to review those 150 messages, may I
please ask for an executive summary to motivate this change?

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 16:27   ` Radon Rosborough
  2017-09-25 16:54     ` John Wiegley
@ 2017-09-25 16:58     ` Stefan Monnier
  2017-09-25 19:40       ` Radon Rosborough
  2017-10-09 23:17     ` Radon Rosborough
  2 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2017-09-25 16:58 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: emacs-devel

>> BTW, in a subsequent patch we could rename this to
>> package-initialized, so the name reflects what the variable contains
>> rather than what it's used for.
> I don't think that's a good idea, since the most common usage of this
> variable will be
>     (setq package-initialized nil)
> in the early init file, and that doesn't make much sense from a
> readability perspective (are we asserting that package.el wasn't
> initialized?).

Why would there be (setq package-initialized nil) in the early init file?
I could imagine there being

    (setq package-initialized t)

OTOH, to inhibit subsequent initialization of package.el.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 16:54     ` John Wiegley
@ 2017-09-25 19:38       ` Radon Rosborough
  2017-09-25 21:23         ` Mark Oteiza
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-09-25 19:38 UTC (permalink / raw)
  To: jwiegley; +Cc: Stefan Monnier, emacs-devel

> This seems like a lot of changes that add new complications to the
> startup of Emacs. Since I don't have time just now to review those
> 150 messages, may I please ask for an executive summary to motivate
> this change?

You could read [1] for an explanation of what the problem is, and [2]
for a list of the different ways people have proposed to solve it. But
I will summarize again:

* Currently, Emacs modifies the init-file to add (package-initialize)
  to it when Emacs starts. This has many disadvantages [1] which I'm
  not going to rehash here.
* There are many proposals [2] on how to make package.el work out of
  the box without requiring Emacs to modify the init-file. These all
  have practical disadvantages, except for the proposal to add an
  early init file, which solves the package.el problem with
  essentially no disadvantages, and furthermore solves several other
  problems at the same time (for example, people having no way to
  disable the menu bar before it is initialized the first time).

You can disagree with the above two points, but they were the outcome
of the aforementioned 150 emails, and everybody seems to agree that
this is the best approach. The only difficulty is actually making the
relevant changes to startup.el, which are honestly pretty small in the
grand scheme of things.

> new complications

The only new code is to load an additional init-file. It's definitely
a new complication, but I don't think it's that bad. The other changes
to startup.el are to add a new variable, and move the
(package-initialize) call and the check for an invalid user name to a
bit earlier. Sure, we need to test it thoroughly, but it's certainly
not *complicated*.

[1]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
[2]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 16:58     ` Stefan Monnier
@ 2017-09-25 19:40       ` Radon Rosborough
  0 siblings, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2017-09-25 19:40 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> Why would there be (setq package-initialized nil) in the early init file?
> I could imagine there being
>
>     (setq package-initialized t)
>
> OTOH, to inhibit subsequent initialization of package.el.

Whoops, that was indeed what I meant to say. But I still argue that
the readability is hurt, because (setq package-initialized t) is
basically a lie: you're saying that package.el was initialized
already, when in fact the purpose is quite possibly to ensure that
package.el is *never* initialized.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 19:38       ` Radon Rosborough
@ 2017-09-25 21:23         ` Mark Oteiza
  2017-09-25 22:16           ` Radon Rosborough
  0 siblings, 1 reply; 838+ messages in thread
From: Mark Oteiza @ 2017-09-25 21:23 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: jwiegley, Stefan Monnier, emacs-devel


Radon Rosborough <radon.neon@gmail.com> writes:

>> This seems like a lot of changes that add new complications to the
>> startup of Emacs. Since I don't have time just now to review those
>> 150 messages, may I please ask for an executive summary to motivate
>> this change?
>
> You could read [1] for an explanation of what the problem is, and [2]
> for a list of the different ways people have proposed to solve it. But
> I will summarize again:
>
> * Currently, Emacs modifies the init-file to add (package-initialize)
>   to it when Emacs starts. This has many disadvantages [1] which I'm
>   not going to rehash here.
> * There are many proposals [2] on how to make package.el work out of
>   the box without requiring Emacs to modify the init-file. These all
>   have practical disadvantages, except for the proposal to add an
>   early init file, which solves the package.el problem

I haven't seen one place where the problem_s_ involved have
been clearly articulated, and still this patch does not improve any of
the places where user facing documentation was lacking in the first
place, and still requires the user to not only understand the forms that
must be in an init file, but now there is one more init file for the
user to manage.

The whole discussion and push for a "solution" is predicated on users
who can't be bothered to do things correctly _not_ having to do any
configuration.  This patch does not improve things in this regard, and
frankly I don't see that predicate as a good one for devising a
solution. At least it explains how we ended up with
package--ensure-init-file.

> with
>   essentially no disadvantages, and furthermore solves several other
>   problems at the same time (for example, people having no way to
>   disable the menu bar before it is initialized the first time).
>
> You can disagree with the above two points, but they were the outcome
> of the aforementioned 150 emails, and everybody seems to agree that
> this is the best approach. The only difficulty is actually making the
> relevant changes to startup.el, which are honestly pretty small in the
> grand scheme of things.

I suppose it's time I pipe up and indicate I vehemently oppose this
change.  AIUI it still breaks existing config of package-archives,
package-load-list, etc, which is something the incumbent solution also
breaks.  The only proposal I can support at this time is reverting the
incumbent solution, yet none from the maintainership is willing to
entertain the idea.

>> new complications
>
> The only new code is to load an additional init-file. It's definitely
> a new complication, but I don't think it's that bad.

I think adding another init file is unacceptable.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 21:23         ` Mark Oteiza
@ 2017-09-25 22:16           ` Radon Rosborough
  2017-09-25 23:15             ` Mark Oteiza
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-09-25 22:16 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: jwiegley, Stefan Monnier, emacs-devel

> I haven't seen one place where the problem_s_ involved have been
> clearly articulated

As for the problems with the current situation, check out [1] and also
the section for Proposal A in [2]. But again, I'll re-summarize:

* Emacs modifies the init-file automatically, without asking the user.
* If the user has set any variables related to package.el in their
  init-file, then Emacs will modify the init-file to do the wrong
  thing!

Unless by "problems involved" you meant more generally, for all the
different proposals? That is exactly what [2] was intended to cover;
could you clarify what exactly you would like articulated that hasn't
been already?

> this patch does not improve any of the places where user facing
> documentation was lacking in the first place

Actually, I'd disagree. I think this patch improves the situation, not
by adding more documentation, but by reducing complexity and therefore
reducing the need for additional documentation.

In particular, we no longer need to document the placement of
(package-initialize) in the init-file, as such placement is no longer
necessary.

> requires the user to not only understand the forms that must be in
> an init file

Could you clarify what you mean by this? This patch has the effect
that users can put package configuration right into their init-file,
or use Custom to achieve the same, without having to know anything
about the package system.

If on the other hand "forms" is referring to 'setq' forms that
customize the package system itself, then indeed, users must know to
put them into a different init-file. However, I'd argue that this
isn't much worse than the current situation, where users must know to
put them *before* (package-initialize), and they must also know that
Emacs will put (package-initialize) in the wrong place with regard to
these customizations.

> The whole discussion and push for a "solution" is predicated on
> users who can't be bothered to do things correctly _not_ having to
> do any configuration. This patch does not improve things in this
> regard

Correct. The current behavior is that things work out of the box, and
this patch *maintains* that behavior. Since things already work out of
the box, I don't see how you expect this patch to somehow improve that
particular aspect any further.

What this patch accomplishes is eliminating the problems inherent in
automatic modification of the init-file, *without* losing the goal of
the package system working out of the box.

> The whole discussion and push for a "solution" is predicated on
> users who can't be bothered to do things correctly _not_ having to
> do any configuration [...] and frankly I don't see that predicate as
> a good one for devising a solution.

The goal is that when someone uses M-x package-install to install a
package, and then they paste some Lisp code from the project's README
into their init-file, then it works as expected. I think this is
desirable behavior, and I think most everyone else thinks this is
desirable behavior as well. That's why the current solution was put in
in the first place, because people really wanted that use case to
"just work". This patch achieves that same goal in a better way.

> AIUI it still breaks existing config of package-archives,
> package-load-list, etc, which is something the incumbent solution
> also breaks.

Correct, but here is the important point: it will only do so *once*,
when people upgrade to Emacs 26. As opposed to the current solution,
which breaks existing config every time (package-initialize) is
inserted, which may happen many times for a given user. So this patch
is a definite improvement.

> The only proposal I can support at this time is reverting the
> incumbent solution, yet none from the maintainership is willing to
> entertain the idea.

That's because it would result in the built-in package manager not
working out of the box, which would be embarrassing from a UX
perspective. That's the whole *point* of having a built-in package
manager: that it works right away without additional setup.

> I think adding another init file is unacceptable.

Why? (Especially given that being able to run code before the first
graphical frame is initialized would be super useful for lots of
reasons, entirely separate from the package system.)

[1]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
[2]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 22:16           ` Radon Rosborough
@ 2017-09-25 23:15             ` Mark Oteiza
  2017-09-26  3:00               ` Radon Rosborough
  2017-09-29 10:22               ` Eli Zaretskii
  0 siblings, 2 replies; 838+ messages in thread
From: Mark Oteiza @ 2017-09-25 23:15 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: jwiegley, Stefan Monnier, emacs-devel

On 25/09/17 at 10:16pm, Radon Rosborough wrote:
> > I haven't seen one place where the problem_s_ involved have been
> > clearly articulated
> 
> Unless by "problems involved" you meant more generally, for all the
> different proposals? That is exactly what [2] was intended to cover;
> could you clarify what exactly you would like articulated that hasn't
> been already?

I meant more explicitly--each of these use cases should be documented
with examples.  While the manual in its current state does explain
things, it can be better.

> > this patch does not improve any of the places where user facing
> > documentation was lacking in the first place
> 
> Actually, I'd disagree. I think this patch improves the situation, not
> by adding more documentation, but by reducing complexity and therefore
> reducing the need for additional documentation.
> 
> In particular, we no longer need to document the placement of
> (package-initialize) in the init-file, as such placement is no longer
> necessary.

The only documentation I see is in NEWS and the manual, which is where
the old documentation was.

> > requires the user to not only understand the forms that must be in
> > an init file
> 
> Could you clarify what you mean by this? This patch has the effect
> that users can put package configuration right into their init-file,
> or use Custom to achieve the same, without having to know anything
> about the package system.

At the cost of users who customize package.el and don't need another
init file.

> If on the other hand "forms" is referring to 'setq' forms that
> customize the package system itself, then indeed, users must know to
> put them into a different init-file. However, I'd argue that this
> isn't much worse than the current situation, where users must know to
> put them *before* (package-initialize) 

The current situation should never have happened.

> > The whole discussion and push for a "solution" is predicated on
> > users who can't be bothered to do things correctly _not_ having to
> > do any configuration. This patch does not improve things in this
> > regard
> 
> Correct. The current behavior is that things work out of the box

Except for users who who don't need garbage dumped into their init file
and for users who change their package archives or the list of activated
packages in their init.el without the need of a package-initialize form
because they read the docs.

Apparently changing those custom variables is an edge case.
https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00209.html

> and
> this patch *maintains* that behavior.

which is why it gets a -1 from me.

> > AIUI it still breaks existing config of package-archives,
> > package-load-list, etc, which is something the incumbent solution
> > also breaks.
> 
> Correct, but here is the important point: it will only do so *once*,
> when people upgrade to Emacs 26. As opposed to the current solution,
> which breaks existing config every time (package-initialize) is
> inserted, which may happen many times for a given user. So this patch
> is a definite improvement.

An improvement from package--ensure-init-file is great, but that's still
more breakage than prior to package--ensure-init-file.

> > The only proposal I can support at this time is reverting the
> > incumbent solution, yet none from the maintainership is willing to
> > entertain the idea.
> 
> That's because it would result in the built-in package manager not
> working out of the box, which would be embarrassing from a UX
> perspective. That's the whole *point* of having a built-in package
> manager: that it works right away without additional setup.

Emacs itself doesn't work OOTB for most people.  That it's customizable
in Elisp is a feature.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 23:15             ` Mark Oteiza
@ 2017-09-26  3:00               ` Radon Rosborough
  2017-09-29 10:22               ` Eli Zaretskii
  1 sibling, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2017-09-26  3:00 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: John Wiegley, Stefan Monnier, emacs-devel

> > > I haven't seen one place where the problem_s_ involved have been
> > > clearly articulated
> >
> > Unless by "problems involved" you meant more generally, for all the
> > different proposals? That is exactly what [2] was intended to cover;
> > could you clarify what exactly you would like articulated that hasn't
> > been already?
>
> I meant more explicitly--each of these use cases should be documented
> with examples.  While the manual in its current state does explain
> things, it can be better.

So you're complaining about the documentation? Fine, agreed. The
documentation can/should be improved. That is totally orthogonal to
this patch, though.

> > > this patch does not improve any of the places where user facing
> > > documentation was lacking in the first place
> >
> > Actually, I'd disagree. I think this patch improves the situation, not
> > by adding more documentation, but by reducing complexity and therefore
> > reducing the need for additional documentation.
> >
> > In particular, we no longer need to document the placement of
> > (package-initialize) in the init-file, as such placement is no longer
> > necessary.
>
> The only documentation I see is in NEWS and the manual, which is where
> the old documentation was.

So, again, you're complaining about the documentation? Again, fine,
agreed. But I don't think that's a reason to criticize this patch.
More documentation can be added in future patches; let's not confuse
matters by combining this change with general doc improvements.

> > > requires the user to not only understand the forms that must be in
> > > an init file
> >
> > Could you clarify what you mean by this? This patch has the effect
> > that users can put package configuration right into their init-file,
> > or use Custom to achieve the same, without having to know anything
> > about the package system.
>
> At the cost of users who customize package.el and don't need another
> init file.

Right, so we benefit the 100% (people who customize packages) at the
cost of the 0.1% (people who need to customize package.el in the early
init-file). A win-win, no?

And it's still not clear to me why you think having an early init-file
is such a big problem.

> package archives

If I understand correctly, package-archives need not be set before
package-initialize is called. Thus the number of people who would need
to use the early init-file is quite small indeed.

> > and this patch *maintains* that behavior.
>
> which is why it gets a -1 from me.

The behavior I was referring to was "the built-in package manager
works out of the box". Are you really saying that having the built-in
package manager work out of the box is a bad thing?

> An improvement from package--ensure-init-file is great, but that's still
> more breakage than prior to package--ensure-init-file.

Prior to package--ensure-init-file, when people pasted Lisp code from
their packages' READMEs into their init-file, they would get errors.
This was a very common problem for people new to Emacs, see [1]. That
affects everyone, so it should be considered "major breakage".

> Emacs itself doesn't work OOTB for most people.

I think we all agree that this is a bad thing. Shouldn't we be trying
to remedy this problem?

> That it's customizable in Elisp is a feature.

Yeah, but having sane defaults gets more and more important the more
powerful your tool gets.

[1]: https://lists.gnu.org/archive/html/emacs-devel/2015-03/msg01016.html



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 23:15             ` Mark Oteiza
  2017-09-26  3:00               ` Radon Rosborough
@ 2017-09-29 10:22               ` Eli Zaretskii
  1 sibling, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2017-09-29 10:22 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: jwiegley, radon.neon, monnier, emacs-devel

> Date: Mon, 25 Sep 2017 19:15:03 -0400
> From: Mark Oteiza <mvoteiza@udel.edu>
> Cc: jwiegley@gmail.com, Stefan Monnier <monnier@iro.umontreal.ca>,
> 	emacs-devel@gnu.org
> 
> On 25/09/17 at 10:16pm, Radon Rosborough wrote:
> > > I haven't seen one place where the problem_s_ involved have been
> > > clearly articulated
> > 
> > Unless by "problems involved" you meant more generally, for all the
> > different proposals? That is exactly what [2] was intended to cover;
> > could you clarify what exactly you would like articulated that hasn't
> > been already?
> 
> I meant more explicitly--each of these use cases should be documented
> with examples.  While the manual in its current state does explain
> things, it can be better.

It definitely can, but that's a separate issue, I think.  And we
cannot finalize the documentation before we finalize the code.

> > Could you clarify what you mean by this? This patch has the effect
> > that users can put package configuration right into their init-file,
> > or use Custom to achieve the same, without having to know anything
> > about the package system.
> 
> At the cost of users who customize package.el and don't need another
> init file.

Do those users have a "fire escape"?  If they don't, I agree we should
provide one.  Otherwise, I expect such users to be knowledgeable
enough to work around these changes with minimal hassle.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-25 16:27   ` Radon Rosborough
  2017-09-25 16:54     ` John Wiegley
  2017-09-25 16:58     ` Stefan Monnier
@ 2017-10-09 23:17     ` Radon Rosborough
  2 siblings, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2017-10-09 23:17 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

I noticed that discussion seems to have died off on the
package-initialize patch. Is there anything I can do to
help it along?

> Attached is a preliminary patch for fixing "the package-initialize
> problem" (see [1] [2] [3]) by adding an early init file. Feedback
> welcome. In particular,
>
> - do we want to try to factor out some common logic in loading the
>   early init file versus the regular init file?
> - have I broken anything in moving the check for an invalid username
>   earlier in startup.el? what about moving package-initialize earlier?
> - should `early-init-file' be defined in C?
> - did I miss any documentation fixes?
> - have I broken any style guidelines for the repository?
>
> Additional question: if we moved forward with this patch, would it
> make it into Emacs 26.1?
>
> Best,
> Radon Rosborough
>
> [1]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
> [2]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
> [3]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-09-18 21:57 [PATCH] Fixing package-initialize, adding early init file Radon Rosborough
  2017-09-19 12:30 ` Stefan Monnier
@ 2017-10-10 16:52 ` Robert Weiner
  2017-10-10 16:59   ` Eli Zaretskii
  2017-10-10 19:03   ` Radon Rosborough
  1 sibling, 2 replies; 838+ messages in thread
From: Robert Weiner @ 2017-10-10 16:52 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 717 bytes --]

On Mon, Sep 18, 2017 at 5:57 PM, Radon Rosborough <radon.neon@gmail.com>
wrote:

> Hello all,
>
> Attached is a preliminary patch for fixing "the package-initialize
> problem" (see [1] [2] [3]) by adding an early init file.
>

​My thoughts are:

1. For most Emacs users who do not program in Elisp, there should be only a
single init file that they would personalize, generally as they find
snippets of code they can cut and paste for their use.​

2. For Elispers, another optional init file for more fine-grained control
would be okay, though not ideal.

But this means whatever problem exists with package-initialize, it should
be solved without requiring the use of a 2nd init file.

Bob

[-- Attachment #2: Type: text/html, Size: 1972 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-10 16:52 ` Robert Weiner
@ 2017-10-10 16:59   ` Eli Zaretskii
  2017-10-14 21:30     ` Mark Oteiza
  2017-10-10 19:03   ` Radon Rosborough
  1 sibling, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2017-10-10 16:59 UTC (permalink / raw)
  To: rswgnu; +Cc: radon.neon, emacs-devel

> From: Robert Weiner <rsw@gnu.org>
> Date: Tue, 10 Oct 2017 12:52:32 -0400
> Cc: emacs-devel <emacs-devel@gnu.org>
> 
> 1. For most Emacs users who do not program in Elisp, there should be only a single init file that they would
> personalize, generally as they find snippets of code they can cut and paste for their use.​
> 
> 2. For Elispers, another optional init file for more fine-grained control would be okay, though not ideal.

I think the proposed solution satisfies these requirements.  The 2nd
init file is only needed if you want to tweak package initialization
by putting Lisp code into that 2nd file.

> But this means whatever problem exists with package-initialize, it should be solved without requiring the use
> of a 2nd init file.

I don't understand how you reach this conclusion.  The problems we are
trying to solve exists only for those whom you call "Lispers", so
another init file is only needed in that case.  What am I missing?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-10 16:52 ` Robert Weiner
  2017-10-10 16:59   ` Eli Zaretskii
@ 2017-10-10 19:03   ` Radon Rosborough
  2017-10-10 19:31     ` Robert Weiner
  1 sibling, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-10-10 19:03 UTC (permalink / raw)
  To: rswgnu; +Cc: emacs-devel

> 1. For most Emacs users who do not program in Elisp, there should be
>    only a single init file that they would personalize, generally as
>    they find snippets of code they can cut and paste for their use.

The entire reason these solutions are being proposed is because we
want to avoid the situation where people cut and paste snippets into
their init file, and they fail to work, which is what used to happen.
See [1].

And, as Eli already pointed out, for most Emacs users there *is* only
a single init file. It's only if you want to do advanced programming
that you need to use the second one, which need not exist at all.

> it should be solved without requiring the use of a 2nd init file.

Many, many possible solutions have already been discussed and
dismissed; see [2]. It's nice to hope for a better one, but I don't
think this should be considered a blocker unless someone actually
comes up with a better solution.

Best,
Radon

[1]: https://lists.gnu.org/archive/html/emacs-devel/2015-03/msg01016.html
[2]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-10 19:03   ` Radon Rosborough
@ 2017-10-10 19:31     ` Robert Weiner
  2017-10-10 19:41       ` Radon Rosborough
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Weiner @ 2017-10-10 19:31 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 541 bytes --]

On Tue, Oct 10, 2017 at 3:03 PM, Radon Rosborough <radon.neon@gmail.com>
wrote:

>
> And, as Eli already pointed out, for most Emacs users there *is* only
> a single init file. It's only if you want to do advanced programming
> that you need to use the second one, which need not exist at all.
>

​That sounds fine.  When I mentioned 'package-initialize', I meant that
users of packages who would call that in their init files should not need
to have a second init file just to use packages and have them load properly.

Bob

[-- Attachment #2: Type: text/html, Size: 1359 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-10 19:31     ` Robert Weiner
@ 2017-10-10 19:41       ` Radon Rosborough
  2017-10-13 21:29         ` John Wiegley
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-10-10 19:41 UTC (permalink / raw)
  To: rswgnu; +Cc: emacs-devel

> When I mentioned 'package-initialize', I meant that users of
> packages who would call that in their init files should not need to
> have a second init file just to use packages and have them load
> properly.

Indeed, you need only have a second init file if you would like to
customize `package-load-list', `package-enable-at-startup',
`package-user-dir', or other such low-level variables. (In particular,
`package-archives' can be set in the regular init file.)

In fact, with this patch, you don't even need to have any
package-related code at all in your init-file: not even
`package-initialize'. Packages can be installed, and they will "just
work", including if customizations are them are blindly pasted into
the regular init file.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-10 19:41       ` Radon Rosborough
@ 2017-10-13 21:29         ` John Wiegley
  2017-10-14  0:49           ` Radon Rosborough
  0 siblings, 1 reply; 838+ messages in thread
From: John Wiegley @ 2017-10-13 21:29 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: rswgnu, emacs-devel

>>>>> "RR" == Radon Rosborough <radon.neon@gmail.com> writes:

RR> In fact, with this patch, you don't even need to have any
RR> package-related code at all in your init-file: not even
RR> `package-initialize'. Packages can be installed, and they will "just
RR> work", including if customizations are them are blindly pasted into
RR> the regular init file.

And if I never use packages, I'll never have this second file, right?  Because
right now, every once in a while, I find (package-initialize) getting inserted
into my init.el, even though I never once have used packages. Still haven't
figured out what's doing that.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-13 21:29         ` John Wiegley
@ 2017-10-14  0:49           ` Radon Rosborough
  2017-10-14  5:15             ` João Távora
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-10-14  0:49 UTC (permalink / raw)
  To: Radon Rosborough, rswgnu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 361 bytes --]

> And if I never use packages, I'll never have this second file,
> right?

Correct.

> Because right now, every once in a while, I find
> (package-initialize) getting inserted into my init.el, even though I
> never once have used packages.

Literally the entire point of this patch is to stop that from
happening without sacrificing any existing functionality.

[-- Attachment #2: Type: text/html, Size: 551 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-14  0:49           ` Radon Rosborough
@ 2017-10-14  5:15             ` João Távora
  2017-10-14  6:19               ` Radon Rosborough
  2017-10-14 13:47               ` Stefan Monnier
  0 siblings, 2 replies; 838+ messages in thread
From: João Távora @ 2017-10-14  5:15 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: rswgnu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 545 bytes --]

On Sat, Oct 14, 2017 at 1:49 AM, Radon Rosborough <radon.neon@gmail.com>
wrote:
>
> > And if I never use packages, I'll never have this second file,
> > right?
>
> Correct.

A follow up: if I do use packages but never mess with its "advanced
options"
(or even customize by that matter), will I also never have this second file?

(Excuse me if the question is ignorant in the "advanced options" part, I
remember
reading something about that in these very big threads, about configuring
the
package's location and such.)

João

[-- Attachment #2: Type: text/html, Size: 864 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-14  5:15             ` João Távora
@ 2017-10-14  6:19               ` Radon Rosborough
  2017-10-14  9:04                 ` João Távora
  2017-10-14 13:47               ` Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-10-14  6:19 UTC (permalink / raw)
  To: João Távora; +Cc: rswgnu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 529 bytes --]

> A follow up: if I do use packages but never mess with its "advanced
> options" (or even customize by that matter), will I also never have
> this second file?

Correct. If you don't have to customize `package-user-dir' or
`package-load-list', and you don't need to stop package.el from
loading packages that you already installed, then there is no need for
the early init file.

Note also that with this patch, unlike in the current situation, Emacs
doesn't do anything automatically. No files are created or modified by
Emacs.

[-- Attachment #2: Type: text/html, Size: 745 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-14  6:19               ` Radon Rosborough
@ 2017-10-14  9:04                 ` João Távora
  0 siblings, 0 replies; 838+ messages in thread
From: João Távora @ 2017-10-14  9:04 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: rswgnu, emacs-devel

Radon Rosborough <radon.neon@gmail.com> writes:

>> A follow up: if I do use packages but never mess with its "advanced
>> options" (or even customize by that matter), will I also never have
>> this second file?
>
> Correct. If you don't have to customize `package-user-dir' or
> `package-load-list', and you don't need to stop package.el from
> loading packages that you already installed, then there is no need for
> the early init file.
>
> Note also that with this patch, unlike in the current situation, Emacs
> doesn't do anything automatically. No files are created or modified by
> Emacs.

Thank you. Sounds reasonable, then.

João



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-14  5:15             ` João Távora
  2017-10-14  6:19               ` Radon Rosborough
@ 2017-10-14 13:47               ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2017-10-14 13:47 UTC (permalink / raw)
  To: emacs-devel

> A follow up: if I do use packages but never mess with its "advanced
> options" (or even customize by that matter), will I also never have
> this second file?

The core of the change is to call package-initialize *before* loading
~/.emacs.  So you'll need the other file in the specific case where you
need to do something *before* the call to package-initialize.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-10 16:59   ` Eli Zaretskii
@ 2017-10-14 21:30     ` Mark Oteiza
  2017-10-14 21:52       ` Stefan Monnier
                         ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Mark Oteiza @ 2017-10-14 21:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rswgnu, radon.neon, emacs-devel


Eli Zaretskii <eliz@gnu.org> writes:

>> From: Robert Weiner <rsw@gnu.org>
>> Date: Tue, 10 Oct 2017 12:52:32 -0400
>> Cc: emacs-devel <emacs-devel@gnu.org>
>> 
>> 1. For most Emacs users who do not program in Elisp, there should be
>> only a single init file that they would personalize, generally as
>> they find snippets of code they can cut and paste for their use.​
>> 
>> 2. For Elispers, another optional init file for more fine-grained
>> control would be okay, though not ideal.
>
> I think the proposed solution satisfies these requirements.  The 2nd
> init file is only needed if you want to tweak package initialization
> by putting Lisp code into that 2nd file.

Breaking the ability to do such tweaking with the init file we already
have is insane.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-14 21:30     ` Mark Oteiza
@ 2017-10-14 21:52       ` Stefan Monnier
  2017-10-15  1:18       ` Radon Rosborough
  2017-10-15 14:16       ` Eli Zaretskii
  2 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2017-10-14 21:52 UTC (permalink / raw)
  To: emacs-devel

> Breaking the ability to do such tweaking with the init file we already
> have is insane.

FWIW this second init file has another purpose: it lets you run
configuration code before the initial frame is mapped.


        Stefan "who intends to use a single config file, which will be
                called ~/.emacs.d/early-init.el"




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-14 21:30     ` Mark Oteiza
  2017-10-14 21:52       ` Stefan Monnier
@ 2017-10-15  1:18       ` Radon Rosborough
  2017-10-15 14:16       ` Eli Zaretskii
  2 siblings, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2017-10-15  1:18 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: Eli Zaretskii, rswgnu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 415 bytes --]

> Breaking the ability to do such tweaking with the init file we
> already have is insane.

It is equally legitimate for me to say that all of the other proposed
solutions are insane. Please provide some reasoning to substantiate
your claim, since I have already provided ample reasoning to
substantiate my claim to the contrary (see [1]).

[1]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html

[-- Attachment #2: Type: text/html, Size: 651 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-14 21:30     ` Mark Oteiza
  2017-10-14 21:52       ` Stefan Monnier
  2017-10-15  1:18       ` Radon Rosborough
@ 2017-10-15 14:16       ` Eli Zaretskii
  2017-10-15 16:26         ` Stefan Monnier
  2 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2017-10-15 14:16 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: rswgnu, radon.neon, emacs-devel

> From: Mark Oteiza <mvoteiza@udel.edu>
> Cc: rswgnu@gmail.com,  radon.neon@gmail.com,  emacs-devel@gnu.org
> Date: Sat, 14 Oct 2017 17:30:41 -0400
> 
> > I think the proposed solution satisfies these requirements.  The 2nd
> > init file is only needed if you want to tweak package initialization
> > by putting Lisp code into that 2nd file.
> 
> Breaking the ability to do such tweaking with the init file we already
> have is insane.

I hope the "insane" part is a slight exaggeration...

Anyway, AFAIU, that was the best/only solution that came up which
would solve the original problem without causing more trouble to the
uninitiated.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-15 14:16       ` Eli Zaretskii
@ 2017-10-15 16:26         ` Stefan Monnier
  2017-10-25 22:13           ` Radon Rosborough
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2017-10-15 16:26 UTC (permalink / raw)
  To: emacs-devel

>> > I think the proposed solution satisfies these requirements.  The 2nd
>> > init file is only needed if you want to tweak package initialization
>> > by putting Lisp code into that 2nd file.
>> Breaking the ability to do such tweaking with the init file we already
>> have is insane.

Actually, it doesn't really break it.  All it does really (assuming you
don't use the new early-init.el file) is that packages in
~/.emacs.d/elpa will be automatically activated before ~/.emacs
is loaded.

So if you set package-user-dir in your ~/.emacs presumably you don't
have any packages in ~/.emacs.d/elpa and hence it won't make much of
a difference: you can still set package-user-dir in your ~/.emacs and
then call package-initialize.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-15 16:26         ` Stefan Monnier
@ 2017-10-25 22:13           ` Radon Rosborough
  2017-10-26  0:11             ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-10-25 22:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Sorry to be a nag, but discussion seems to have died off again.
Again, is there anything I can do to help out with the process of
reviewing this patch for merge?

> Attached is a preliminary patch for fixing "the package-initialize
> problem" (see [1] [2] [3]) by adding an early init file. Feedback
> welcome. In particular,
>
> - do we want to try to factor out some common logic in loading the
>   early init file versus the regular init file?
> - have I broken anything in moving the check for an invalid username
>   earlier in startup.el? what about moving package-initialize earlier?
> - should `early-init-file' be defined in C?
> - did I miss any documentation fixes?
> - have I broken any style guidelines for the repository?
>
> Additional question: if we moved forward with this patch, would it
> make it into Emacs 26.1?
>
> Best,
> Radon Rosborough
>
> [1]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
> [2]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
> [3]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-25 22:13           ` Radon Rosborough
@ 2017-10-26  0:11             ` Stefan Monnier
  2017-12-18  0:45               ` Radon Rosborough
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2017-10-26  0:11 UTC (permalink / raw)
  To: emacs-devel

>> - do we want to try to factor out some common logic in loading the
>> early init file versus the regular init file?

I think so, yes.

>> - have I broken anything in moving the check for an invalid username
>> earlier in startup.el? what about moving package-initialize earlier?

Time will tell.

>> - should `early-init-file' be defined in C?

If it's not indispensable, then I'd say no.

>> Additional question: if we moved forward with this patch, would it
>> make it into Emacs 26.1?

No, it's too late for that.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Reload file from disk
@ 2017-11-11  9:17 Florian Weimer
  2017-11-11 10:29 ` Eli Zaretskii
                   ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Florian Weimer @ 2017-11-11  9:17 UTC (permalink / raw)
  To: emacs-devel

Some time ago, it was possible to reload the current buffer from disk
using C-x C-f RET.  This was changed to run dired instead.  The
argument at the time was you could use C-x C-f M-n RET to reload the
current buffer, and that dired was more important.  The behavior of
M-n is documented for find-file at al.:

| but the visited file name is available through the minibuffer
| history: type M-n to pull it into the minibuffer.

But over the years, C-x C-f M-n RET started doing more and more
bizarre things.  It now inserts the file name at point in the buffer,
which is particularly annoying if you try to reload a ChangeLog file.
And I just noticed that when on a domain name such as example.com, it
will apparently attempt to ping that host.

Can we please make M-n behave as documented in this context, or even
better, revert to the old C-x C-f RET behavior?  One could always
browse the current directory using C-x C-f . RET, which is why never
understood the motivation behind that change.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11  9:17 Reload file from disk Florian Weimer
@ 2017-11-11 10:29 ` Eli Zaretskii
  2017-11-11 10:40   ` Eli Zaretskii
  2017-11-11 12:44 ` Noam Postavsky
  2017-11-12 18:28 ` Joost Kremers
  2 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2017-11-11 10:29 UTC (permalink / raw)
  To: Florian Weimer; +Cc: emacs-devel

> From: Florian Weimer <fw@deneb.enyo.de>
> Date: Sat, 11 Nov 2017 10:17:18 +0100
> 
> | but the visited file name is available through the minibuffer
> | history: type M-n to pull it into the minibuffer.
> 
> But over the years, C-x C-f M-n RET started doing more and more
> bizarre things.  It now inserts the file name at point in the buffer,
> which is particularly annoying if you try to reload a ChangeLog file.

It does?  I cannot reproduce this in "emacs -Q".  Could it be that you
have some optional package activated which does that?  If not, can you
show a recipe starting from "emacs -Q" that reproduces the behavior
you describe?

> And I just noticed that when on a domain name such as example.com, it
> will apparently attempt to ping that host.

This I can reproduce, and you can disable it by customizing
file-name-at-point-functions to a nil value.

> Can we please make M-n behave as documented in this context, or even
> better, revert to the old C-x C-f RET behavior?  One could always
> browse the current directory using C-x C-f . RET, which is why never
> understood the motivation behind that change.

The previous behavior of "C-x C-f RET" was considered confusing and
not very useful by many users, so I don't think we want to go back
there.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11 10:29 ` Eli Zaretskii
@ 2017-11-11 10:40   ` Eli Zaretskii
  2017-11-11 10:54     ` Florian Weimer
  2017-11-11 11:59     ` Andreas Schwab
  0 siblings, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2017-11-11 10:40 UTC (permalink / raw)
  To: fw; +Cc: emacs-devel

> Date: Sat, 11 Nov 2017 12:29:24 +0200
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: emacs-devel@gnu.org
> 
> > But over the years, C-x C-f M-n RET started doing more and more
> > bizarre things.  It now inserts the file name at point in the buffer,
> > which is particularly annoying if you try to reload a ChangeLog file.
> 
> It does?  I cannot reproduce this in "emacs -Q".

Sorry, I see that I misunderstood your somewhat ambiguous wording.  I
see what you meant now, and the answer is the same: customize
file-name-at-point-functions to nil, and both the behaviors that
annoyed you will be gone.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11 10:40   ` Eli Zaretskii
@ 2017-11-11 10:54     ` Florian Weimer
  2017-11-11 11:55       ` Eli Zaretskii
  2017-11-11 11:59     ` Andreas Schwab
  1 sibling, 1 reply; 838+ messages in thread
From: Florian Weimer @ 2017-11-11 10:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

* Eli Zaretskii:

>> Date: Sat, 11 Nov 2017 12:29:24 +0200
>> From: Eli Zaretskii <eliz@gnu.org>
>> Cc: emacs-devel@gnu.org
>> 
>> > But over the years, C-x C-f M-n RET started doing more and more
>> > bizarre things.  It now inserts the file name at point in the buffer,
>> > which is particularly annoying if you try to reload a ChangeLog file.
>> 
>> It does?  I cannot reproduce this in "emacs -Q".
>
> Sorry, I see that I misunderstood your somewhat ambiguous wording.  I
> see what you meant now, and the answer is the same: customize
> file-name-at-point-functions to nil, and both the behaviors that
> annoyed you will be gone.

The documentation for find-file et al. still could use some updating
and a reference to file-name-at-point-functions.  For some reason, I
was unable to find the latter.

(I still find the default behavior thoroughly bizarre, but that's
probably a matter of taste.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11 10:54     ` Florian Weimer
@ 2017-11-11 11:55       ` Eli Zaretskii
  2017-11-11 13:45         ` Ken Olum
  0 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2017-11-11 11:55 UTC (permalink / raw)
  To: Florian Weimer; +Cc: emacs-devel

> From: Florian Weimer <fw@deneb.enyo.de>
> Cc: emacs-devel@gnu.org
> Date: Sat, 11 Nov 2017 11:54:57 +0100
> 
> > Sorry, I see that I misunderstood your somewhat ambiguous wording.  I
> > see what you meant now, and the answer is the same: customize
> > file-name-at-point-functions to nil, and both the behaviors that
> > annoyed you will be gone.
> 
> The documentation for find-file et al. still could use some updating
> and a reference to file-name-at-point-functions.  For some reason, I
> was unable to find the latter.

You are absolutely right, which is why I just updated the
documentation, both the doc strings and the manual, to mention this.
I was astonished to find out that this feature was first introduced in
Emacs 23.2(!), but never mentioned even in NEWS.

> (I still find the default behavior thoroughly bizarre, but that's
> probably a matter of taste.)

I'm with you, but it looks like we are the minority nowadays.

Thanks for bringing up this awful gap in documentation.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11 10:40   ` Eli Zaretskii
  2017-11-11 10:54     ` Florian Weimer
@ 2017-11-11 11:59     ` Andreas Schwab
  1 sibling, 0 replies; 838+ messages in thread
From: Andreas Schwab @ 2017-11-11 11:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: fw, emacs-devel

On Nov 11 2017, Eli Zaretskii <eliz@gnu.org> wrote:

>> Date: Sat, 11 Nov 2017 12:29:24 +0200
>> From: Eli Zaretskii <eliz@gnu.org>
>> Cc: emacs-devel@gnu.org
>> 
>> > But over the years, C-x C-f M-n RET started doing more and more
>> > bizarre things.  It now inserts the file name at point in the buffer,
>> > which is particularly annoying if you try to reload a ChangeLog file.
>> 
>> It does?  I cannot reproduce this in "emacs -Q".
>
> Sorry, I see that I misunderstood your somewhat ambiguous wording.  I
> see what you meant now, and the answer is the same: customize
> file-name-at-point-functions to nil, and both the behaviors that
> annoyed you will be gone.

Even better, bind revert-buffer to a key.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11  9:17 Reload file from disk Florian Weimer
  2017-11-11 10:29 ` Eli Zaretskii
@ 2017-11-11 12:44 ` Noam Postavsky
  2017-11-12 18:28 ` Joost Kremers
  2 siblings, 0 replies; 838+ messages in thread
From: Noam Postavsky @ 2017-11-11 12:44 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Emacs developers

On Sat, Nov 11, 2017 at 4:17 AM, Florian Weimer <fw@deneb.enyo.de> wrote:
> Some time ago, it was possible to reload the current buffer from disk
> using C-x C-f RET.  This was changed to run dired instead.  The
> argument at the time was you could use C-x C-f M-n RET to reload the
> current buffer, and that dired was more important.

I usually use C-x C-v RET for this.
Or if I want to reload because the file changed externally, SPC r
(though the buffer must be in unmodified state for that).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11 11:55       ` Eli Zaretskii
@ 2017-11-11 13:45         ` Ken Olum
  2017-11-11 14:11           ` Eli Zaretskii
  0 siblings, 1 reply; 838+ messages in thread
From: Ken Olum @ 2017-11-11 13:45 UTC (permalink / raw)
  To: emacs-devel

   From: Eli Zaretskii <eliz@gnu.org>
   Date: Sat, 11 Nov 2017 13:55:26 +0200

   > From: Florian Weimer <fw@deneb.enyo.de>

   > (I still find the default behavior thoroughly bizarre, but that's
   > probably a matter of taste.)

   I'm with you, but it looks like we are the minority nowadays.

I redefined find-file-read-args in my init file to reinstate the old
behavior when the new came out.  How about a variable to control this
for the possibly large minority that prefer the old behavior?

                                          Ken



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11 13:45         ` Ken Olum
@ 2017-11-11 14:11           ` Eli Zaretskii
  2017-11-11 15:03             ` Ken Olum
  0 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2017-11-11 14:11 UTC (permalink / raw)
  To: Ken Olum; +Cc: emacs-devel

> From: Ken Olum <kdo@cosmos.phy.tufts.edu>
> Date: Sat, 11 Nov 2017 08:45:04 -0500
> 
>    > (I still find the default behavior thoroughly bizarre, but that's
>    > probably a matter of taste.)
> 
>    I'm with you, but it looks like we are the minority nowadays.
> 
> I redefined find-file-read-args in my init file to reinstate the old
> behavior when the new came out.  How about a variable to control this
> for the possibly large minority that prefer the old behavior?

There's already a variable: file-name-at-point-functions.  It just was
undocumented until now.  Given that it's documented, do we still need
a separate knob?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11 14:11           ` Eli Zaretskii
@ 2017-11-11 15:03             ` Ken Olum
  2017-11-11 16:48               ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Ken Olum @ 2017-11-11 15:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

   From: Eli Zaretskii <eliz@gnu.org>
   Date: Sat, 11 Nov 2017 16:11:34 +0200

   There's already a variable: file-name-at-point-functions.  It just was
   undocumented until now.  Given that it's documented, do we still need
   a separate knob?

Sorry for the confusion.  I think we're discussing different things
here.  My goal was to have the default for find-file (without typing
M-n) be the current file, so that C-x C-f RET would reload the buffer.
I think file-name-at-point-functions affects only the question of what
you get when you type M-n.

If there are enough people who would like C-x C-f RET to reload the
buffer, perhaps there should be a variable for that.  But perhaps
there are not.  (This has little consequence for me personally, since
I already worked around it a different way.)

                                        Ken



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Reload file from disk
  2017-11-11 15:03             ` Ken Olum
@ 2017-11-11 16:48               ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2017-11-11 16:48 UTC (permalink / raw)
  To: Ken Olum, Eli Zaretskii; +Cc: emacs-devel

>  My goal was to have the default for find-file (without typing
> M-n) be the current file, so that C-x C-f RET would reload the buffer.

FWIW, y'all should be talking about "finding" a Lisp file
(in the sense of `find-file'), not "loading" a Lisp file
(in the sense of `load-file' and `load-library').

I was confused for a while, because I thought you actually
meant loading (evaluating) the file.  And for loading,
`M-x load-file' _does_ use the current buffer's file as
the default.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-11  9:17 Reload file from disk Florian Weimer
  2017-11-11 10:29 ` Eli Zaretskii
  2017-11-11 12:44 ` Noam Postavsky
@ 2017-11-12 18:28 ` Joost Kremers
  2017-11-13 17:24   ` Tom Tromey
  2 siblings, 1 reply; 838+ messages in thread
From: Joost Kremers @ 2017-11-12 18:28 UTC (permalink / raw)
  To: Florian Weimer; +Cc: emacs-devel


On Sat, Nov 11 2017, Florian Weimer wrote:
> Some time ago, it was possible to reload the current buffer from 
> disk
> using C-x C-f RET.  This was changed to run dired instead.

Try C-x C-v (`find-alternate-file') instead: it defaults to the 
file currently being visited by the buffer, so you just need to 
type RET to reload it.


-- 
Joost Kremers
Life has its moments



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Reload file from disk
  2017-11-12 18:28 ` Joost Kremers
@ 2017-11-13 17:24   ` Tom Tromey
  0 siblings, 0 replies; 838+ messages in thread
From: Tom Tromey @ 2017-11-13 17:24 UTC (permalink / raw)
  To: Joost Kremers; +Cc: Florian Weimer, emacs-devel

>>>>> "Joost" == Joost Kremers <joostkremers@fastmail.fm> writes:

Joost> On Sat, Nov 11 2017, Florian Weimer wrote:
>> Some time ago, it was possible to reload the current buffer from
>> disk
>> using C-x C-f RET.  This was changed to run dired instead.

Joost> Try C-x C-v (`find-alternate-file') instead: it defaults to the file
Joost> currently being visited by the buffer, so you just need to type RET to
Joost> reload it.

This isn't always as nice as the old behavior of C-x C-f RET because it
moves point to the start of the buffer.

Tom



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-10-26  0:11             ` Stefan Monnier
@ 2017-12-18  0:45               ` Radon Rosborough
  2018-01-25  4:35                 ` Radon Rosborough
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2017-12-18  0:45 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 720 bytes --]

I am sorry for the delay in response. Now that the fall semester is
over, I have much more time. The revised patch is attached. I have
done some basic testing with it applied to the latest master. Please
let me know if you have more feedback.

> > - do we want to try to factor out some common logic in loading the
> > early init file versus the regular init file?
>
> I think so, yes.

This is done; the function `load-user-init-file' is used for loading
both the early and regular init-files, and could easily be used for
loading more.

> > - should `early-init-file' be defined in C?
>
> If it's not indispensable, then I'd say no.

In the attached patch, it is defined as a Lisp variable in startup.el.

Best,
Radon

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 33786 bytes --]

From c74093ab3dde9042a50eb65e7af46625a834b689 Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Dec 2017 17:31:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* lisp/startup.el (early-init-file): New variable, for the filename of
  the early init file after it has been loaded.

* lisp/startup.el (load-user-init-file): New function, used to
  eliminate duplicate code in loading the early and regular init
  files.

* lisp/startup.el (command-line): Load the early init file using
  `load-user-init-file'. Move the check for an invalid username to
  just before that, and move the initialization of the package system
  to just after. Load the regular init file using
  `load-user-init-file'.

* src/lread.c (Vuser_init_file): Note change in semantics due to its
  usage while loading the early init file.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove
  definition, usage, and documentation.

* lisp/emacs-lisp/package.el (package--init-file-ensured): Remove
  definition and usage.

* doc/lispref/os.texi: Document early init file.

* doc/lispref/package.texi: Document changes to when
  package-initialize is called, and advise against calling it in the
  init file.

* doc/emacs/package.texi: Document changes to when package-initialize
  is called.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
  init file.

* etc/NEWS: Document changes to startup and package.el.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00599.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00332.html
---
 doc/emacs/package.texi     |  28 +--
 doc/lispref/os.texi        |  14 ++
 doc/lispref/package.texi   |  16 +-
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  18 ++
 lisp/emacs-lisp/package.el |  71 +-------
 lisp/startup.el            | 425 +++++++++++++++++++++++++--------------------
 src/lread.c                |   2 +-
 8 files changed, 289 insertions(+), 289 deletions(-)

diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 215f50cb40..bd7cccce6c 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -253,30 +253,16 @@ Package Installation
 consult the package's help buffer.
 
   By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+subsequent Emacs sessions.  This happens at startup, before processing
+the init file but after processing the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an
+exception, Emacs does not load packages at startup if invoked with the
+@samp{-q} or @samp{--no-init-file} options (@xref{Initial Options}).
 
 @vindex package-enable-at-startup
   To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
-
-@findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+@code{package-enable-at-startup} to @code{nil}.  You must do this in
+the early init file.  Currently it cannot be done via Customize.
 
 @vindex package-load-list
   For finer control over package loading, you can use the variable
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 501960bdc3..c6990909ab 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -361,6 +361,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +385,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+  @dfn{early init file}, if it exists.  This is a file named
+  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
+  home directory.  The difference is that the early init file is
+  loaded much earlier during the startup process, so you can use it to
+  customize some things that are initialized before loading the
+  regular init file.  For example, here you can customize the process
+  of loading installed packages, by setting variables such as
+  @var{package-load-list} or
+  @var{package-enable-at-startup}. @xref{Package Installation,,,
+  emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 153ee48741..2e93f29bd2 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -106,10 +106,12 @@ Packaging Basics
 
   Whenever Emacs starts up, it automatically calls the function
 @code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+after loading the early init file, but before loading the early init
+file and abbrev file (if any) and before running
+@code{after-init-hook} (@pxref{Startup Summary}).  Automatic package
+loading is disabled if the user option
+@code{package-enable-at-startup} is @code{nil}.  (Of course, the
+setting of this user option must be done in the early init file.)
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
@@ -123,6 +125,12 @@ Packaging Basics
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
 loading them; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index 1f6e10287d..36b7f87248 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -890,9 +890,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index 1382f96a37..4bbf3e237a 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -41,6 +41,24 @@ can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called early-init.el, in `user-emacs-directory'.  It is
+loaded very early in the startup process: in particular, before
+graphical elements such as the tool bar are initialized, and before
+the package manager is initialized.
+
++++
+** Emacs now initializes package.el before loading the init-file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to (package-initialize) into the
+init-file, which was previously done when Emacs was started.  Users
+who do not configure package.el variables such as `package-load-list'
+and `package-user-dir' need not make any configuration changes.  Users
+who do configure such variables should place the configuration into
+the newly introduced early init file, which is loaded before
+package.el is initialized.
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index f8b4cc888d..815b679cae 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1431,16 +1431,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1449,13 +1444,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1872,64 +1861,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 4575f1f94d..de85933983 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -312,6 +312,15 @@ inhibit-startup-hooks
 Currently this applies to: `emacs-startup-hook', `term-setup-hook',
 and `window-setup-hook'.")
 
+(defvar early-init-file nil
+  "File name, including directory, of user's early init file.
+If the file loaded had extension `.elc', and the corresponding
+source file exists, this variable contains the name of source
+file, suitable for use by functions like `custom-save-all' which
+edit the init file.  While Emacs loads and evaluates the init
+file, value is the real name of the file, regardless of whether
+or not it has the `.elc' extension.")
+
 (defvar keyboard-type nil
   "The brand of keyboard you are using.
 This variable is used to define the proper function and keypad
@@ -870,6 +879,129 @@ startup--setup-quote-display
           (when standard-display-table
             (aset standard-display-table char nil)))))))
 
+(defun load-user-init-file
+    (compute-filename &optional compute-alternate-filename load-defaults)
+  "Load a user init-file.
+COMPUTE-FILENAME is called with no arguments and should return
+the name of the init-file to load. If this file cannot be loaded,
+and COMPUTE-ALTERNATE-FILENAME is non-nil, then it is called with
+no arguments and should return the name of an alternate init-file
+to load. If LOAD-DEFAULTS is non-nil, then load default.el after
+the init-file.
+
+This function sets `user-init-file' to the name of the loaded
+init-file, or to a default value if loading is not possible."
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial
+         (if (eq init-file-debug t)
+             'startup
+           init-file-debug))
+        (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
+    (let ((debug-on-error debug-on-error-initial)
+          ;; We create an anonymous function here so that we can call
+          ;; it in different contexts depending on the value of
+          ;; `debug-on-error'.
+          (read-init-file
+           (lambda ()
+             (when init-file-user
+               (let ((init-file-name (funcall compute-filename)))
+
+                 ;; If `user-init-file' is t, then `load' will store
+                 ;; the name of the file that it loads into
+                 ;; `user-init-file'.
+                 (setq user-init-file t)
+                 (load init-file-name 'noerror 'nomessage)
+
+                 (when (eq user-init-file t)
+                   (let ((alt-file-name (funcall compute-alternate-filename)))
+                     (load alt-file-name 'noerror 'nomessage)
+
+                     ;; If we did not find the user's init file, set
+                     ;; user-init-file conclusively.  Don't let it be
+                     ;; set from default.el.
+                     (when (eq user-init-file t)
+                       (setq user-init-file init-file-name)))))
+
+               ;; If we loaded a compiled file, set `user-init-file' to
+               ;; the source version if that exists.
+               (when (equal (file-name-extension user-init-file)
+                            "elc")
+                 (let* ((source (file-name-sans-extension user-init-file))
+                        (alt (concat source ".el")))
+                   (setq source (cond ((file-exists-p alt) alt)
+                                      ((file-exists-p source) source)
+                                      (t nil)))
+                   (when source
+                     (when (file-newer-than-file-p source user-init-file)
+                       (message "Warning: %s is newer than %s"
+                                source user-init-file)
+                       (sit-for 1))
+                     (setq user-init-file source))))
+
+               (when load-defaults
+
+                 ;; Prevent default.el from changing the value of
+                 ;; `inhibit-startup-screen'.
+                 (let ((inhibit-startup-screen nil))
+                   (load "default" 'noerror 'nomessage)))))))
+      ;; Now call our anonymous function.
+      (if init-file-debug
+          ;; Do this without a `condition-case' if the user wants to
+          ;; debug.
+          (funcall read-init-file)
+        (condition-case error
+            (progn
+              (funcall read-init-file)
+
+              ;; If a previous init-file had an error, don't forget
+              ;; about that.
+              (unless init-file-had-error
+                (setq init-file-had-error nil)))
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+
+      ;; If we can tell that the init file altered debug-on-error,
+      ;; arrange to preserve the value that it set up.
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+
+    (when debug-on-error-should-be-set
+      (setq debug-on-error debug-on-error-from-init-file))
+
+    (unless (or (default-value 'enable-multibyte-characters)
+                (eq orig-enable-multibyte (default-value
+                                            'enable-multibyte-characters)))
+
+      ;; Init file changed to unibyte.  Reset existing multibyte
+      ;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
+      ;; Arguably this should only be done if they're free of
+      ;; multibyte characters.
+      (mapc (lambda (buffer)
+              (with-current-buffer buffer
+                (if enable-multibyte-characters
+                    (set-buffer-multibyte nil))))
+            (buffer-list))
+
+      ;; Also re-set the language environment in case it was
+      ;; originally done before unibyte was set and is sensitive to
+      ;; unibyte (display table, terminal coding system &c).
+      (set-language-environment current-language-environment))))
+
 (defun command-line ()
   "A subroutine of `normal-top-level'.
 Amongst another things, it parses the command-line arguments."
@@ -1021,6 +1153,69 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (load-user-init-file
+   (lambda ()
+     (expand-file-name
+      "early-init"
+      (file-name-as-directory
+       (concat "~" init-file-user "/.emacs.d")))))
+  (setq early-init-file user-init-file)
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1127,170 +1322,47 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
-    (let (debug-on-error-from-init-file
-	  debug-on-error-should-be-set
-	  (debug-on-error-initial
-	   (if (eq init-file-debug t) 'startup init-file-debug))
-	  (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
-      (let ((debug-on-error debug-on-error-initial)
-	    ;; This function actually reads the init files.
-	    (inner
-	     (function
-	      (lambda ()
-		(if init-file-user
-		    (let ((user-init-file-1
-			   (cond
-			     ((eq system-type 'ms-dos)
-			      (concat "~" init-file-user "/_emacs"))
-			     ((not (eq system-type 'windows-nt))
-			      (concat "~" init-file-user "/.emacs"))
-			     ;; Else deal with the Windows situation
-			     ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
-			      ;; Prefer .emacs on Windows.
-			      "~/.emacs")
-			     ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
-			      ;; Also support _emacs for compatibility, but warn about it.
-			      (push `(initialization
-				      ,(format-message
-					"`_emacs' init file is deprecated, please use `.emacs'"))
-				    delayed-warnings-list)
-			      "~/_emacs")
-			     (t ;; But default to .emacs if _emacs does not exist.
-			      "~/.emacs"))))
-		      ;; This tells `load' to store the file name found
-		      ;; into user-init-file.
-		      (setq user-init-file t)
-		      (load user-init-file-1 t t)
-
-		      (when (eq user-init-file t)
-			;; If we did not find ~/.emacs, try
-			;; ~/.emacs.d/init.el.
-			(let ((otherfile
-			       (expand-file-name
-				"init"
-				(file-name-as-directory
-				 (concat "~" init-file-user "/.emacs.d")))))
-			  (load otherfile t t)
-
-			  ;; If we did not find the user's init file,
-			  ;; set user-init-file conclusively.
-			  ;; Don't let it be set from default.el.
-			  (when (eq user-init-file t)
-			    (setq user-init-file user-init-file-1))))
-
-		      ;; If we loaded a compiled file, set
-		      ;; `user-init-file' to the source version if that
-		      ;; exists.
-		      (when (and user-init-file
-				 (equal (file-name-extension user-init-file)
-					"elc"))
-			(let* ((source (file-name-sans-extension user-init-file))
-			       (alt (concat source ".el")))
-			  (setq source (cond ((file-exists-p alt) alt)
-					     ((file-exists-p source) source)
-					     (t nil)))
-			  (when source
-			    (when (file-newer-than-file-p source user-init-file)
-			      (message "Warning: %s is newer than %s"
-				       source user-init-file)
-			      (sit-for 1))
-			    (setq user-init-file source))))
-
-		      (unless inhibit-default-init
-                        (let ((inhibit-startup-screen nil))
-                          ;; Users are supposed to be told their rights.
-                          ;; (Plus how to get help and how to undo.)
-                          ;; Don't you dare turn this off for anyone
-                          ;; except yourself.
-                          (load "default" t t)))))))))
-	(if init-file-debug
-	    ;; Do this without a condition-case if the user wants to debug.
-	    (funcall inner)
-	  (condition-case error
-	      (progn
-		(funcall inner)
-		(setq init-file-had-error nil))
-	    (error
-	     (display-warning
-	      'initialization
-	      (format-message "\
-An error occurred while loading `%s':\n\n%s%s%s\n\n\
-To ensure normal operation, you should investigate and remove the
-cause of the error in your initialization file.  Start Emacs with
-the `--debug-init' option to view a complete error backtrace."
-		      user-init-file
-		      (get (car error) 'error-message)
-		      (if (cdr error) ": " "")
-		      (mapconcat (lambda (s) (prin1-to-string s t))
-				 (cdr error) ", "))
-	      :warning)
-	     (setq init-file-had-error t))))
-
-      (if (and deactivate-mark transient-mark-mode)
-	    (with-current-buffer (window-buffer)
-	      (deactivate-mark)))
-
-	;; If the user has a file of abbrevs, read it (unless -batch).
-	(when (and (not noninteractive)
-		   (file-exists-p abbrev-file-name)
-		   (file-readable-p abbrev-file-name))
-	    (quietly-read-abbrev-file abbrev-file-name))
-
-	;; If the abbrevs came entirely from the init file or the
-	;; abbrevs file, they do not need saving.
-	(setq abbrevs-changed nil)
-
-	;; If we can tell that the init file altered debug-on-error,
-	;; arrange to preserve the value that it set up.
-	(or (eq debug-on-error debug-on-error-initial)
-	    (setq debug-on-error-should-be-set t
-		  debug-on-error-from-init-file debug-on-error)))
-      (if debug-on-error-should-be-set
-	  (setq debug-on-error debug-on-error-from-init-file))
-      (unless (or (default-value 'enable-multibyte-characters)
-		  (eq orig-enable-multibyte (default-value
-					      'enable-multibyte-characters)))
-	;; Init file changed to unibyte.  Reset existing multibyte
-	;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
-	;; Arguably this should only be done if they're free of
-	;; multibyte characters.
-	(mapc (lambda (buffer)
-		(with-current-buffer buffer
-		  (if enable-multibyte-characters
-		      (set-buffer-multibyte nil))))
-	      (buffer-list))
-	;; Also re-set the language environment in case it was
-	;; originally done before unibyte was set and is sensitive to
-	;; unibyte (display table, terminal coding system &c).
-	(set-language-environment current-language-environment)))
+    (load-user-init-file
+     (lambda ()
+       (cond
+        ((eq system-type 'ms-dos)
+         (concat "~" init-file-user "/_emacs"))
+        ((not (eq system-type 'windows-nt))
+         (concat "~" init-file-user "/.emacs"))
+        ;; Else deal with the Windows situation.
+        ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
+         ;; Prefer .emacs on Windows.
+         "~/.emacs")
+        ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
+         ;; Also support _emacs for compatibility, but warn about it.
+         (push `(initialization
+                 ,(format-message
+                   "`_emacs' init file is deprecated, please use `.emacs'"))
+               delayed-warnings-list)
+         "~/_emacs")
+        (t ;; But default to .emacs if _emacs does not exist.
+         "~/.emacs")))
+     (lambda ()
+       (expand-file-name
+        "init"
+        (file-name-as-directory
+         (concat "~" init-file-user "/.emacs.d"))))
+     (not inhibit-default-init))
+
+    (when (and deactivate-mark transient-mark-mode)
+      (with-current-buffer (window-buffer)
+        (deactivate-mark)))
+
+    ;; If the user has a file of abbrevs, read it (unless -batch).
+    (when (and (not noninteractive)
+               (file-exists-p abbrev-file-name)
+               (file-readable-p abbrev-file-name))
+      (quietly-read-abbrev-file abbrev-file-name))
+
+    ;; If the abbrevs came entirely from the init file or the
+    ;; abbrevs file, they do not need saving.
+    (setq abbrevs-changed nil)
 
     ;; Do this here in case the init file sets mail-host-address.
     (and mail-host-address
@@ -1312,33 +1384,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
diff --git a/src/lread.c b/src/lread.c
index 52897b4fcc..5ff438041b 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4892,7 +4892,7 @@ directory.  These file names are converted to absolute at startup.  */);
 If the file loaded had extension `.elc', and the corresponding source file
 exists, this variable contains the name of source file, suitable for use
 by functions like `custom-save-all' which edit the init file.
-While Emacs loads and evaluates the init file, value is the real name
+While Emacs loads and evaluates any init file, value is the real name
 of the file, regardless of whether or not it has the `.elc' extension.  */);
   Vuser_init_file = Qnil;
 
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found] <mailman.7307.1515801433.27995.help-gnu-emacs@gnu.org>
@ 2018-01-13  0:43 ` Emanuel Berg
  2018-01-13  3:43   ` info-find-source Robert Thorpe
                     ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-13  0:43 UTC (permalink / raw)
  To: help-gnu-emacs

OK, there seems to be a bit of confusion here
with respect to what I mean. So I'd like to
clarify a few thing. That said, I'm not saying
any of this to try to sway anyone. It is just
my POV.

First, I don't think info is bad in any way.
Actually, I think it is very good! To have
a uniform interface to documentation and to
have people add new pieces to it, in a uniform
way, which will then fit seamlessly, is great.
I encourage everyone who has written a larger
piece of software to do it, no doubt.

Markup and interconnectivity, if that is
a word, is also good. The man pages are both as
well and I never felt the need to browse the
groff source.

That the documentation comes with Emacs, or is
on-line (i.e., not on paper) - remember the
terrible Sierra On-Line adventure games? - is
also a good thing, even tho a web version is
also good. And because of the uniformity one
can easily use or write a tool that will
translate info material into HTML or whatever
format is desired.

The issue I have with info is that it is easy
to get lost when navigating all those node back
and forth in the tree structure, back and forth
in history, up to the parent and down to the
child until you are stuck at a leaf and you
still haven't found what you are looking for.
And you do all this with keys that you do not
use every day for editing.

Compare this to the man pages where this never
happens (because of less complexity), *or*
a plain text files, where by definition it
cannot ever happen.

But doesn't this mean the files will be very
long? Yes, and I don't have a problem with that
as this volume is linear, not broken down into
a complicated tree structure one has
to traverse to get to the rainbow's end.

The speed I've mentioned isn't the speed it
takes to execute a command, it the the general
speed of access, the human-computer interface
if you will, which again per definition (unless
your cognitive "humanity" differs from mine),
this will be much, much faster with text
because I edit text and code every day, using
the same functions and finger-habits, and no
matter how fluent an info user I'll ever be, it
could never, ever match that.

Also, how does info look to you guys? To me, it
looks like this:

    http://user.it.uu.se/~embe8573/pics/info.png

The problems getting an overview what's going
on may be related to that, as well.

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-13  0:43 ` info-find-source Emanuel Berg
@ 2018-01-13  3:43   ` Robert Thorpe
  2018-01-13  5:23     ` info-find-source Marcin Borkowski
                       ` (2 more replies)
  2018-01-13  5:17   ` info-find-source Marcin Borkowski
       [not found]   ` <mailman.7313.1515820700.27995.help-gnu-emacs@gnu.org>
  2 siblings, 3 replies; 838+ messages in thread
From: Robert Thorpe @ 2018-01-13  3:43 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> The speed I've mentioned isn't the speed it
> takes to execute a command, it the the general
> speed of access, the human-computer interface
> if you will, which again per definition (unless
> your cognitive "humanity" differs from mine),
> this will be much, much faster with text
> because I edit text and code every day, using
> the same functions and finger-habits, and no
> matter how fluent an info user I'll ever be, it
> could never, ever match that.

I don't understand what you mean.  I usually don't understand what you
mean in these type of situations.

Info has it's own keybindings.  That can be a little tricky, since "s"
is the normal way to search rather than "C-s" or "M-s".  You can rebind
these functions though.

> Also, how does info look to you guys? To me, it
> looks like this:
>
>     http://user.it.uu.se/~embe8573/pics/info.png

If you use Emacs in a GUI environment then there is more markup.  Some
things are in bold and some are in larger fonts.  I generally think this
is useful, but opinions differ.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-13  0:43 ` info-find-source Emanuel Berg
  2018-01-13  3:43   ` info-find-source Robert Thorpe
@ 2018-01-13  5:17   ` Marcin Borkowski
       [not found]   ` <mailman.7313.1515820700.27995.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-13  5:17 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2018-01-13, at 01:43, Emanuel Berg <moasen@zoho.com> wrote:

> The issue I have with info is that it is easy
> to get lost when navigating all those node back
> and forth in the tree structure, back and forth
> in history, up to the parent and down to the
> child until you are stuck at a leaf and you
> still haven't found what you are looking for.
> And you do all this with keys that you do not
> use every day for editing.
>
> Compare this to the man pages where this never
> happens (because of less complexity), *or*
> a plain text files, where by definition it
> cannot ever happen.
>
> But doesn't this mean the files will be very
> long? Yes, and I don't have a problem with that
> as this volume is linear, not broken down into
> a complicated tree structure one has
> to traverse to get to the rainbow's end.

This is the point.  Underneath, Info is *still* linear.  You can search
it with C-s/C-r, if that's your way.  Also, you can bookmark Info pages
(using Emacs stock bookmarks or bookmark+).

I can't see *any* gain from your function.  And if I really wanted
something like that, I'd probably use "no new keystrokes to learn"
(using your own words!) and stick with plain old `C-x n w'.

Please try it out and tell me how your solution is superior.

Best,

-- 
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-13  3:43   ` info-find-source Robert Thorpe
@ 2018-01-13  5:23     ` Marcin Borkowski
  2018-01-13 16:31       ` info-find-source Drew Adams
  2018-01-13 15:50     ` info-find-source Drew Adams
       [not found]     ` <mailman.7314.1515821013.27995.help-gnu-emacs@gnu.org>
  2 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-13  5:23 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs, Emanuel Berg


On 2018-01-13, at 04:43, Robert Thorpe <rt@robertthorpeconsulting.com> wrote:

> Info has it's own keybindings.  That can be a little tricky, since "s"
> is the normal way to search rather than "C-s" or "M-s".  You can rebind
> these functions though.

I didn't know that!  I used to use C-s/C-r in Info all the time.  They
_do_ work there!

Then, maybe a year or two ago, I learned about the index and the `i'
keystroke, and now I can't understand how I used Info before.

Also, `C-h S', by the way.

I would really like it if someone set up a contest of "how fast can
someone use Info to search for things and come back to other things and
not get distracted by links and/or writing one's own functions to do
what you can do with stock Emacs better", and made Emanuel and me the
contestants.

;-)

Best,

--
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: info-find-source
  2018-01-13  3:43   ` info-find-source Robert Thorpe
  2018-01-13  5:23     ` info-find-source Marcin Borkowski
@ 2018-01-13 15:50     ` Drew Adams
       [not found]     ` <mailman.7314.1515821013.27995.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-01-13 15:50 UTC (permalink / raw)
  To: Robert Thorpe, Emanuel Berg; +Cc: help-gnu-emacs

> Info has it's own keybindings.  That can be a little tricky,
> since "s" is the normal way to search rather than "C-s" or "M-s".

`C-s' and `C-M-s' are normal ways of searching in Info.

In the beginning there was only `s': `C-s' searched only
the current node, but `s' searched across nodes.  As of
several releases ago `C-s' and `C-M-s' work fine across nodes.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: info-find-source
  2018-01-13  5:23     ` info-find-source Marcin Borkowski
@ 2018-01-13 16:31       ` Drew Adams
  2018-01-14  7:03         ` info-find-source Marcin Borkowski
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2018-01-13 16:31 UTC (permalink / raw)
  To: Marcin Borkowski, Robert Thorpe; +Cc: help-gnu-emacs, Emanuel Berg

> I would really like it if someone set up a contest of "how fast can
> someone use Info to search for things and come back to other things and
> not get distracted by links and/or writing one's own functions to do
> what you can do with stock Emacs better", and made Emanuel and me the
> contestants.

What I find most useful for finding stuff: `i', combined
with better pattern-matching for the index-entry
completion candidates.

I use Icicles.  That means that index entries, which
are what `i' completes your minibuffer contents to,
can be matched with regexps, including just substrings.

In Icicle mode, `i' is bound to command `icicle-Info-index'.
Besides giving you better pattern-matching, you can
optionally have it highlight index-entry candidates
in *Completions* that correspond to already-visited
nodes.  That way, you don't end up trying multiple
index entries in hopes of getting to some nodes you
haven't already checked out.

(Wrt seeing which nodes you've visited by link color,
face `info-xref-visited' helps, but if you want that
indication to persist across Emacs sessions you can
get that (togglable anytime) with `info+.el' minor
mode `Info-persist-history-mode'.) 

Even just substring matching makes `i' much, much more
useful, IMO.  (And yes, you can set vanilla Emacs to use
substring matching for `i'.  If you don't use Icicles
or similar then this is a good workaround/substitute.)

With Icicles you can incrementally match any number of
simple patterns (progressive completion), which is much
simpler and quicker than trying to come up with a single
regexp to match what you need.  (Not to mention more
powerful, as a single regexp is limited in terms of what
it matches.)  You can also match the complements of
patterns.

Beyond pattern-matching and indicated previously visited
nodes, `icicle-Info-index' is a multi-command, which
means that you can, with a single invocation, visit
any number of nodes, matching any patterns, in any
order.

Icicles also enhances other Info commands, in particular
`g'.  When you use it you can optionally match node names
or node _content_, or both at once.

https://www.emacswiki.org/emacs/Icicles_-_Info_Enhancements

https://www.emacswiki.org/emacs/Icicles_-_Nutshell_View#ProgressiveCompletion




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]   ` <mailman.7313.1515820700.27995.help-gnu-emacs@gnu.org>
@ 2018-01-14  2:54     ` Emanuel Berg
  2018-01-15 18:52       ` info-find-source Marcin Borkowski
       [not found]       ` <mailman.7433.1516042345.27995.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-14  2:54 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski wrote:

> This is the point. Underneath, Info is
> *still* linear.

Of course, because otherwise it couldn't be put
into a single file where all the items appear
in order!

(Here "Info" means the data, or documentation,
not the browser or Emacs mode.)

> I can't see *any* gain from your function.

OK, the gain is it brings up the raw source
file associated with the info file you are
browsing. Or at least that is the purpose as
I haven't had time testing it a lot.
But because there exists a correlation between
the source file and what is displayed with the
info browser, the Holy Grail cannot be farther
away than the expected initial problems.

Actually, I cannot see "any gain" from
displaying the data as a tree! The only gain
I can see is hypertext. I see the point of
that, but I see that as something similar of,
you ask a person "how do you do X? what do you
need to do it?" and s/he says "Ask P about
that. Or go to the HW store and ask them" - if
you on the contrary know what data you desire,
and you know where it is, there is no need for
any form of hypertext, be it "On-Line" or on
the Internet. Instead of following links you go
directly to the Rainbow's End, acquire the
item, and return.

The drawbacks from using Info compared to text
are it's a mode from which you have much less
experience and thus much less fluency, and it
isn't always true that all your tweaks and
extensions fit seamlessly into info, while this
cannot be an issue for text, as that is the
original habitate anyway!

> And if I really wanted something like that,
> I'd probably use "no new keystrokes to learn"
> (using your own words!) and stick with plain
> old `C-x n w'.
>
> Please try it out and tell me how your
> solution is superior.

You don't have to do `M-x text-mode RET' after
you do `C-x n w'?

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]     ` <mailman.7314.1515821013.27995.help-gnu-emacs@gnu.org>
@ 2018-01-14  2:57       ` Emanuel Berg
  2018-01-14  7:00         ` info-find-source Marcin Borkowski
       [not found]         ` <mailman.7369.1515913231.27995.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-14  2:57 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski wrote:

>> Info has it's own keybindings. That can be
>> a little tricky, since "s" is the normal way
>> to search rather than "C-s" or "M-s".
>> You can rebind these functions though.
>
> I didn't know that!

To quote the late Cipher, dreaming of
re-entering the Matrix without remembering
anything, "ignorance is a bliss".

> Then, maybe a year or two ago, I learned
> about the index and the `i' keystroke, and
> now I can't understand how I used
> Info before.

Unnecessary in text-mode, of course.

> I would really like it if someone set up
> a contest of "how fast can someone use Info
> to search for things and come back to other
> things and not get distracted by links and/or
> writing one's own functions to do what you
> can do with stock Emacs better", and made
> Emanuel and me the contestants.

If so, I will not only defeat you. I will
punish you :)

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-14  2:57       ` info-find-source Emanuel Berg
@ 2018-01-14  7:00         ` Marcin Borkowski
       [not found]         ` <mailman.7369.1515913231.27995.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-14  7:00 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2018-01-14, at 03:57, Emanuel Berg <moasen@zoho.com> wrote:

> Marcin Borkowski wrote:
>
>>> Info has it's own keybindings. That can be
>>> a little tricky, since "s" is the normal way
>>> to search rather than "C-s" or "M-s".
>>> You can rebind these functions though.
>>
>> I didn't know that!
>
> To quote the late Cipher, dreaming of
> re-entering the Matrix without remembering
> anything, "ignorance is a bliss".
>
>> Then, maybe a year or two ago, I learned
>> about the index and the `i' keystroke, and
>> now I can't understand how I used
>> Info before.
>
> Unnecessary in text-mode, of course.

Seriously?  Try C-s'ing the string "interactive" your way to find out
about the (interactive) codes.

In Emacs Lisp Reference:

C-x n w
M-x how-many RET
interactive RET

result: 515 hits.  The "right" one is about 1/3 down the list.

>> I would really like it if someone set up
>> a contest of "how fast can someone use Info
>> to search for things and come back to other
>> things and not get distracted by links and/or
>> writing one's own functions to do what you
>> can do with stock Emacs better", and made
>> Emanuel and me the contestants.
>
> If so, I will not only defeat you. I will
> punish you :)

Wouldn't be so sure - see above. ;-)

Best,

--
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-13 16:31       ` info-find-source Drew Adams
@ 2018-01-14  7:03         ` Marcin Borkowski
  2018-01-16 23:10           ` info-find-source Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-14  7:03 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs, Emanuel Berg, Robert Thorpe


On 2018-01-13, at 17:31, Drew Adams <drew.adams@oracle.com> wrote:

>> I would really like it if someone set up a contest of "how fast can
>> someone use Info to search for things and come back to other things and
>> not get distracted by links and/or writing one's own functions to do
>> what you can do with stock Emacs better", and made Emanuel and me the
>> contestants.
>
> What I find most useful for finding stuff: `i', combined
> with better pattern-matching for the index-entry
> completion candidates.
>
> I use Icicles.  That means that index entries, which
> are what `i' completes your minibuffer contents to,
> can be matched with regexps, including just substrings.

I stopped using Icicles, since I did not use it often enough to memorize
all the cool stuff in there; also, it was not as fast as I wanted.
I switched to Ivy, which is definitely less powerful, but good enough
for me, and much faster than Icicles.

In Ivy, if you search for "abc xyz", it basically transforms it to
"abc.*xyz" under the hood.  Very useful, and covers 99% of my use cases.

Still, I do appreciate Icicles - I just don't really need its power (or
at least I haven't yet discovered that I do;-)).

Best,

--
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]         ` <mailman.7369.1515913231.27995.help-gnu-emacs@gnu.org>
@ 2018-01-15  4:17           ` Emanuel Berg
  2018-01-15 18:54             ` info-find-source Marcin Borkowski
       [not found]             ` <mailman.7435.1516042498.27995.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-15  4:17 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski wrote:

> Seriously? Try C-s'ing the string
> "interactive" your way to find out about the
> (interactive) codes.
>
> In Emacs Lisp Reference:
>
> C-x n w M-x how-many RET interactive RET
>
> result: 515 hits. The "right" one is about
> 1/3 down the list.

This is the nature of this kind of search.
If you are searching for an item that appears
several times, and an instance somewhere in the
middle is the desired one, then yes, search
will have to visit each preceding instance if
it starts at the beginning of the document.

This situation is a part of, but not restricted
to, the described "one file" method.

However in time you will be more sophisticated
with your searches. It'll also give you
a spacial awareness (spacial as in "space", not
special) of the document and what it contains,
which will benefit searching - your use of it -
even more.

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-14  2:54     ` info-find-source Emanuel Berg
@ 2018-01-15 18:52       ` Marcin Borkowski
       [not found]       ` <mailman.7433.1516042345.27995.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-15 18:52 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2018-01-14, at 03:54, Emanuel Berg <moasen@zoho.com> wrote:

> Marcin Borkowski wrote:
>
> Actually, I cannot see "any gain" from
> displaying the data as a tree! The only gain
> I can see is hypertext. I see the point of
> that, but I see that as something similar of,
> you ask a person "how do you do X? what do you
> need to do it?" and s/he says "Ask P about
> that. Or go to the HW store and ask them" - if
> you on the contrary know what data you desire,
> and you know where it is, there is no need for
> any form of hypertext, be it "On-Line" or on
> the Internet. Instead of following links you go
> directly to the Rainbow's End, acquire the
> item, and return.

Hypertext is an important gain.  Convenience is another: many keys in
Info do not need two keystrokes (`i' compared to `C-s'), so I can use
Info with one hand.  (And yes, I do it quite often.)

> The drawbacks from using Info compared to text
> are it's a mode from which you have much less
> experience and thus much less fluency, and it
> isn't always true that all your tweaks and
> extensions fit seamlessly into info, while this
> cannot be an issue for text, as that is the
> original habitate anyway!

But Info derives from special-mode, and shares many keys with other
modes derived from that, like eww, dired etc.

>> And if I really wanted something like that,
>> I'd probably use "no new keystrokes to learn"
>> (using your own words!) and stick with plain
>> old `C-x n w'.
>>
>> Please try it out and tell me how your
>> solution is superior.
>
> You don't have to do `M-x text-mode RET' after
> you do `C-x n w'?

Again: why would I?  I would lose all the benefits (e.g., keybindings)
from Info-mode!

Best,

-- 
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-15  4:17           ` info-find-source Emanuel Berg
@ 2018-01-15 18:54             ` Marcin Borkowski
       [not found]             ` <mailman.7435.1516042498.27995.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-15 18:54 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2018-01-15, at 05:17, Emanuel Berg <moasen@zoho.com> wrote:

> Marcin Borkowski wrote:
>
>> Seriously? Try C-s'ing the string
>> "interactive" your way to find out about the
>> (interactive) codes.
>>
>> In Emacs Lisp Reference:
>>
>> C-x n w M-x how-many RET interactive RET
>>
>> result: 515 hits. The "right" one is about
>> 1/3 down the list.
>
> This is the nature of this kind of search.
> If you are searching for an item that appears
> several times, and an instance somewhere in the
> middle is the desired one, then yes, search
> will have to visit each preceding instance if
> it starts at the beginning of the document.
>
> This situation is a part of, but not restricted
> to, the described "one file" method.
>
> However in time you will be more sophisticated
> with your searches. It'll also give you
> a spacial awareness (spacial as in "space", not
> special) of the document and what it contains,
> which will benefit searching - your use of it -
> even more.

Yes, I could train myself to do that.

But...  I have `i' in Info!  So why train myself to do something my
computer (using the information Emacs developers put in) can do better?

Best,

--
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]       ` <mailman.7433.1516042345.27995.help-gnu-emacs@gnu.org>
@ 2018-01-15 19:50         ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-15 19:50 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski wrote:

> Hypertext is an important gain.

Hypertext is an important gain to text systems
just like inheritance is to OO systems, that
said both are very easy to over-use and it
shouldn't be relied upon, neither from the
producer nor from the consumer side of
a computer system.

> Again: why would I? I would lose all the
> benefits (e.g., keybindings) from Info-mode!

That's the benefit: with text only, source file
only, there is no need for Info-mode or
any key that comes with it.

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]             ` <mailman.7435.1516042498.27995.help-gnu-emacs@gnu.org>
@ 2018-01-15 19:55               ` Emanuel Berg
  2018-01-16 23:58                 ` info-find-source Robert Thorpe
                                   ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-15 19:55 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski wrote:

>> This is the nature of this kind of search.
>> If you are searching for an item that
>> appears several times, and an instance
>> somewhere in the middle is the desired one,
>> then yes, search will have to visit each
>> preceding instance if it starts at the
>> beginning of the document. This situation is
>> a part of, but not restricted to, the
>> described "one file" method. However in time
>> you will be more sophisticated with your
>> searches. It'll also give you a spacial
>> awareness (spacial as in "space", not
>> special) of the document and what it
>> contains, which will benefit searching -
>> your use of it - even more.
>
> Yes, I could train myself to do that.
>
> But... I have `i' in Info! So why train
> myself to do something my computer (using the
> information Emacs developers put in) can
> do better?

Because you have already trained yourself to
edit text and code and that happens every day
from now on as well. No matter how much you
train with Info, you will never get to the
text/code level. And when you "train" with text
and code, you do amazing stuff - well,
hopefully, but almost certainly something more
interesting than how to navigate a browser...

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: info-find-source
  2018-01-14  7:03         ` info-find-source Marcin Borkowski
@ 2018-01-16 23:10           ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-01-16 23:10 UTC (permalink / raw)
  To: Marcin Borkowski; +Cc: help-gnu-emacs, Emanuel Berg, Robert Thorpe

[-- Attachment #1: Type: text/plain, Size: 5211 bytes --]

>> What I find most useful for finding stuff: `i',
>> combined with better pattern-matching for the
>> index-entry completion candidates.

Further in that post I said "Icicles or similar"
to characterize such "better pattern-matching".

My point was that key `i' is typically the best
way (IMO) to find stuff in Info.  And its power is
greatly increased by libraries that provide better
pattern-matching than what is offered by vanilla
Emacs.  Icicles is one such library.

>> I use Icicles.  That means that index entries,
>> which are what `i' completes your minibuffer
>> contents to, can be matched with regexps,
>> including just substrings.
> 
> I stopped using Icicles...  I switched to Ivy, which
> is definitely less powerful, but good enough...

If you prefer this or that or you don't use/need
this or that, that's fine.

Wrt Icicles and other pattern-matching libraries, FWIW:

When Icicles started exploring completion and what
could be done with it there was essentially nothing
besides vanilla-Emacs completion, which was itself
coded only in C (no `minibuffer.el' library yet, no
`completion-styles' - just basic prefix completion).

And completion wasn't used much in Emacs - mainly
just for file-finding, buffer-switching, and `M-x'.

IswitchB was the only completion-related thing that
did something interesting before Icicles.  Well,
there was also `icomplete.el', which incrementally
showed you some input completions, but you couldn't
do anything with them except use them as a guide
for what to continue typing.

Over time many Icicles features have been introduced
into new packages (Ido, Helm/Anything, Ivy) - years
later.  Ivy apparently introduced `ivy-occur'/`swiper'
in 2015.  Icicles introduced it (as `icicle-occur')
in 2006 (along with `icicle-search': same, but with
regexp-defined search contexts, not just lines).

That's all good, not bad.  "Imitation...flattery."

Icicles has introduced original ideas/features,
including:

 incremental completion (matches updated as you
 type), help on individual completion candidates,
 multi-commands (multiple actions on multiple
 candidates), progressive completion (narrowing,
 successive search patterns), match complementing,
 multi-completions (matching multiple things
 together - e.g. file names & contents), cycling
 candidates, sorting candidates on the fly, saving
 completion matches & combining them using set
 operations, key completion (which also shows the
 keys currently available), fuzzy completion,
 using completion for search...

Some Icicles ideas might be hare-brained or
half-baked.  Some that I originally thought were
probably crazy have turned out to be among the most
useful.  Others I thought might be more useful were
not so.

Any or all of them could be implemented in different,
some better, ways.  And different UIs could be used
to present them to users.  And there are bugs to be
fixed...

If another package picks up this or that Icicles
idea and implements it faster or in an easier-to-use
way than what Icicles provides that's a good thing,
not a bad thing.  Improvement is good.

One of the explicit purposes of Icicles, from the
outset, has been to serve as food for thought and
experiment (for me, in particular). The existence
of Helm (formerly Anything) and Ivy is, among
other things, a testament to the usefulness of
Icicles ideas - at least some of them ;-).

Other Icicles ideas have found their way to vanilla
Emacs and to other of my libraries: Isearch+, Info+,
Bookmark+, Dired+, LaCarte, highlight.el, mouse3.el,
palette.el, synonyms.el, ucs-cmds.el.

> since I did not use it often enough to memorize all
> the cool stuff in there;

There's really nothing to memorize.  But perhaps the
first thing is to know how to ask it.

* `S-TAB', to see all currently available keys and
  their commands (navigate the key hierarchy,
  including menus).

* `M-?' during minibuffer input for general help,
  with links to the complete help - in local files
  and on the Web - and with links to customizing
  the Icicles options & faces.

The `M-?' help also gives you the current status
of options, and (linked) key-sequences to change
status on the fly.  See attached, and imagine that
the commands and keys shown there are links that
perform their actions. 

If someone can't remember `M-?' then s?he can find
it in menu-bar `Icicles > Icicles Help' anytime.

> In Ivy, if you search for "abc xyz", it basically
> transforms it to "abc.*xyz" under the hood.  Very
> useful, and covers 99% of my use cases.

Same with Icicles, FWIW.  That's one of the 7
"fuzzy" completion methods it supports, besides
regexp matching and vanilla `completion-styles'.
You can make it your default method or choose it
or another using `M-('.

> Still, I do appreciate Icicles - I just don't
> really need its power (or at least I haven't yet
> discovered that I do;-)).

You probably don't "need" most of what Emacs or
Lisp has to offer either.  Few (none?) of us do.
It's available on demand, for when you do.  It
doesn't bother you when you don't.  Same for
Icicles, I hope.

[-- Attachment #2: general-help.txt --]
[-- Type: text/plain, Size: 50349 bytes --]

[Icicles Help on the Web]                        [Icicles Doc, Part 1]
[Icicles Options & Faces]                        [Icicles Doc, Part 2]

You are completing input for an Icicles multi-command.
To show help on individual candidates:

     Current candidate                       C-M-RET, C-M-mouse-2
     Next, previous candidate                C-M-down, C-M-up,
                                              C-M- plus mouse wheel
                    prefix-match candidate   C-M-end, C-M-home
                    apropos-match candidate  C-M-next, C-M-prior

To act on individual candidates:
     Current candidate                       C-RET, C-mouse-2
     Next, previous candidate                C-down, C-up,
                                              C- plus mouse wheel
                    prefix-match candidate   C-end, C-home
                    apropos-match candidate  C-next, C-prior
     All candidates at once                  C-! (each) or M-! (list)
     Delete object named by candidate        S-delete
     Object-action: apply a fn to candidate  M-RET

For alt action, use `C-S-' instead of `C-', but use `C-|' or `M-|',
     instead of `C-!' or `M-!', to act on all.



                    Icicles Minibuffer Completion
                    -----------------------------

Completion indicators:

  Mode line `Icy' lighter (additive):
    red = Completion available      (use `TAB' or `S-TAB' to complete)
    +   = Multi-command completion   (use `C-RET' to act on candidate)
    ||  = Multi-completion candidates  (use `C-M-j' to separate parts)
    ... = `icicle-max-candidates' shown        (use `C-x #' to change)

  Prompt prefix (exclusive):
    . = Simple completion
    + = Multi-command completion

You can complete your minibuffer input in several ways.
These are the main Icicles actions and their minibuffer key bindings:

 * Show Icicles minibuffer help (this).      M-?
     For help on individual completion candidates, see "Show help on
     individual completion candidates", below.

 * Abandon or commit your input.
     Abandon input                           C-g
     Commit input to Emacs                   RET
       Complete partial input, then commit   S-return

 * Toggle/cycle Icicles options on the fly.  Key:   	Currently:
     Highlighting of past inputs             C-pause	yes
     Highlighting of saved candidates        M-i s	yes
     Showing candidates with WYSIWYG         M-i w	yes
     Removal of duplicate candidates         M-i $	no
     Sort order                              C-,	alphabetical
     Alternative sort order                  M-,	by previous use alphabetically
     Swap alternative/normal sort            M-i M-,
     Case sensitivity                        M-i A	yes
     `.' matching newlines too (any char)    M-i M-.	no
     Escaping of special regexp chars        C-`	no
     Incremental completion                  M-i #	yes, if *Completions* showing
     Input expansion to common match (toggle)M-i "	yes
     Input expansion to common match (cycle) M-i M-"	always
     Hiding common match in `*Completions*'  C-x .	no
     Hiding no-match lines in `*Completions*' C-u C-x .	no
     Horizontal/vertical candidate layout    C-M-^	horizontal
     Completion-mode keys                    M-i TAB	unchanged
     S-TAB completion method                 M-(	apropos
     TAB completion method                   C-(	vanilla
     Vanilla completion style set (E23+)     C-M-(	nil
     Showing image-file thumbnails (E22+)    C-x t	image and name
     Showing candidate annotations           C-x C-a	yes
     Inclusion of proxy candidates           C-M-_	no
     Ignoring certain file extensions        M-i .	yes
     Expansion of directory candidates       C-x /	no
     Checking for remote file names          C-^	yes
     Considering network drives as remote    C-x :	yes
     Ignoring space prefix for buffer names  M-_	yes
     Using `C-' for multi-command actions    M-g	yes
     Using `~' for your home directory       M-~	yes
     `icicle-search' all-current highlights  C-^	no
     Whole-word searching                    M-q	no
     Removal of `icicle-search' highlighting M-i .	yes
     Replacement of whole search hit         M-_	yes
     Replacement of expanded common match    M-;	yes
     Searching complements of contexts       M-i ~	no

 * Regexp-quote input, then apropos-complete M-%

 * Change the set of completion candidates.  Modify your input.
     Edit your input                         (just edit in minibuffer)
     Erase your input (clear minibuffer)     M-k
     Goto/kill non-matching portion of input C-M-l
     Retrieve previous completion inputs     C-l, C-S-l
     Match another regexp (chaining)         M-*
     Satisfy another predicate (chaining)    M-&
     Remove a candidate from set of matches  delete, S-mouse-2
     Yank text at cursor into minibuffer     M-.
     Insert text (string) from a variable    C-=
     Insert `icicle-list-join-string'        C-M-j
     Insert previously entered input(s)      M-o
     Insert completion candidates(s)         M-r
     Insert key description (key completion) M-q

 * Complete your current input in the minibuffer.
     Apropos (regexp) completion             backtab
       Without displaying candidates         C-M-S-TAB
       Complete and match another regexp     S-SPC
     Prefix completion
       As much as possible                   TAB
         Without displaying candidates       C-M-tab
       A word at a time                      M-SPC
     Complete and commit S-return
     Complete search string using past input backtab

 * Display/navigate completions for current input (in `*Completions*').
     Show completion candidates
       Prefix completion                     TAB (repeat)
       Apropos completion                    backtab
     Move between minibuffer and list        C-insert
     Cycle among completion candidates       right, left, TAB, backtab
       Within a `*Completions*' column       down, up
     Choose a completion candidate           RET, M-x mouse-choose-completion

 * Cycle among input candidates.
     Completion candidates
       Current mode                          down, up, mouse wheel
       Prefix completion                     end, home
       Apropos completion                    next, prior
     Minibuffer history items                M-n, M-p
     Completion history items                C-l, C-S-l

 * Show help on individual completion candidates.
     Current candidate                       C-M-RET, C-M-mouse-2
     Next, previous candidate                C-M-down, C-M-up,
                                              C-M- plus mouse wheel
                    prefix-match candidate   C-M-end, C-M-home
                    apropos-match candidate  C-M-next, C-M-prior

 * Choose a previous input from the minibuffer history.
     Complete to insert a previous input     M-o
     Complete against history items          M-h, M-pause
     Restrict candidates to history items    M-pause
     Change to another history               C-M-pause
     List history items first in Completions M-i M-,
     Cycle among minibuffer history items    M-n, M-p

 * Delete history entries
     Delete current entry (cycling)          M-k
     Delete any or all entries               M-K

 * Multi-commands: Act on completion candidates.
   For alternative action, use `C-S-' instead of `C-', but
   `C-|' and `M-|' are alternative action versions of `C-!' and `M-!'.
     Current candidate                       C-RET, C-mouse-2
     Next, previous candidate                C-down, C-up,
                                             C- with mouse wheel
                    prefix-match candidate   C-end, C-home
                    apropos-match candidate  C-next, C-prior
     Act on each matching candidate, in turn C-!
     Act on the list of matching candidates  M-!
     Delete object named by candidate        S-delete
     Remove candidate from set of matches    delete, S-mouse-2
     Save candidate (add to those saved)     insert, M-S-mouse-2
     Object-action: apply a fn to candidate  M-RET

 * Act on multiple minibuffer inputs         M-R

 * Search and replace (e.g. `C-c `').  See also `icicle-search'.
     Use action keys (prefix `C-') to navigate.
     Use alternative action keys (prefix `C-S-') to replace matches.
     Toggle input highlighting at all hits   C-^
     Toggle whole-word searching             M-q
     Toggle `.' matching newlines too        M-i M-.
     Toggle escaping of special regexp chars C-`
     Toggle removal of search highlighting   M-i .

     Replace all                             M-|
     Redefine the replacement string         M-,
     Toggle literal replacement              M-i `
     Toggle replacement of whole search hit  M-_
     Toggle replacement of common match      M-;

 * Perform set operations on candidate sets.
     Remove candidate from current set       delete, S-mouse-2
     Add current candidate to saved set      insert, M-S-mouse-2
     Retrieve saved candidates from...
       `icicle-saved-completion-candidates'  C-M-<
       another variable                      C-M-{
       a cache file                          C-{
     Retrieve more saved candidates          C-<
     Save candidates in current set to...
       `icicle-saved-completion-candidates'  C-M->
       another variable                      C-M-}
       a cache file                          C-}
     Save more candidates to current set     C->
     Save, save more selected candidates     C-M-), C-)  with region
     Save multiple minibuffer inputs         M-S
     Clear all saved candidates              C-M-) with empty region
     Add new or update existing saved set
       M-x icicle-add/update-saved-completion-set
     Remove a saved completion set
       M-x icicle-remove-saved-completion-set
     Swap current and saved sets             C-%
     Define current set by evaluating sexp   C-:
     Restrict candidates to history items    M-pause
     Set complement                          C-~
     Set difference                          C--
     Set union                               C-+
     Set intersection                        C-*
     Set intersection using regexp           M-*
     Set intersection using predicate        M-&
       Save current predicate to a variable  C-M-&
       Insert string variable as input       C-=

 * Adjust Icicles options incrementally on the fly (uses Do Re Mi).
     `icicle-candidate-width-factor'        C-x w
     `icicle-max-candidates'                C-x #
     `icicle-swank-timeout'                 C-x 1
     `icicle-swank-prefix-length'           C-x 2
     `icicle-inter-candidates-min-spaces'   C-x |
     Zoom `*Completions*' (not an option)   C-x -   (Emacs 23+)

Remember: You can always input any character (e.g. TAB) that is bound
          to a command by preceding it with C-q.

Though it has no direct connection with completion, you can use `M-:'
in the minibuffer at any time to evaluate an Emacs-Lisp expression.
This calls `icicle-pp-eval-expression-in-minibuffer', which displays
the result in the echo area or a popup buffer, *Pp Eval Output*.
It also provides some of the Emacs-Lisp key bindings during expression
editing.
\f

Customize Icicles: `M-x icicle-customize-icicles-group'.
Summary of customizable options and faces (alphabetical order).

Some of the options can be toggled or cycled - the keys for this are
noted in parentheses.

* `case-fold-search', `completion-ignore-case',
  (`C-u') `read-file-name-completion-ignore-case'
                                         - Case sensitivity? (`C-A')
* `completion-ignored-extensions'        - Ignored filenames (`C-.')
* `icicle-act-before-cycle-flag'         - Act then cycle or reverse?
* `icicle-add-proxy-candidates-flag'     - Include proxies? (`C-M-_')
* `icicle-alternative-actions-alist'     - Overriding alt actions
* `icicle-alternative-sort-comparer'     - Other sort (`M-,', `C-M-,')
* `icicle-apropos-complete-keys*'        - Keys to apropos-complete
* `icicle-apropos-cycle-*-keys'          - Keys to apropos-cycle
* `icicle-bookmark-name-length-max'      - Max length of bookmark name
* `icicle-bookmark-refresh-cache-flag'   - Refresh bookmarks cache?
* `icicle-top-level-key-bindings'        - Bind top-level commands
* `icicle-buffer-*'                      - `icicle-buffer' options
* `icicle-candidate-width-factor'        - Width %%, candidate columns
* `icicle-change-region-background-flag' - Change region color?
* `icicle-change-sort-order-completion'  - Control `C-,' behavior
* `icicle-C-l-uses-completion-flag'      - `C-l' uses completion?
* `icicle-color-themes'                  - For `icicle-color-theme'
* `icicle-comint-dynamic-complete-replacements' - Comint complete fns
* `icicle-command-abbrev*'               - Command abbrev behavior
* `icicle-complete-key-anyway-flag'      - `S-TAB' must complete keys
* `icicle-complete-keys-self-insert-ranges'- `S-TAB' for self-insert?
* `icicle-completing-read+insert-keys'   - Keys for complete-on-demand
* `icicle-completion-history-max-length' - Completion history length
* `icicle-completion-key-bindings'       - minibuffer completion keys
* `icicle-completion-list-key-bindings'  - `*Completions*' bindings
* `icicle-Completions-display-min-input-chars'- Remove `*Completions*'
                                           if fewer chars input
* `icicle-completions-format'            - `*Completions*' layout
* `icicle-move-Completions-frame'        - `*Completions*' at edge?
* `icicle-Completions-text-scale-decrease'- `*Completions*' shrink
* `icicle-Completions-window-max-height' - Max lines, `*Completions*'
* `icicle-customize-save-flag'           - Save some options on quit?
* `icicle-default-cycling-mode'          - Default completion mode for
                                           per-mode cycling
* `icicle-default-thing-insertion'       - Control behavior of M-.
* `icicle-default-value'                 - How to treat default value
* `icicle-define-alias-commands-flag'    - Define top-level aliases?
* `icicle-deletion-action-flag'          - `S-delete' deletes?
* `icicle-dot-show-regexp-flag'          - Show regexp for `.'?
* `icicle-dot-string'                    - String that `.' inserts
* `icicle-expand-input-to-common-match'  - Expand your input? (`C-M-"')
* `icicle-expand-input-to-common-match-alt' - Expand your input? (`C-"')
* `icicle-file-*'                        - `icicle-file' options
* `icicle-filesets-as-saved-completion-sets-flag'- Use filesets?
* `icicle-guess-commands-in-path'        - Shell commands to complete
* `icicle-help-in-mode-line-delay'       - Secs to show candidate help
* `icicle-hide-common-match-in-Completions-flag'- Show common match?
* `icicle-hide-non-matching-lines-flag'  - Hide non-match lines?
* `icicle-highlight-historical-candidates-flag'
                                         - Highlight past input?
* `icicle-highlight-input-completion-failure*'- Input non-match sign
* `icicle-highlight-input-initial-whitespace-flag'
                                         - Highlight input whitespace?
* `icicle-highlight-lighter-flag'        - Highlight mode-line `Icy'
* `icicle-incremental-completion'        - Icompletion? (`C-#')
* `icicle-incremental-completion-delay'  - Delay before update cands
* `icicle-incremental-completion-threshold'- # of candidates for delay
* `icicle-inhibit-advice-functions'      - Advice-inhibited functions
* `icicle-inhibit-ding-flag'             - Suppress audible bell
* `icicle-input-string'                  - String inserted by `C-='
* `icicle-inter-candidates-min-spaces'   - Min spaces among candidates
* `icicle-isearch-complete-keys'         - Keys to complete search
* `icicle-key-complete-keys'             - Keys to complete keys
* `icicle-key-descriptions-use-<>-flag'  - Show key names with "<>"?
* `icicle-keymaps-for-key-completion'    - `S-TAB' = key-complete maps
* `icicle-kmacro-ring-max'               - Icicles `kmacro-ring-max'
* `icicle-levenshtein-distance'          - Levenshtein match distance
* `icicle-list-join-string'              - Multi-completion join
* `icicle-list-nth-parts-join-string'    - Join split-candidate parts
* `icicle-mark-position-in-candidate'    - Mark position in cycling
* `icicle-menu-items-to-history-flag'    - Add menus to history?
* `icicle-minibuffer-key-bindings'       - general minibuffer keys
* `icicle-minibuffer-setup-hook'         - Functions run after setup
* `icicle-modal-cycle-*-keys'            - Keys for modal cycling
* `icicle-option-type-prefix-arg-list'   - Prefix-args for `C-h C-o'
* `icicle-point-position-in-candidate'   - Cursor position in cycling
* `icicle-populate-interactive-history-flag'- Track interactive use?
* `icicle-pp-eval-expression-print-*'    - Print control for `pp-*'
* `icicle-prefix-complete-keys*'         - Keys to prefix-complete
* `icicle-prefix-cycle-*-keys'           - Keys to prefix-cycle
* `icicle-quote-shell-file-name-flag'    - Quote file name in shell?
* `icicle-read+insert-file-name-keys'    - Keys for on-demand file
* `icicle-regexp-quote-flag'             - Escape chars? (`C-`')
* `icicle-regexp-search-ring-max'        - `regexp-search-ring-max'
* `icicle-region-background'             - Background for region
* `icicle-require-match-flag'            - Override REQUIRE-MATCH?
* `icicle-saved-completion-sets'         - Completion sets for `C-M-<'
* `icicle-search-cleanup-flag'           - Remove search highlighting?
                                           (`C-.')
* `icicle-search-from-isearch-keys'      - Isearch-to-Icicles keys
* `icicle-search-highlight-all-current-flag'- In each hit (`C-^')
* `icicle-search-highlight-context-levels-flag' -
                                           Highlight match subgroups?
* `icicle-search-highlight-threshold'    - # hits to highlight at once
* `icicle-search-hook'                   - Functions run by `C-c `'
* `icicle-search-replace-common-match-flag' - Replace ECM? (`M-;')
* `icicle-search-replace-literally-flag' - Replace text literally?
* `icicle-search-replace-whole-candidate-flag' - Replace input match
                                           or whole search hit?(`M-_')
* `icicle-search-ring-max'               - Icicles `search-ring-max'
* `icicle-search-whole-word-flag'        - Find whole words? (`M-q')
* `icicle-show-Completions-help-flag'    - Show `*Completions*' help?
* `icicle-show-Completions-initially-flag'- Show `*Completions*' 1st?
* `icicle-show-multi-completion-flag'    - Show extra candidate info?
* `icicle-sort-comparer'                 - Sort candidates (`C-,')
* `icicle-sort-orders-alist'             - Predicates for sorting
* `icicle-special-candidate-regexp'      - To highlight special cands
* `icicle-S-TAB-completion-methods-alist'- `S-TAB' methods (`M-(')
* `icicle-swank-*'                       - Swank completion control
* `icicle-TAB-completion-methods'        - `TAB' methods (`C-(')
* `icicle-TAB-shows-candidates-flag'     - 1st `TAB' shows candidates?
* `icicle-test-for-remote-files-flag'    - Check remote files? (`C-^')
* `icicle-thing-at-point-functions'      - Functions to yank things
* `icicle-top-level-key-bindings'        - Top-level key bindings
* `icicle-top-level-when-sole-completion-*'- Exiting if one completion
* `icicle-touche-pas-aux-menus-flag'     - Add to standard menus?
* `icicle-transform-function'            - Remove duplicates (`C-$')
* `icicle-type-actions-alist'            - Objects and their types
* `icicle-unpropertize-completion-result-flag'- Properties in result?
* `icicle-update-input-hook'             - Fns run when input changes
* `icicle-use-~-for-home-dir-flag'       - Use `~' for $HOME? (`M-~')
* `icicle-use-C-for-actions-flag'        - `C-' for actions? (`M-g')
* `icicle-use-candidates-only-once-flag' - Remove used candidate?
* `icicle-word-completion-keys'          - Keys for word completion
* `icicle-WYSIWYG-Completions-flag'      - WYSIWYG `*Completions*'?
* `icicle-yank-function'                 - Yank function to use

Faces that highlight input in minibuffer.

* `icicle-complete-input'               - Input when it is complete
* `icicle-completion'                   - Completing?
* `icicle-input-completion-fail*'       - Non-match part of input
* `icicle-match-highlight-minibuffer'   - Matched part of input
* `icicle-multi-command-completion'     - Multi-command completion?
* `icicle-mustmatch-completion'         - Strict completion?
* `icicle-whitespace-highlight'         - Initial whitespace in input

Faces that highlight candidates in buffer `*Completions*'.

* `icicle-candidate-part'               - Part of candidate
* `icicle-common-match-highlight-Completions' - Max common substring
* `icicle-current-candidate-highlight'  - Current candidate (cycling)
* `icicle-extra-candidate'              - Extra candidate
* `icicle-historical-candidate'         - Highlight candidates used
* `icicle-match-highlight-Completions'  - Matched part of input
* `icicle-proxy-candidate'              - Proxy candidate
* `icicle-saved-candidate'              - Saved candidate
* `icicle-special-candidate'            - Special candidate

Faces that highlight information in the mode line.

* `icicle-completion'                   - Completing?
* `icicle-mode-line-help'               - Candidate help
* `icicle-multi-command-completion'     - Multi-command completion?
* `icicle-mustmatch-completion'         - Strict completion?

Faces that highlight for command `icicle-search'.

* `icicle-search-context-level-*'       - Regexp subgroup highlighting
* `icicle-search-current-input'         - What input matches
* `icicle-search-main-regexp-current'   - Current match of 1st regexp
* `icicle-search-main-regexp-others'    - Other matches of 1st regexp

Icicle mode defines many top-level commands.  For a list, see the
Commentary headers of files `icicles-cmd1.el' and `icicles-cmd2.el'.
\f

These are all of the top-level bindings in Icicle mode:

key             binding
---             -------

C-c             Prefix Command
C-h             Prefix Command
C-x             Prefix Command
ESC             Prefix Command
<S-f10>         icicle-complete-menu-bar
<S-f4>          icicle-kmacro
<f10>           lacarte-execute-menu-command
<pause>         icicle-switch-to/from-minibuffer
<remap>         Prefix Command

<remap> <abort-recursive-edit>  icicle-abort-recursive-edit
<remap> <apropos>               icicle-apropos
<remap> <apropos-command>       icicle-apropos-command
<remap> <apropos-user-option>   icicle-apropos-option
<remap> <apropos-value>         icicle-apropos-value
<remap> <apropos-zippy>         icicle-apropos-zippy
<remap> <bmkp-all-tags-jump>    icicle-bookmark-all-tags
<remap> <bmkp-all-tags-jump-other-window>
                                icicle-bookmark-all-tags-other-window
<remap> <bmkp-all-tags-regexp-jump>
                                icicle-bookmark-all-tags-regexp
<remap> <bmkp-all-tags-regexp-jump-other-window>
                                icicle-bookmark-all-tags-regexp-other-window
<remap> <bmkp-autofile-all-tags-jump>
                                icicle-bookmark-autofile-all-tags
<remap> <bmkp-autofile-all-tags-jump-other-window>
                                icicle-bookmark-autofile-all-tags-other-window
<remap> <bmkp-autofile-all-tags-regexp-jump>
                                icicle-bookmark-autofile-all-tags-regexp
<remap> <bmkp-autofile-all-tags-regexp-jump-other-window>
                                icicle-bookmark-autofile-all-tags-regexp-other-window
<remap> <bmkp-autofile-jump>    icicle-bookmark-autofile
<remap> <bmkp-autofile-jump-other-window>
                                icicle-bookmark-autofile-other-window
<remap> <bmkp-autofile-set>     icicle-bookmark-a-file
<remap> <bmkp-autofile-some-tags-jump>
                                icicle-bookmark-autofile-some-tags
<remap> <bmkp-autofile-some-tags-jump-other-window>
                                icicle-bookmark-autofile-some-tags-other-window
<remap> <bmkp-autofile-some-tags-regexp-jump>
                                icicle-bookmark-autofile-some-tags-regexp
<remap> <bmkp-autofile-some-tags-regexp-jump-other-window>
                                icicle-bookmark-autofile-some-tags-regexp-other-window
<remap> <bmkp-autonamed-jump>   icicle-bookmark-autonamed
<remap> <bmkp-autonamed-jump-other-window>
                                icicle-bookmark-autonamed-other-window
<remap> <bmkp-autonamed-this-buffer-jump>
                                icicle-bookmark-autonamed-this-buffer
<remap> <bmkp-bookmark-file-jump>
                                icicle-bookmark-bookmark-file
<remap> <bmkp-bookmark-list-jump>
                                icicle-bookmark-bookmark-list
<remap> <bmkp-bookmark-set-confirm-overwrite>
                                icicle-bookmark-cmd
<remap> <bmkp-desktop-jump>     icicle-bookmark-desktop
<remap> <bmkp-dired-jump>       icicle-bookmark-dired
<remap> <bmkp-dired-jump-other-window>
                                icicle-bookmark-dired-other-window
<remap> <bmkp-file-all-tags-jump>
                                icicle-bookmark-file-all-tags
<remap> <bmkp-file-all-tags-jump-other-window>
                                icicle-bookmark-file-all-tags-other-window
<remap> <bmkp-file-all-tags-regexp-jump>
                                icicle-bookmark-file-all-tags-regexp
<remap> <bmkp-file-all-tags-regexp-jump-other-window>
                                icicle-bookmark-file-all-tags-regexp-other-window
<remap> <bmkp-file-jump>        icicle-bookmark-file
<remap> <bmkp-file-jump-other-window>
                                icicle-bookmark-file-other-window
<remap> <bmkp-file-some-tags-jump>
                                icicle-bookmark-file-some-tags
<remap> <bmkp-file-some-tags-jump-other-window>
                                icicle-bookmark-file-some-tags-other-window
<remap> <bmkp-file-some-tags-regexp-jump>
                                icicle-bookmark-file-some-tags-regexp
<remap> <bmkp-file-some-tags-regexp-jump-other-window>
                                icicle-bookmark-file-some-tags-regexp-other-window
<remap> <bmkp-file-this-dir-all-tags-jump>
                                icicle-bookmark-file-this-dir-all-tags
<remap> <bmkp-file-this-dir-all-tags-jump-other-window>
                                icicle-bookmark-file-this-dir-all-tags-other-window
<remap> <bmkp-file-this-dir-all-tags-regexp-jump>
                                icicle-bookmark-file-this-dir-all-tags-regexp
<remap> <bmkp-file-this-dir-all-tags-regexp-jump-other-window>
                                icicle-bookmark-file-this-dir-all-tags-regexp-other-window
<remap> <bmkp-file-this-dir-jump>
                                icicle-bookmark-file-this-dir
<remap> <bmkp-file-this-dir-jump-other-window>
                                icicle-bookmark-file-this-dir-other-window
<remap> <bmkp-file-this-dir-some-tags-jump>
                                icicle-bookmark-file-this-dir-some-tags
<remap> <bmkp-file-this-dir-some-tags-jump-other-window>
                                icicle-bookmark-file-this-dir-some-tags-other-window
<remap> <bmkp-file-this-dir-some-tags-regexp-jump>
                                icicle-bookmark-file-this-dir-some-tags-regexp
<remap> <bmkp-file-this-dir-some-tags-regexp-jump-other-window>
                                icicle-bookmark-file-this-dir-some-tags-regexp-other-window
<remap> <bmkp-find-file>        icicle-find-file-handle-bookmark
<remap> <bmkp-find-file-all-tags>
                                icicle-find-file-all-tags
<remap> <bmkp-find-file-all-tags-other-window>
                                icicle-find-file-all-tags-other-window
<remap> <bmkp-find-file-all-tags-regexp>
                                icicle-find-file-all-tags-regexp
<remap> <bmkp-find-file-all-tags-regexp-other-window>
                                icicle-find-file-all-tags-regexp-other-window
<remap> <bmkp-find-file-other-window>
                                icicle-find-file-handle-bookmark-other-window
<remap> <bmkp-find-file-some-tags>
                                icicle-find-file-some-tags
<remap> <bmkp-find-file-some-tags-other-window>
                                icicle-find-file-some-tags-other-window
<remap> <bmkp-find-file-some-tags-regexp>
                                icicle-find-file-some-tags-regexp
<remap> <bmkp-find-file-some-tags-regexp-other-window>
                                icicle-find-file-some-tags-regexp-other-window
<remap> <bmkp-gnus-jump>        icicle-bookmark-gnus
<remap> <bmkp-gnus-jump-other-window>
                                icicle-bookmark-gnus-other-window
<remap> <bmkp-image-jump>       icicle-bookmark-image
<remap> <bmkp-image-jump-other-window>
                                icicle-bookmark-image-other-window
<remap> <bmkp-info-jump>        icicle-bookmark-info
<remap> <bmkp-info-jump-other-window>
                                icicle-bookmark-info-other-window
<remap> <bmkp-local-file-jump>  icicle-bookmark-local-file
<remap> <bmkp-local-file-jump-other-window>
                                icicle-bookmark-local-file-other-window
<remap> <bmkp-man-jump>         icicle-bookmark-man
<remap> <bmkp-man-jump-other-window>
                                icicle-bookmark-man-other-window
<remap> <bmkp-non-file-jump>    icicle-bookmark-non-file
<remap> <bmkp-non-file-jump-other-window>
                                icicle-bookmark-non-file-other-window
<remap> <bmkp-region-jump>      icicle-bookmark-region
<remap> <bmkp-region-jump-other-window>
                                icicle-bookmark-region-other-window
<remap> <bmkp-remote-file-jump>
                                icicle-bookmark-remote-file
<remap> <bmkp-remote-file-jump-other-window>
                                icicle-bookmark-remote-file-other-window
<remap> <bmkp-some-tags-jump>   icicle-bookmark-some-tags
<remap> <bmkp-some-tags-jump-other-window>
                                icicle-bookmark-some-tags-other-window
<remap> <bmkp-some-tags-regexp-jump>
                                icicle-bookmark-some-tags-regexp
<remap> <bmkp-some-tags-regexp-jump-other-window>
                                icicle-bookmark-some-tags-regexp-other-window
<remap> <bmkp-specific-buffers-jump>
                                icicle-bookmark-specific-buffers
<remap> <bmkp-specific-buffers-jump-other-window>
                                icicle-bookmark-specific-buffers-other-window
<remap> <bmkp-specific-files-jump>
                                icicle-bookmark-specific-files
<remap> <bmkp-specific-files-jump-other-window>
                                icicle-bookmark-specific-files-other-window
<remap> <bmkp-tag-a-file>       icicle-tag-a-file
<remap> <bmkp-temporary-jump>   icicle-bookmark-temporary
<remap> <bmkp-temporary-jump-other-window>
                                icicle-bookmark-temporary-other-window
<remap> <bmkp-this-buffer-jump>
                                icicle-bookmark-this-buffer
<remap> <bmkp-this-buffer-jump-other-window>
                                icicle-bookmark-this-buffer-other-window
<remap> <bmkp-untag-a-file>     icicle-untag-a-file
<remap> <bmkp-url-jump>         icicle-bookmark-url
<remap> <bmkp-url-jump-other-window>
                                icicle-bookmark-url-other-window
<remap> <bmkp-w3m-jump>         icicle-bookmark-w3m
<remap> <bmkp-w3m-jump-other-window>
                                icicle-bookmark-w3m-other-window
<remap> <bookmark-jump>         icicle-bookmark
<remap> <bookmark-jump-other-window>
                                icicle-bookmark-other-window
<remap> <bookmark-set>          icicle-bookmark-cmd
<remap> <customize-apropos>     icicle-customize-apropos
<remap> <customize-apropos-faces>
                                icicle-customize-apropos-faces
<remap> <customize-apropos-groups>
                                icicle-customize-apropos-groups
<remap> <customize-apropos-options>
                                icicle-customize-apropos-options
<remap> <customize-face>        icicle-customize-face
<remap> <customize-face-other-window>
                                icicle-customize-face-other-window
<remap> <dabbrev-completion>    icicle-dabbrev-completion
<remap> <delete-window>         icicle-delete-window
<remap> <delete-windows-for>    icicle-delete-window
<remap> <describe-package>      icicle-describe-package
<remap> <eval-expression>       icicle-pp-eval-expression
<remap> <exchange-point-and-mark>
                                icicle-exchange-point-and-mark
<remap> <execute-extended-command>
                                icicle-execute-extended-command
<remap> <find-file>             icicle-file
<remap> <find-file-other-window>
                                icicle-file-other-window
<remap> <find-file-read-only>   icicle-find-file-read-only
<remap> <find-file-read-only-other-window>
                                icicle-find-file-read-only-other-window
<remap> <find-tag>              icicle-find-tag
<remap> <find-tag-other-window>
                                icicle-find-first-tag-other-window
<remap> <insert-buffer>         icicle-insert-buffer
<remap> <kill-buffer>           icicle-kill-buffer
<remap> <kill-buffer-and-its-windows>
                                icicle-kill-buffer
<remap> <load-library>          icicle-load-library
<remap> <minibuffer-keyboard-quit>
                                icicle-abort-recursive-edit
<remap> <other-window>          icicle-other-window-or-frame
<remap> <other-window-or-frame>
                                icicle-other-window-or-frame
<remap> <pop-global-mark>       icicle-goto-global-marker-or-pop-global-mark
<remap> <pop-tag-mark>          icicle-pop-tag-mark
<remap> <pp-eval-expression>    icicle-pp-eval-expression
<remap> <repeat-complex-command>
                                icicle-repeat-complex-command
<remap> <set-mark-command>      icicle-goto-marker-or-set-mark-command
<remap> <switch-to-buffer>      icicle-buffer
<remap> <switch-to-buffer-other-window>
                                icicle-buffer-other-window
<remap> <where-is>              icicle-where-is
<remap> <yank>                  icicle-yank-maybe-completing
<remap> <yank-pop>              icicle-yank-pop-commands
<remap> <yank-pop-commands>     icicle-yank-pop-commands
<remap> <zap-to-char>           icicle-zap-to-char

C-h C-o         icicle-describe-option-of-type

ESC ESC         Prefix Command
M-`             lacarte-execute-menu-command
M-s             Prefix Command
C-M-/           icicle-dispatch-C-M-/

M-ESC C-x       icicle-command-abbrev
M-ESC x         lacarte-execute-command

M-s ESC         Prefix Command

C-x ESC         Prefix Command
C-x 4           Prefix Command
C-x 5           Prefix Command
C-x j           Prefix Command

C-c "           icicle-search-text-property
C-c $           icicle-search-word
C-c '           icicle-occur
C-c /           icicle-complete-thesaurus-entry
C-c =           icicle-imenu
C-c ^           icicle-search-keywords
C-c `           icicle-search-generic

M-s M-s         Prefix Command

M-s M-s C-l     icicle-search-pages
M-s M-s ESC     Prefix Command
M-s M-s ,       icicle-tags-search
M-s M-s D       icicle-search-defs-full
M-s M-s I       icicle-imenu-full
M-s M-s J       icicle-search-bookmarks-together
M-s M-s O       icicle-search-overlay-property
M-s M-s T       icicle-search-text-property
M-s M-s X       icicle-search-xml-element-text-node
M-s M-s b       icicle-search-buffer
M-s M-s c       icicle-search-char-property
M-s M-s d       icicle-search-defs
M-s M-s f       icicle-search-file
M-s M-s g       icicle-grep-saved-file-candidates
M-s M-s i       icicle-imenu
M-s M-s j       icicle-search-bookmark
M-s M-s k       icicle-search-keywords
M-s M-s l       icicle-search-lines
M-s M-s o       icicle-occur
M-s M-s p       icicle-search-paragraphs
M-s M-s s       icicle-search-sentences
M-s M-s t       icicle-search-thing
M-s M-s w       icicle-search-word
M-s M-s x       icicle-search-xml-element

C-x 4 j         Prefix Command

C-x j t         Prefix Command

C-x 5 o         icicle-select-frame

C-x M-e         icicle-execute-named-keyboard-macro

M-s M-s M-s     icicle-search-generic

C-x 4 j t       Prefix Command

C-x j t C-f     Prefix Command
C-x j t j       icicle-bookmark-tagged

C-x 4 j t C-f   Prefix Command
C-x 4 j t j     icicle-bookmark-tagged-other-window

C-x j t C-f C-f                 icicle-find-file-tagged

C-x 4 j t C-f C-f               icicle-find-file-tagged-other-window



These are all of the minibuffer bindings during completion:

key             binding
---             -------

C-a             icicle-beginning-of-line+
C-e             icicle-end-of-line+
C-g             icicle-abort-recursive-edit
TAB             icicle-prefix-complete
C-j             icicle-insert-newline-in-minibuffer
C-l             icicle-retrieve-previous-input
RET             exit-minibuffer
C-v             icicle-scroll-Completions-forward
C-w             icicle-kill-region
C-x             Prefix Command
ESC             Prefix Command
C-^             icicle-dispatch-C-^
SPC             icicle-self-insert
.               icicle-insert-dot-command
?               icicle-self-insert
C-S-a           icicle-toggle-case-sensitivity
C-S-l           icicle-retrieve-next-input
S-SPC           icicle-apropos-complete-and-narrow
C-!             icicle-all-candidates-action
C-"             icicle-toggle-expand-to-common-match
C-#             icicle-cycle-incremental-completion
C-$             icicle-toggle-transforming
C-%             icicle-candidate-set-swap
C-(             icicle-next-TAB-completion-method
C-)             icicle-candidate-set-save-more-selected
C-*             icicle-candidate-set-intersection
C-+             icicle-candidate-set-union
C-,             icicle-change-sort-order
C--             icicle-candidate-set-difference
C-.             icicle-dispatch-C-.
C-:             icicle-candidate-set-define
C-<             icicle-candidate-set-retrieve-more
C-=             icicle-insert-string-from-variable
C->             icicle-candidate-set-save-more
C-`             icicle-toggle-regexp-quote
C-{             icicle-candidate-set-retrieve-persistent
C-|             icicle-all-candidates-alt-action
C-}             icicle-candidate-set-save-persistently
C-~             icicle-candidate-set-complement
<C-M-S-TAB>             icicle-apropos-complete-no-display
<C-M-S-tab>                     icicle-apropos-complete-no-display
<C-M-down>      icicle-next-candidate-per-mode-help
<C-M-end>       icicle-help-on-next-prefix-candidate
<C-M-f1>        icicle-help-on-candidate
<C-M-help>      icicle-help-on-candidate
<C-M-home>      icicle-help-on-previous-prefix-candidate
<C-M-next>      icicle-help-on-next-apropos-candidate
<C-M-pause>     icicle-other-history
<C-M-prior>     icicle-help-on-previous-apropos-candidate
<C-M-return>    icicle-help-on-candidate
<C-M-tab>       icicle-prefix-complete-no-display
<C-M-up>        icicle-previous-candidate-per-mode-help
<C-M-wheel-down>                icicle-next-candidate-per-mode-help
<C-M-wheel-up>                  icicle-previous-candidate-per-mode-help
<C-S-down>      icicle-next-candidate-per-mode-alt-action
<C-S-end>       icicle-next-prefix-candidate-alt-action
<C-S-home>      icicle-previous-prefix-candidate-alt-action
<C-S-next>      icicle-next-apropos-candidate-alt-action
<C-S-pause>     icicle-toggle-WYSIWYG-Completions
<C-S-prior>     icicle-previous-apropos-candidate-alt-action
<C-S-return>    icicle-candidate-alt-action
<C-S-tab>       icicle-toggle-completion-mode-keys
<C-S-up>        icicle-previous-candidate-per-mode-alt-action
<C-S-wheel-down>                icicle-next-candidate-per-mode-alt-action
<C-S-wheel-up>                  icicle-previous-candidate-per-mode-alt-action
<C-down>        icicle-next-candidate-per-mode-action
<C-end>         icicle-next-prefix-candidate-action
<C-f1>          icicle-help-on-candidate
<C-help>        icicle-help-on-candidate
<C-home>        icicle-previous-prefix-candidate-action
<C-insert>      icicle-switch-to-Completions-buf
<C-next>        icicle-next-apropos-candidate-action
<C-pause>       icicle-toggle-highlight-historical-candidates
<C-prior>       icicle-previous-apropos-candidate-action
<C-return>      icicle-candidate-action
<C-tab>         file-cache-minibuffer-complete
<C-up>          icicle-previous-candidate-per-mode-action
<C-wheel-down>  icicle-next-candidate-per-mode-action
<C-wheel-up>    icicle-previous-candidate-per-mode-action
<M-S-backspace>                 icicle-erase-minibuffer
<M-S-delete>                    icicle-erase-minibuffer
<M-backtab>                     icicle-complete-keys
<M-pause>       icicle-keep-only-past-inputs
<M-return>      icicle-candidate-read-fn-invoke
<M-up>          1on1-fit-minibuffer-frame
<S-backspace>   icicle-apropos-complete-and-widen
<S-delete>      icicle-delete-candidate-object
<S-pause>       icicle-toggle-highlight-saved-candidates
<S-return>      icicle-apropos-complete-and-exit
<XF86Back>      previous-history-element
<XF86Forward>   next-history-element
<backtab>       icicle-apropos-complete
<delete>        icicle-remove-candidate
<down>          icicle-next-candidate-per-mode
<end>           icicle-next-prefix-candidate
<home>          icicle-previous-prefix-candidate
<icicle-is-completion-map>      ignore
<insert>        icicle-save/unsave-candidate
<next>          icicle-next-apropos-candidate
<nil>           Prefix Command
<prior>         icicle-previous-apropos-candidate
<remap>         Prefix Command
<tab>           icicle-prefix-complete
<up>            icicle-previous-candidate-per-mode
<wheel-down>    icicle-next-candidate-per-mode
<wheel-up>      icicle-previous-candidate-per-mode

C-x C-a         icicle-toggle-annotation
C-x ESC         Prefix Command
C-x #           icicle-doremi-increment-max-candidates+
C-x -           icicle-doremi-zoom-Completions+
C-x .           icicle-dispatch-C-x.
C-x /           icicle-toggle-expand-directory
C-x :           icicle-toggle-network-drives-as-remote
C-x t           icicle-cycle-image-file-thumbnail
C-x w           icicle-doremi-candidate-width-factor+
C-x |           icicle-doremi-inter-candidates-min-spaces+
C-x C-0         icicle-recomplete-from-original-domain
C-x C-<         bmkp-retrieve-more-icicle-search-hits

<nil> <C-M-wheel-down>          icicle-next-candidate-per-mode-help
<nil> <C-M-wheel-up>            icicle-previous-candidate-per-mode-help
<nil> <C-S-wheel-down>          icicle-next-candidate-per-mode-alt-action
<nil> <C-S-wheel-up>            icicle-previous-candidate-per-mode-alt-action
<nil> <C-wheel-down>            icicle-next-candidate-per-mode-action
<nil> <C-wheel-up>              icicle-previous-candidate-per-mode-action
<nil> <wheel-down>              icicle-next-candidate-per-mode
<nil> <wheel-up>                icicle-previous-candidate-per-mode

<remap> <backward-delete-char-untabify>
                                icicle-backward-delete-char-untabify
<remap> <backward-kill-paragraph>
                                icicle-backward-kill-paragraph
<remap> <backward-kill-sentence>
                                icicle-backward-kill-sentence
<remap> <backward-kill-sexp>    icicle-backward-kill-sexp
<remap> <backward-kill-word>    icicle-backward-kill-word
<remap> <delete-backward-char>  icicle-delete-backward-char
<remap> <delete-char>           icicle-delete-char
<remap> <digit-argument>        icicle-digit-argument
<remap> <kill-line>             icicle-kill-line
<remap> <kill-paragraph>        icicle-kill-paragraph
<remap> <kill-sexp>             icicle-kill-sexp
<remap> <kill-word>             icicle-kill-word
<remap> <mouse-yank-secondary>  icicle-mouse-yank-secondary
<remap> <negative-argument>     icicle-negative-argument
<remap> <reposition-window>     icicle-goto/kill-failed-input
<remap> <self-insert-command>   icicle-self-insert
<remap> <transpose-chars>       icicle-transpose-chars
<remap> <transpose-sexps>       icicle-transpose-sexps
<remap> <transpose-words>       icicle-transpose-words
<remap> <universal-argument>    icicle-universal-argument
<remap> <yank-pop>              icicle-yank-pop

C-M-j           icicle-insert-list-join-string
M-RET           icicle-candidate-read-fn-invoke
C-M-^           icicle-toggle-completions-format
C-M-_           icicle-toggle-proxy-candidates
M-SPC           icicle-prefix-word-complete
M-!             icicle-all-candidates-list-action
M-$             icicle-candidate-set-truncate
M-%             icicle-regexp-quote-input
M-&             icicle-narrow-candidates-with-predicate
M-(             icicle-next-S-TAB-completion-method
M-*             icicle-narrow-candidates
M-+             icicle-widen-candidates
M-,             icicle-dispatch-M-comma
M-;             icicle-toggle-search-replace-common-match
M-_             icicle-dispatch-M-_
M-g             icicle-toggle-C-for-actions
M-h             icicle-history
M-i             icicle-toggle-map
M-m             icicle-toggle-show-multi-completion
M-q             icicle-dispatch-M-q
M-r             icicle-roundup
M-v             icicle-scroll-Completions-backward
M-|             icicle-all-candidates-list-alt-action
M-~             icicle-toggle-~-for-home-dir
C-M-"           icicle-cycle-expand-to-common-match
C-M-#           icicle-toggle-icomplete-mode
C-M-&           icicle-save-predicate-to-variable
C-M-(           icicle-next-completion-style-set
C-M-)           icicle-candidate-set-save-selected
C-M-+           icicle-plus-saved-sort
C-M-,           icicle-toggle-alternative-sorting
C-M-.           icicle-toggle-dot
C-M-;           icicle-toggle-ignoring-comments
C-M-<           icicle-candidate-set-retrieve
C-M->           icicle-candidate-set-save
C-M-`           icicle-toggle-literal-replacement
C-M-{           icicle-candidate-set-retrieve-from-variable
C-M-}           icicle-candidate-set-save-to-variable
C-M-~           icicle-toggle-search-complementing-domain

M-i TAB         icicle-toggle-completion-mode-keys
M-i ESC         Prefix Command
M-i "           icicle-toggle-expand-to-common-match
M-i #           icicle-cycle-incremental-completion
M-i $           icicle-toggle-transforming
M-i ,           icicle-toggle-sorting
M-i .           icicle-dispatch-C-.
M-i /           icicle-toggle-expand-directory
M-i :           icicle-toggle-network-drives-as-remote
M-i ;           icicle-toggle-ignoring-comments
M-i <           icicle-toggle-angle-brackets
M-i A           icicle-toggle-case-sensitivity
M-i F           icicle-toggle-include-cached-files
M-i ^           icicle-dispatch-C-^
M-i _           icicle-dispatch-M-_
M-i `           icicle-toggle-literal-replacement
M-i a           icicle-toggle-annotation
M-i g           icicle-toggle-C-for-actions
M-i h           icicle-dispatch-C-x.
M-i m           icicle-toggle-show-multi-completion
M-i p           icicle-toggle-proxy-candidates
M-i q           icicle-dispatch-M-q
M-i r           icicle-toggle-include-recent-files
M-i s           icicle-toggle-highlight-saved-candidates
M-i t           icicle-cycle-image-file-thumbnail
M-i w           icicle-toggle-WYSIWYG-Completions
M-i ~           icicle-toggle-search-complementing-domain
M-i C-`         icicle-toggle-regexp-quote
M-i <backtab>   icicle-complete-keys
M-i <pause>     icicle-toggle-highlight-historical-candidates

C-x C-f         icicle-resolve-file-name

C-M-v           icicle-scroll-forward
C-M-y           icicle-yank-secondary
M-.             icicle-insert-string-at-point
M-:             icicle-pp-eval-expression-in-minibuffer
M-?             icicle-minibuffer-help
M-K             icicle-clear-current-history
M-R             icicle-multi-inputs-act
M-S             icicle-multi-inputs-save
M-k             icicle-erase-minibuffer-or-history-element
M-n             next-history-element
M-o             icicle-insert-history-element
M-p             previous-history-element
M-r             previous-matching-history-element
  (that binding is currently shadowed by another mode)
M-s             next-matching-history-element
C-M-S-c         icicle-completing-read+insert
C-M-S-f         icicle-read+insert-file-name
C-M-S-t         icicle-top-level
C-M-S-v         icicle-scroll-backward
ESC <M-backtab>                 icicle-complete-keys

C-x C-M-l       icicle-display-candidates-in-Completions
C-x C-M-<       bmkp-retrieve-icicle-search-hits
C-x C-M->       bmkp-set-icicle-search-hits-bookmark

M-i M-"         icicle-cycle-expand-to-common-match
M-i M-#         icicle-toggle-icomplete-mode
M-i M-,         icicle-toggle-alternative-sorting
M-i M-.         icicle-toggle-dot
M-i M-;         icicle-toggle-search-replace-common-match
M-i M-^         icicle-toggle-completions-format
M-i M-i         icicle-toggle-option
M-i M-~         icicle-toggle-~-for-home-dir
M-i ESC <backtab>               icicle-complete-keys
______________________________________________________________________

Send an Icicles bug report: `M-x icicle-send-bug-report'.

[Icicles Help on the Web]                        [Icicles Doc, Part 1]
[Icicles Options & Faces]                        [Icicles Doc, Part 2]


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-15 19:55               ` info-find-source Emanuel Berg
@ 2018-01-16 23:58                 ` Robert Thorpe
  2018-01-19  6:22                 ` info-find-source Marcin Borkowski
       [not found]                 ` <mailman.7609.1516342943.27995.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 838+ messages in thread
From: Robert Thorpe @ 2018-01-16 23:58 UTC (permalink / raw)
  To: Emanuel Berg, Marcin Borkowski; +Cc: help-gnu-emacs

Emanuel Berg <moasen@zoho.com> writes:

> Marcin Borkowski wrote:
>
....
>> Yes, I could train myself to do that.
>>
>> But... I have `i' in Info! So why train
>> myself to do something my computer (using the
>> information Emacs developers put in) can
>> do better?
>
> Because you have already trained yourself to
> edit text and code and that happens every day
> from now on as well. No matter how much you
> train with Info, you will never get to the
> text/code level. And when you "train" with text
> and code, you do amazing stuff - well,
> hopefully, but almost certainly something more
> interesting than how to navigate a browser...

I agree with Marcin Borkowski.

I think it's a mistake to over-emphasise the editing modes, and their
keybindings.  The viewing modes and the special modes are just as
important.

I spend a great deal of time in Dired, Info, Help and reading mail.  I
also spend a fair amount of time in View, Occur, Grep, Find, Compile and
Shell.

In my experience it's worth becoming reasonably familiar with those
modes and their keybindings.  It's true that doing that means less
practice with the normal editing keybindings.  However, as you get
better at using those, each increment of extra skill comes more slowly.
You reach a point of diminishing returns.  At that stage it's worthwhile
to pay more attention to the special modes.

I don't expect you to necessarily take my advice.  I'm just giving my
opinion.

BR,
Robert Thorpe



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-15 19:55               ` info-find-source Emanuel Berg
  2018-01-16 23:58                 ` info-find-source Robert Thorpe
@ 2018-01-19  6:22                 ` Marcin Borkowski
       [not found]                 ` <mailman.7609.1516342943.27995.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-19  6:22 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2018-01-15, at 20:55, Emanuel Berg <moasen@zoho.com> wrote:

> [...]  No matter how much you
> train with Info, you will never get to the
> text/code level.  [...]

Wrong.  Info is a special mode, so uses keys without modifiers like...
"escape-meta-alt-control-shift";-).  That's faster.  (And operable with
one hand!)

Best,

-- 
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]                 ` <mailman.7609.1516342943.27995.help-gnu-emacs@gnu.org>
@ 2018-01-19  7:12                   ` Emanuel Berg
  2018-01-19 20:31                     ` info-find-source Marcin Borkowski
       [not found]                     ` <mailman.7650.1516393881.27995.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-19  7:12 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski wrote:

>> No matter how much you train with Info, you
>> will never get to the text/code level.
>
> Wrong. Info is a special mode, so uses keys
> without modifiers like...
> "escape-meta-alt-control-shift";-).
> That's faster. (And operable with one hand!)

Perhaps you should look into your editing
mode keybindings?

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-19  7:12                   ` info-find-source Emanuel Berg
@ 2018-01-19 20:31                     ` Marcin Borkowski
  2018-01-19 21:05                       ` info-find-source Drew Adams
       [not found]                       ` <mailman.7653.1516395915.27995.help-gnu-emacs@gnu.org>
       [not found]                     ` <mailman.7650.1516393881.27995.help-gnu-emacs@gnu.org>
  1 sibling, 2 replies; 838+ messages in thread
From: Marcin Borkowski @ 2018-01-19 20:31 UTC (permalink / raw)
  To: Emanuel Berg; +Cc: help-gnu-emacs


On 2018-01-19, at 08:12, Emanuel Berg <moasen@zoho.com> wrote:

> Marcin Borkowski wrote:
>
>>> No matter how much you train with Info, you
>>> will never get to the text/code level.
>>
>> Wrong. Info is a special mode, so uses keys
>> without modifiers like...
>> "escape-meta-alt-control-shift";-).
>> That's faster. (And operable with one hand!)
>
> Perhaps you should look into your editing
> mode keybindings?

In editing mode, `a' to `z' run self-insrt-command.  That's enough.
(Unless you use some kind of Vi(m) emulation, that's another story.)

Best,

-- 
Marcin Borkowski



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]                     ` <mailman.7650.1516393881.27995.help-gnu-emacs@gnu.org>
@ 2018-01-19 20:43                       ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-19 20:43 UTC (permalink / raw)
  To: help-gnu-emacs

Marcin Borkowski wrote:

> In editing mode, `a' to `z' run
> self-insrt-command. That's enough. (Unless
> you use some kind of Vi(m) emulation, that's
> another story.)

The really short and close shortcuts, which
involve either a single C or ditto M, and then
a single key, which doesn't require hand
movement, e.g. M-i, M-k, etc. - these are not
slower to any practical extent, and whats more,
you know them much better than anything that
comes out of info, because without even
practising 'em, that is what happens every day
of writing/editing text and code.

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: info-find-source
  2018-01-19 20:31                     ` info-find-source Marcin Borkowski
@ 2018-01-19 21:05                       ` Drew Adams
       [not found]                       ` <mailman.7653.1516395915.27995.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-01-19 21:05 UTC (permalink / raw)
  To: Marcin Borkowski, Emanuel Berg; +Cc: help-gnu-emacs

BTW/FWIW, about using Info in "editing mode" or not,
here's some trivia from the past...

Info mode used to bind command `Info-edit' to `e'.

That command lets you edit Info nodes, so you can
easily update or annotate your version of a given
manual, e.g., to correct or explain something to
yourself or add more information.

The command was declared "obsolete" in Emacs 24.4.
(Personally, I see no point in that.)  The reason
given is told by `C-h f':

   This function is obsolete since 24.4;
   editing Info nodes by hand is not recommended.

   Edit the contents of this Info node.

And `e' now just takes you to the end of the `*info*'
buffer.  (On n'arrete pas le progres.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]                       ` <mailman.7653.1516395915.27995.help-gnu-emacs@gnu.org>
@ 2018-01-19 22:19                         ` Emanuel Berg
  2018-01-19 23:21                           ` info-find-source Drew Adams
       [not found]                           ` <mailman.7656.1516404112.27995.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-19 22:19 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams wrote:

> This function is obsolete since 24.4; editing
> Info nodes by hand is not recommended.

I've seen this as well and wondered what it
meant... "By hand" - is the recommended way
having a bunch of text files and have that
compiled, or should one generate the
documentation straight from Elisp, including
docstrings and/or comments?

Also, when you could edit Info nodes that way,
where did those edits go? Using the useful and
sensible program that was the initial topic of
this thread, we find out that for example Gnus'
is here

    /usr/share/info/emacs-24/gnus.info

while SLIME is here

    ~/.emacs.d/elpa/slime-20170921.1000/slime.info

so while the SLIME's manual could be annotated
without any hazard, how will this be done with
Gnus' without sudo right and without the
changes/annotations being threatened
by updates?

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: info-find-source
  2018-01-19 22:19                         ` info-find-source Emanuel Berg
@ 2018-01-19 23:21                           ` Drew Adams
       [not found]                           ` <mailman.7656.1516404112.27995.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-01-19 23:21 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

> > This function is obsolete since 24.4; editing
> > Info nodes by hand is not recommended.
> 
> I've seen this as well and wondered what it
> meant... "By hand" - is the recommended way
> having a bunch of text files and have that
> compiled, or should one generate the
> documentation straight from Elisp, including
> docstrings and/or comments?

AFAIK, the "recommended" way is to build Info
files using `makeinfo' with TexInfo source files.
But I'm no expert on that.

> Also, when you could edit Info nodes that way,
> where did those edits go?

You can still edit Info nodes that way.  As I
said, command `Info-edit' still exists, and it
still works.

Try it.  You are asked to confirm whether you
really want to do it.  After you make your
changes, by editing normally, you use `C-c C-c'
and enter the name of the Info file you want
to write.

If you give the name of the current file (see
variable `Info-current-file', for instance)
then you are asked to confirm overwriting it.
If you instead give the name of a new file then
you create a new Info file.

In either case you provide an absolute file name,
so that's "where" your edits go.

> Using the useful and
> sensible program that was the initial topic of
> this thread, we find out that for example Gnus'
> is here /usr/share/info/emacs-24/gnus.info
> while SLIME is here:
> ~/.emacs.d/elpa/slime-20170921.1000/slime.info
> so while the SLIME's manual could be annotated
> without any hazard, how will this be done with
> Gnus' without sudo right and without the
> changes/annotations being threatened
> by updates?

If you change that slime.info file and then you
download the SLIME again to the same disk location
then that will overwrite your edits.

And yes, if you want to change that gnus.info
file then you need the necessary permissions
write to that location.  Nothing new here.

But you can have Info files wherever you want.
See option `Info-additional-directory-list',
and variables `Info-directory-list', and
`Info-default-directory-list'.  And see env
var `INFOPATH'.

To be clear, I'm not encouraging anyone to edit
Info files.  I'm just mentioning that you can.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]                           ` <mailman.7656.1516404112.27995.help-gnu-emacs@gnu.org>
@ 2018-01-20 19:49                             ` Emanuel Berg
  2018-01-20 20:18                               ` info-find-source Eli Zaretskii
                                                 ` (3 more replies)
  0 siblings, 4 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-20 19:49 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams wrote:

>>> This function is obsolete since 24.4;
>>> editing Info nodes by hand is
>>> not recommended.
>>
>> I've seen this as well and wondered what it
>> meant... "By hand" - is the recommended way
>> having a bunch of text files and have that
>> compiled, or should one generate the
>> documentation straight from Elisp, including
>> docstrings and/or comments?
>
> AFAIK, the "recommended" way is to build Info
> files using `makeinfo' with TexInfo source
> files.

Yes of course, it even says so first thing:

    This is slime.info, produced by makeinfo
    version 5.2 from slime.texi.

OK, so it is the *.info files* that one is
disencouraged from editing? Well yeah, why
would you do that?!

The "by hand" phrasing is where the confusion
begins because it seems to imply there is
a better way to "edit" them. But to me it seems
totally backward to edit the result of
compilation and I don't think I ever did that
because wouldn't not only update but also
recompilation overwrite the edits?

In general one should edit the source! and here
one could simply keep a text file with any
extra material.

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
  2018-01-20 19:49                             ` info-find-source Emanuel Berg
@ 2018-01-20 20:18                               ` Eli Zaretskii
       [not found]                               ` <<83bmhos2qd.fsf@gnu.org>
                                                 ` (2 subsequent siblings)
  3 siblings, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-01-20 20:18 UTC (permalink / raw)
  To: help-gnu-emacs

> From: Emanuel Berg <moasen@zoho.com>
> Date: Sat, 20 Jan 2018 20:49:22 +0100
> 
> The "by hand" phrasing is where the confusion
> begins because it seems to imply there is
> a better way to "edit" them. But to me it seems
> totally backward to edit the result of
> compilation and I don't think I ever did that
> because wouldn't not only update but also
> recompilation overwrite the edits?
> 
> In general one should edit the source! and here
> one could simply keep a text file with any
> extra material.

That command exists because Info files predate the makeinfo program;
the first Info files were made by hand, because makeinfo didn't yet
exist.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: info-find-source
       [not found]                               ` <<83bmhos2qd.fsf@gnu.org>
@ 2018-01-20 23:50                                 ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-01-20 23:50 UTC (permalink / raw)
  To: Eli Zaretskii, help-gnu-emacs

> > The "by hand" phrasing is where the confusion
> > begins because it seems to imply there is
> > a better way to "edit" them. But to me it seems
> > totally backward to edit the result of
> > compilation and I don't think I ever did that
> > because wouldn't not only update but also
> > recompilation overwrite the edits?
> >
> > In general one should edit the source! and here
> > one could simply keep a text file with any
> > extra material.
> 
> That command exists because Info files predate the makeinfo program;
> the first Info files were made by hand, because makeinfo didn't yet
> exist.

Maybe `Info-edit' existed before `makeinfo' and `Texinfo';
I don't recall.  But all three are very old.  I recall all
three back in the 80s, if I'm not mistaken.

And `Info-edit' was not deprecated until recently.  So
unless my memory is mistaken here, the lack of `makeinfo'
was not at all the reason that `Info-edit' remained
available (and bound to `e') all those years, even if it
was the case that it existed before `makeinfo'.

`Info-edit' can be useful for someone to simply modify
or add a bit of text, without needing `makeinfo' to be
available (installed).  IOW, it's use cases were never
limited to hand-creation of entire manuals.  That would
give a very false impression, IMHO, of what this command
was/is about.

For one thing, `Info-edit' is used from Info.  I'm not
sure it was ever intended to be used to write whole
manuals.  I'd guess that at least that was not the main
use case, especially all those years long.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: info-find-source
  2018-01-20 19:49                             ` info-find-source Emanuel Berg
  2018-01-20 20:18                               ` info-find-source Eli Zaretskii
       [not found]                               ` <<83bmhos2qd.fsf@gnu.org>
@ 2018-01-21  0:04                               ` Drew Adams
       [not found]                               ` <mailman.7695.1516493072.27995.help-gnu-emacs@gnu.org>
  3 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-01-21  0:04 UTC (permalink / raw)
  To: Emanuel Berg, help-gnu-emacs

> OK, so it is the *.info files* that one is
> disencouraged from editing? Well yeah, why
> would you do that?!

Quick correction/annotation/addition to one's
own copy of a manual.

Versus re-creating lots of stuff (after having
installed `makeinfo', if it's not installed
locally).

The existence of `makeinfo' does not obviate
the usefulness of `Info-edit'.

> The "by hand" phrasing is where the confusion
> begins because it seems to imply there is
> a better way to "edit" them. But to me it seems
> totally backward to edit the result of
> compilation

When that result is human-readable text it's
not a big deal to edit it.  Of course, if
you want the change to be reflected more
globally or to be shared etc. then you want
to only modify Texinfo source and generate
Info output.

You yourself argued for using *.info files in
plain editing mode (e.g. after `C-x n w').
Something like `Info-edit' is nowhere near as
extreme as that.  It's used for simple, quick
one-off changes or additions.

One doesn't have to argue _against_ generating
Info from Texinfo to see some utility in a 
command such as `Info-edit'.  Granted, that
utility is limited, and most people have never
even heard of it.  But that's not the same as
saying that it has no raison d'etre.
____

I mentioned that Info+ has a command,
`Info-merge-subnodes', for creating a
plain-text, prettified merge of Info nodes
(even a whole manual, but more typically a
section of a manual, however small).

Such a flat buffer can be useful sometimes
(e.g., plain-text printing, some kinds of
searching, sending excerpts), but I wouldn't
argue that `Info-merge-subnodes' is a _super_
useful command.  Some commands have limited
usefulness and use cases.  `Info-edit', like
`Info-merge-subnodes' is one such.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: info-find-source
       [not found]                               ` <mailman.7695.1516493072.27995.help-gnu-emacs@gnu.org>
@ 2018-01-21 11:49                                 ` Emanuel Berg
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg @ 2018-01-21 11:49 UTC (permalink / raw)
  To: help-gnu-emacs

Drew Adams wrote:

> You yourself argued for using *.info files in
> plain editing mode (e.g. after `C-x n w').
> Something like `Info-edit' is nowhere near as
> extreme as that. It's used for simple, quick
> one-off changes or additions.

Well, it is a thought to read the documentation
that way, and have the whole program file in
a single buffer, which operates like a regular
file and doesn't disappear when you do something
else or bring something else up thru some
interface which you aren't that apt with...

But after doing `C-x n w', and even `text-mode'
on top of that, you still have to disable
`read-only-mode' in order to edit it. And no
one has suggested that. So you hear me loud and
clear out there? DON'T DO THAT! Ha ha ha :)

-- 
underground experts united
http://user.it.uu.se/~embe8573


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2017-12-18  0:45               ` Radon Rosborough
@ 2018-01-25  4:35                 ` Radon Rosborough
  2018-01-25 15:43                   ` Clément Pit-Claudel
  2018-01-25 17:07                   ` [PATCH] Fixing package-initialize, adding early init file Stefan Monnier
  0 siblings, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-01-25  4:35 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 697 bytes --]

Since it has been more than a month with no response, I am re-posting
the patch which fixes the problems previously discussed [1] [2] [3]
with `package-initialize' by adding a second (optional) init-file
`early-init.el'. This patch includes some refactoring of the code in
`startup.el' to provide for loading any number of init-files in an
extensible way. I hope that the change can be included in Emacs 26.2
or Emacs 27.

Feedback much appreciated.

Best,
Radon Rosborough

[1]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
[2]: https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
[3]: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 33786 bytes --]

From c74093ab3dde9042a50eb65e7af46625a834b689 Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Dec 2017 17:31:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* lisp/startup.el (early-init-file): New variable, for the filename of
  the early init file after it has been loaded.

* lisp/startup.el (load-user-init-file): New function, used to
  eliminate duplicate code in loading the early and regular init
  files.

* lisp/startup.el (command-line): Load the early init file using
  `load-user-init-file'. Move the check for an invalid username to
  just before that, and move the initialization of the package system
  to just after. Load the regular init file using
  `load-user-init-file'.

* src/lread.c (Vuser_init_file): Note change in semantics due to its
  usage while loading the early init file.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove
  definition, usage, and documentation.

* lisp/emacs-lisp/package.el (package--init-file-ensured): Remove
  definition and usage.

* doc/lispref/os.texi: Document early init file.

* doc/lispref/package.texi: Document changes to when
  package-initialize is called, and advise against calling it in the
  init file.

* doc/emacs/package.texi: Document changes to when package-initialize
  is called.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
  init file.

* etc/NEWS: Document changes to startup and package.el.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00599.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00332.html
---
 doc/emacs/package.texi     |  28 +--
 doc/lispref/os.texi        |  14 ++
 doc/lispref/package.texi   |  16 +-
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  18 ++
 lisp/emacs-lisp/package.el |  71 +-------
 lisp/startup.el            | 425 +++++++++++++++++++++++++--------------------
 src/lread.c                |   2 +-
 8 files changed, 289 insertions(+), 289 deletions(-)

diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 215f50cb40..bd7cccce6c 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -253,30 +253,16 @@ Package Installation
 consult the package's help buffer.
 
   By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+subsequent Emacs sessions.  This happens at startup, before processing
+the init file but after processing the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an
+exception, Emacs does not load packages at startup if invoked with the
+@samp{-q} or @samp{--no-init-file} options (@xref{Initial Options}).
 
 @vindex package-enable-at-startup
   To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
-
-@findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+@code{package-enable-at-startup} to @code{nil}.  You must do this in
+the early init file.  Currently it cannot be done via Customize.
 
 @vindex package-load-list
   For finer control over package loading, you can use the variable
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 501960bdc3..c6990909ab 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -361,6 +361,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +385,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+  @dfn{early init file}, if it exists.  This is a file named
+  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
+  home directory.  The difference is that the early init file is
+  loaded much earlier during the startup process, so you can use it to
+  customize some things that are initialized before loading the
+  regular init file.  For example, here you can customize the process
+  of loading installed packages, by setting variables such as
+  @var{package-load-list} or
+  @var{package-enable-at-startup}. @xref{Package Installation,,,
+  emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 153ee48741..2e93f29bd2 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -106,10 +106,12 @@ Packaging Basics
 
   Whenever Emacs starts up, it automatically calls the function
 @code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+after loading the early init file, but before loading the early init
+file and abbrev file (if any) and before running
+@code{after-init-hook} (@pxref{Startup Summary}).  Automatic package
+loading is disabled if the user option
+@code{package-enable-at-startup} is @code{nil}.  (Of course, the
+setting of this user option must be done in the early init file.)
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
@@ -123,6 +125,12 @@ Packaging Basics
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
 loading them; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index 1f6e10287d..36b7f87248 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -890,9 +890,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index 1382f96a37..4bbf3e237a 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -41,6 +41,24 @@ can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called early-init.el, in `user-emacs-directory'.  It is
+loaded very early in the startup process: in particular, before
+graphical elements such as the tool bar are initialized, and before
+the package manager is initialized.
+
++++
+** Emacs now initializes package.el before loading the init-file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to (package-initialize) into the
+init-file, which was previously done when Emacs was started.  Users
+who do not configure package.el variables such as `package-load-list'
+and `package-user-dir' need not make any configuration changes.  Users
+who do configure such variables should place the configuration into
+the newly introduced early init file, which is loaded before
+package.el is initialized.
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index f8b4cc888d..815b679cae 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1431,16 +1431,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1449,13 +1444,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1872,64 +1861,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 4575f1f94d..de85933983 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -312,6 +312,15 @@ inhibit-startup-hooks
 Currently this applies to: `emacs-startup-hook', `term-setup-hook',
 and `window-setup-hook'.")
 
+(defvar early-init-file nil
+  "File name, including directory, of user's early init file.
+If the file loaded had extension `.elc', and the corresponding
+source file exists, this variable contains the name of source
+file, suitable for use by functions like `custom-save-all' which
+edit the init file.  While Emacs loads and evaluates the init
+file, value is the real name of the file, regardless of whether
+or not it has the `.elc' extension.")
+
 (defvar keyboard-type nil
   "The brand of keyboard you are using.
 This variable is used to define the proper function and keypad
@@ -870,6 +879,129 @@ startup--setup-quote-display
           (when standard-display-table
             (aset standard-display-table char nil)))))))
 
+(defun load-user-init-file
+    (compute-filename &optional compute-alternate-filename load-defaults)
+  "Load a user init-file.
+COMPUTE-FILENAME is called with no arguments and should return
+the name of the init-file to load. If this file cannot be loaded,
+and COMPUTE-ALTERNATE-FILENAME is non-nil, then it is called with
+no arguments and should return the name of an alternate init-file
+to load. If LOAD-DEFAULTS is non-nil, then load default.el after
+the init-file.
+
+This function sets `user-init-file' to the name of the loaded
+init-file, or to a default value if loading is not possible."
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial
+         (if (eq init-file-debug t)
+             'startup
+           init-file-debug))
+        (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
+    (let ((debug-on-error debug-on-error-initial)
+          ;; We create an anonymous function here so that we can call
+          ;; it in different contexts depending on the value of
+          ;; `debug-on-error'.
+          (read-init-file
+           (lambda ()
+             (when init-file-user
+               (let ((init-file-name (funcall compute-filename)))
+
+                 ;; If `user-init-file' is t, then `load' will store
+                 ;; the name of the file that it loads into
+                 ;; `user-init-file'.
+                 (setq user-init-file t)
+                 (load init-file-name 'noerror 'nomessage)
+
+                 (when (eq user-init-file t)
+                   (let ((alt-file-name (funcall compute-alternate-filename)))
+                     (load alt-file-name 'noerror 'nomessage)
+
+                     ;; If we did not find the user's init file, set
+                     ;; user-init-file conclusively.  Don't let it be
+                     ;; set from default.el.
+                     (when (eq user-init-file t)
+                       (setq user-init-file init-file-name)))))
+
+               ;; If we loaded a compiled file, set `user-init-file' to
+               ;; the source version if that exists.
+               (when (equal (file-name-extension user-init-file)
+                            "elc")
+                 (let* ((source (file-name-sans-extension user-init-file))
+                        (alt (concat source ".el")))
+                   (setq source (cond ((file-exists-p alt) alt)
+                                      ((file-exists-p source) source)
+                                      (t nil)))
+                   (when source
+                     (when (file-newer-than-file-p source user-init-file)
+                       (message "Warning: %s is newer than %s"
+                                source user-init-file)
+                       (sit-for 1))
+                     (setq user-init-file source))))
+
+               (when load-defaults
+
+                 ;; Prevent default.el from changing the value of
+                 ;; `inhibit-startup-screen'.
+                 (let ((inhibit-startup-screen nil))
+                   (load "default" 'noerror 'nomessage)))))))
+      ;; Now call our anonymous function.
+      (if init-file-debug
+          ;; Do this without a `condition-case' if the user wants to
+          ;; debug.
+          (funcall read-init-file)
+        (condition-case error
+            (progn
+              (funcall read-init-file)
+
+              ;; If a previous init-file had an error, don't forget
+              ;; about that.
+              (unless init-file-had-error
+                (setq init-file-had-error nil)))
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+
+      ;; If we can tell that the init file altered debug-on-error,
+      ;; arrange to preserve the value that it set up.
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+
+    (when debug-on-error-should-be-set
+      (setq debug-on-error debug-on-error-from-init-file))
+
+    (unless (or (default-value 'enable-multibyte-characters)
+                (eq orig-enable-multibyte (default-value
+                                            'enable-multibyte-characters)))
+
+      ;; Init file changed to unibyte.  Reset existing multibyte
+      ;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
+      ;; Arguably this should only be done if they're free of
+      ;; multibyte characters.
+      (mapc (lambda (buffer)
+              (with-current-buffer buffer
+                (if enable-multibyte-characters
+                    (set-buffer-multibyte nil))))
+            (buffer-list))
+
+      ;; Also re-set the language environment in case it was
+      ;; originally done before unibyte was set and is sensitive to
+      ;; unibyte (display table, terminal coding system &c).
+      (set-language-environment current-language-environment))))
+
 (defun command-line ()
   "A subroutine of `normal-top-level'.
 Amongst another things, it parses the command-line arguments."
@@ -1021,6 +1153,69 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (load-user-init-file
+   (lambda ()
+     (expand-file-name
+      "early-init"
+      (file-name-as-directory
+       (concat "~" init-file-user "/.emacs.d")))))
+  (setq early-init-file user-init-file)
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1127,170 +1322,47 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
-    (let (debug-on-error-from-init-file
-	  debug-on-error-should-be-set
-	  (debug-on-error-initial
-	   (if (eq init-file-debug t) 'startup init-file-debug))
-	  (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
-      (let ((debug-on-error debug-on-error-initial)
-	    ;; This function actually reads the init files.
-	    (inner
-	     (function
-	      (lambda ()
-		(if init-file-user
-		    (let ((user-init-file-1
-			   (cond
-			     ((eq system-type 'ms-dos)
-			      (concat "~" init-file-user "/_emacs"))
-			     ((not (eq system-type 'windows-nt))
-			      (concat "~" init-file-user "/.emacs"))
-			     ;; Else deal with the Windows situation
-			     ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
-			      ;; Prefer .emacs on Windows.
-			      "~/.emacs")
-			     ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
-			      ;; Also support _emacs for compatibility, but warn about it.
-			      (push `(initialization
-				      ,(format-message
-					"`_emacs' init file is deprecated, please use `.emacs'"))
-				    delayed-warnings-list)
-			      "~/_emacs")
-			     (t ;; But default to .emacs if _emacs does not exist.
-			      "~/.emacs"))))
-		      ;; This tells `load' to store the file name found
-		      ;; into user-init-file.
-		      (setq user-init-file t)
-		      (load user-init-file-1 t t)
-
-		      (when (eq user-init-file t)
-			;; If we did not find ~/.emacs, try
-			;; ~/.emacs.d/init.el.
-			(let ((otherfile
-			       (expand-file-name
-				"init"
-				(file-name-as-directory
-				 (concat "~" init-file-user "/.emacs.d")))))
-			  (load otherfile t t)
-
-			  ;; If we did not find the user's init file,
-			  ;; set user-init-file conclusively.
-			  ;; Don't let it be set from default.el.
-			  (when (eq user-init-file t)
-			    (setq user-init-file user-init-file-1))))
-
-		      ;; If we loaded a compiled file, set
-		      ;; `user-init-file' to the source version if that
-		      ;; exists.
-		      (when (and user-init-file
-				 (equal (file-name-extension user-init-file)
-					"elc"))
-			(let* ((source (file-name-sans-extension user-init-file))
-			       (alt (concat source ".el")))
-			  (setq source (cond ((file-exists-p alt) alt)
-					     ((file-exists-p source) source)
-					     (t nil)))
-			  (when source
-			    (when (file-newer-than-file-p source user-init-file)
-			      (message "Warning: %s is newer than %s"
-				       source user-init-file)
-			      (sit-for 1))
-			    (setq user-init-file source))))
-
-		      (unless inhibit-default-init
-                        (let ((inhibit-startup-screen nil))
-                          ;; Users are supposed to be told their rights.
-                          ;; (Plus how to get help and how to undo.)
-                          ;; Don't you dare turn this off for anyone
-                          ;; except yourself.
-                          (load "default" t t)))))))))
-	(if init-file-debug
-	    ;; Do this without a condition-case if the user wants to debug.
-	    (funcall inner)
-	  (condition-case error
-	      (progn
-		(funcall inner)
-		(setq init-file-had-error nil))
-	    (error
-	     (display-warning
-	      'initialization
-	      (format-message "\
-An error occurred while loading `%s':\n\n%s%s%s\n\n\
-To ensure normal operation, you should investigate and remove the
-cause of the error in your initialization file.  Start Emacs with
-the `--debug-init' option to view a complete error backtrace."
-		      user-init-file
-		      (get (car error) 'error-message)
-		      (if (cdr error) ": " "")
-		      (mapconcat (lambda (s) (prin1-to-string s t))
-				 (cdr error) ", "))
-	      :warning)
-	     (setq init-file-had-error t))))
-
-      (if (and deactivate-mark transient-mark-mode)
-	    (with-current-buffer (window-buffer)
-	      (deactivate-mark)))
-
-	;; If the user has a file of abbrevs, read it (unless -batch).
-	(when (and (not noninteractive)
-		   (file-exists-p abbrev-file-name)
-		   (file-readable-p abbrev-file-name))
-	    (quietly-read-abbrev-file abbrev-file-name))
-
-	;; If the abbrevs came entirely from the init file or the
-	;; abbrevs file, they do not need saving.
-	(setq abbrevs-changed nil)
-
-	;; If we can tell that the init file altered debug-on-error,
-	;; arrange to preserve the value that it set up.
-	(or (eq debug-on-error debug-on-error-initial)
-	    (setq debug-on-error-should-be-set t
-		  debug-on-error-from-init-file debug-on-error)))
-      (if debug-on-error-should-be-set
-	  (setq debug-on-error debug-on-error-from-init-file))
-      (unless (or (default-value 'enable-multibyte-characters)
-		  (eq orig-enable-multibyte (default-value
-					      'enable-multibyte-characters)))
-	;; Init file changed to unibyte.  Reset existing multibyte
-	;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
-	;; Arguably this should only be done if they're free of
-	;; multibyte characters.
-	(mapc (lambda (buffer)
-		(with-current-buffer buffer
-		  (if enable-multibyte-characters
-		      (set-buffer-multibyte nil))))
-	      (buffer-list))
-	;; Also re-set the language environment in case it was
-	;; originally done before unibyte was set and is sensitive to
-	;; unibyte (display table, terminal coding system &c).
-	(set-language-environment current-language-environment)))
+    (load-user-init-file
+     (lambda ()
+       (cond
+        ((eq system-type 'ms-dos)
+         (concat "~" init-file-user "/_emacs"))
+        ((not (eq system-type 'windows-nt))
+         (concat "~" init-file-user "/.emacs"))
+        ;; Else deal with the Windows situation.
+        ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
+         ;; Prefer .emacs on Windows.
+         "~/.emacs")
+        ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
+         ;; Also support _emacs for compatibility, but warn about it.
+         (push `(initialization
+                 ,(format-message
+                   "`_emacs' init file is deprecated, please use `.emacs'"))
+               delayed-warnings-list)
+         "~/_emacs")
+        (t ;; But default to .emacs if _emacs does not exist.
+         "~/.emacs")))
+     (lambda ()
+       (expand-file-name
+        "init"
+        (file-name-as-directory
+         (concat "~" init-file-user "/.emacs.d"))))
+     (not inhibit-default-init))
+
+    (when (and deactivate-mark transient-mark-mode)
+      (with-current-buffer (window-buffer)
+        (deactivate-mark)))
+
+    ;; If the user has a file of abbrevs, read it (unless -batch).
+    (when (and (not noninteractive)
+               (file-exists-p abbrev-file-name)
+               (file-readable-p abbrev-file-name))
+      (quietly-read-abbrev-file abbrev-file-name))
+
+    ;; If the abbrevs came entirely from the init file or the
+    ;; abbrevs file, they do not need saving.
+    (setq abbrevs-changed nil)
 
     ;; Do this here in case the init file sets mail-host-address.
     (and mail-host-address
@@ -1312,33 +1384,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
diff --git a/src/lread.c b/src/lread.c
index 52897b4fcc..5ff438041b 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4892,7 +4892,7 @@ directory.  These file names are converted to absolute at startup.  */);
 If the file loaded had extension `.elc', and the corresponding source file
 exists, this variable contains the name of source file, suitable for use
 by functions like `custom-save-all' which edit the init file.
-While Emacs loads and evaluates the init file, value is the real name
+While Emacs loads and evaluates any init file, value is the real name
 of the file, regardless of whether or not it has the `.elc' extension.  */);
   Vuser_init_file = Qnil;
 
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-25  4:35                 ` Radon Rosborough
@ 2018-01-25 15:43                   ` Clément Pit-Claudel
  2018-01-25 16:03                     ` Stefan Monnier
  2018-01-25 17:07                   ` [PATCH] Fixing package-initialize, adding early init file Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-01-25 15:43 UTC (permalink / raw)
  To: Radon Rosborough, Stefan Monnier; +Cc: emacs-devel

On 2018-01-24 23:35, Radon Rosborough wrote:
> Since it has been more than a month with no response, I am re-posting
> the patch which fixes the problems previously discussed [1] [2] [3]
> with `package-initialize' by adding a second (optional) init-file
> `early-init.el'. This patch includes some refactoring of the code in
> `startup.el' to provide for loading any number of init-files in an
> extensible way. I hope that the change can be included in Emacs 26.2
> or Emacs 27.

Thanks for this patch. I think it'd be great to have it.  I've added some (very few) comments below.

> diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
> index 215f50cb40..bd7cccce6c 100644
> --- a/doc/emacs/package.texi
> +++ b/doc/emacs/package.texi
> @@ -253,30 +253,16 @@ Package Installation
>  consult the package's help buffer.
>  
>    By default, Emacs also automatically loads all installed packages in
> -subsequent Emacs sessions.  This happens at startup, after processing
> -the init file (@pxref{Init File}).  As an exception, Emacs does not
> -load packages at startup if invoked with the @samp{-q} or
> -@samp{--no-init-file} options (@pxref{Initial Options}).
> +subsequent Emacs sessions.  This happens at startup, before processing

Was this supposed to be "previous" rather than "subsequent" (this isn't from your patch, though).

> +the init file but after processing the early init file (@pxref{Early
> +Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an
> +exception, Emacs does not load packages at startup if invoked with the
> +@samp{-q} or @samp{--no-init-file} options (@xref{Initial Options}).
>  
>  @vindex package-enable-at-startup
>    To disable automatic package loading, change the variable
> -@code{package-enable-at-startup} to @code{nil}.
> -
> -@findex package-initialize
> -  The reason automatic package loading occurs after loading the init
> -file is that user options only receive their customized values after
> -loading the init file, including user options which affect the
> -packaging system.  In some circumstances, you may want to load
> -packages explicitly in your init file (usually because some other code
> -in your init file depends on a package).  In that case, your init file
> -should call the function @code{package-initialize}.  It is up to you
> -to ensure that relevant user options, such as @code{package-load-list}
> -(see below), are set up prior to the @code{package-initialize} call.
> -This will automatically set @code{package-enable-at-startup} to @code{nil}, to
> -avoid loading the packages again after processing the init file.
> -Alternatively, you may choose to completely inhibit package loading at
> -startup, and invoke the command @kbd{M-x package-initialize} to load
> -your packages manually.
> +@code{package-enable-at-startup} to @code{nil}.  You must do this in
> +the early init file.  Currently it cannot be done via Customize.

I'd add ", as this variable is read before loading the regular init file." after "in the early init file".

>  @vindex package-load-list
>    For finer control over package loading, you can use the variable
> diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
> index 501960bdc3..c6990909ab 100644
> --- a/doc/lispref/os.texi
> +++ b/doc/lispref/os.texi
> @@ -361,6 +361,7 @@ Init File
>  @cindex init file
>  @cindex @file{.emacs}
>  @cindex @file{init.el}
> +@cindex @file{early-init.el}
>  
>    When you start Emacs, it normally attempts to load your @dfn{init
>  file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
> @@ -384,6 +385,19 @@ Init File
>  file.  If those environment variables are absent, though, Emacs uses
>  your user-id to find your home directory.
>  
> +@cindex early init file
> +  Emacs also attempts to load a second init file, called the
> +  @dfn{early init file}, if it exists.  This is a file named
> +  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
> +  home directory.  The difference is that the early init file is
> +  loaded much earlier during the startup process, so you can use it to
> +  customize some things that are initialized before loading the
> +  regular init file.  For example, here you can customize the process

I'd say "For example, you can use that file to customize the process"

> +  of loading installed packages, by setting variables such as
> +  @var{package-load-list} or
> +  @var{package-enable-at-startup}. @xref{Package Installation,,,
> +  emacs,The GNU Emacs Manual}.
> +
>  @cindex default init file
>    An Emacs installation may have a @dfn{default init file}, which is a
>  Lisp library named @file{default.el}.  Emacs finds this file through
> diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
> index 153ee48741..2e93f29bd2 100644
> --- a/doc/lispref/package.texi
> +++ b/doc/lispref/package.texi
> @@ -106,10 +106,12 @@ Packaging Basics
>  
>    Whenever Emacs starts up, it automatically calls the function
>  @code{package-initialize} to load installed packages.  This is done
> -after loading the init file and abbrev file (if any) and before
> -running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
> -package loading is disabled if the user option
> -@code{package-enable-at-startup} is @code{nil}.
> +after loading the early init file, but before loading the early init

This should say "but before loading the *reguar* init file."

> +file and abbrev file (if any) and before running
> +@code{after-init-hook} (@pxref{Startup Summary}).  Automatic package
> +loading is disabled if the user option
> +@code{package-enable-at-startup} is @code{nil}.  (Of course, the
> +setting of this user option must be done in the early init file.)

I'd simplify this to "if the option … is *set to* nil in the early init file."

>  @deffn Command package-initialize &optional no-activate
>  This function initializes Emacs' internal record of which packages are
> @@ -123,6 +125,12 @@ Packaging Basics
>  The optional argument @var{no-activate}, if non-@code{nil}, causes
>  Emacs to update its record of installed packages without actually
>  loading them; it is for internal use only.
> +
> +In most cases, you should not need to call @code{package-initialize},
> +as this is done automatically during startup.  Simply make sure to put
> +any code that should run before @code{package-initialize} in the early
> +init file, and any code that should run after in the primary init

after *it*, maybe?

> +file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
>  @end deffn
>  
>  @node Simple Packages
> diff --git a/doc/misc/org.texi b/doc/misc/org.texi
> index 1f6e10287d..36b7f87248 100644
> --- a/doc/misc/org.texi
> +++ b/doc/misc/org.texi
> @@ -890,9 +890,7 @@ Installation
>  been visited, i.e., where no Org built-in function have been loaded.
>  Otherwise autoload Org functions will mess up the installation.
>  
> -Then, to make sure your Org configuration is taken into account, initialize
> -the package system with @code{(package-initialize)} in your Emacs init file
> -before setting any Org option.  If you want to use Org's package repository,
> +If you want to use Org's package repository,
>  check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
>  
>  @subsubheading Downloading Org as an archive
> diff --git a/etc/NEWS b/etc/NEWS
> index 1382f96a37..4bbf3e237a 100644
> --- a/etc/NEWS
> +++ b/etc/NEWS
> @@ -41,6 +41,24 @@ can enable it when configuring, e.g., './configure CFLAGS="-g3 -O2
>  \f
>  * Startup Changes in Emacs 27.1
>  
> ++++
> +** Emacs can now be configured using an early init file.
> +The file is called early-init.el, in `user-emacs-directory'.  It is
> +loaded very early in the startup process: in particular, before

no need for "in particular," here?

> +graphical elements such as the tool bar are initialized, and before
> +the package manager is initialized.
> +
> ++++
> +** Emacs now initializes package.el before loading the init-file.

I think "calls package-initialize" would be clearer.

> +This is part of a change intended to eliminate the behavior of
> +package.el inserting a call to (package-initialize) into the
> +init-file, which was previously done when Emacs was started.  Users
> +who do not configure package.el variables such as `package-load-list'
> +and `package-user-dir' need not make any configuration changes.  Users
> +who do configure such variables should place the configuration into
> +the newly introduced early init file, which is loaded before
> +package.el is initialized.

I'd mention here that variables like package-archives do not need to move to the early init file.

> +
>  \f
>  * Changes in Emacs 27.1
>  
> diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
> index f8b4cc888d..815b679cae 100644
> --- a/lisp/emacs-lisp/package.el
> +++ b/lisp/emacs-lisp/package.el
> @@ -1431,16 +1431,11 @@ package-read-all-archive-contents
>  ;; available on disk.
>  (defvar package--initialized nil)
>  
> -(defvar package--init-file-ensured nil
> -  "Whether we know the init file has package-initialize.")
> -
>  ;;;###autoload
>  (defun package-initialize (&optional no-activate)
>    "Load Emacs Lisp packages, and activate them.
>  The variable `package-load-list' controls which packages to load.
>  If optional arg NO-ACTIVATE is non-nil, don't activate packages.
> -If `user-init-file' does not mention `(package-initialize)', add
> -it to the file.
>  If called as part of loading `user-init-file', set
>  `package-enable-at-startup' to nil, to prevent accidentally
>  loading packages twice.
> @@ -1449,13 +1444,7 @@ package-initialize
>  taken care of by `package-initialize'."
>    (interactive)
>    (setq package-alist nil)
> -  (if after-init-time
> -      (package--ensure-init-file)
> -    ;; If `package-initialize' is before we finished loading the init
> -    ;; file, it's obvious we don't need to ensure-init.
> -    (setq package--init-file-ensured t
> -          ;; And likely we don't need to run it again after init.
> -          package-enable-at-startup nil))
> +  (setq package-enable-at-startup nil)
>    (package-load-all-descriptors)
>    (package-read-all-archive-contents)
>    (unless no-activate
> @@ -1872,64 +1861,6 @@ package-download-transaction
>  using `package-compute-transaction'."
>    (mapc #'package-install-from-archive packages))
>  
> -(defun package--ensure-init-file ()
> -  "Ensure that the user's init file has `package-initialize'.
> -`package-initialize' doesn't have to be called, as long as it is
> -present somewhere in the file, even as a comment.  If it is not,
> -add a call to it along with some explanatory comments."
> -  ;; Don't mess with the init-file from "emacs -Q".
> -  (when (and (stringp user-init-file)
> -             (not package--init-file-ensured)
> -             (file-readable-p user-init-file)
> -             (file-writable-p user-init-file))
> -    (let* ((buffer (find-buffer-visiting user-init-file))
> -           buffer-name
> -           (contains-init
> -            (if buffer
> -                (with-current-buffer buffer
> -                  (save-excursion
> -                    (save-restriction
> -                      (widen)
> -                      (goto-char (point-min))
> -                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
> -              ;; Don't visit the file if we don't have to.
> -              (with-temp-buffer
> -                (insert-file-contents user-init-file)
> -                (goto-char (point-min))
> -                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
> -      (unless contains-init
> -        (with-current-buffer (or buffer
> -                                 (let ((delay-mode-hooks t)
> -                                       (find-file-visit-truename t))
> -                                   (find-file-noselect user-init-file)))
> -          (when buffer
> -            (setq buffer-name (buffer-file-name))
> -            (set-visited-file-name (file-chase-links user-init-file)))
> -          (save-excursion
> -            (save-restriction
> -              (widen)
> -              (goto-char (point-min))
> -              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
> -                          (not (eobp)))
> -                (forward-line 1))
> -              (insert
> -               "\n"
> -               ";; Added by Package.el.  This must come before configurations of\n"
> -               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
> -               ";; just comment it out by adding a semicolon to the start of the line.\n"
> -               ";; You may delete these explanatory comments.\n"
> -               "(package-initialize)\n")
> -              (unless (looking-at-p "$")
> -                (insert "\n"))
> -              (let ((file-precious-flag t))
> -                (save-buffer))
> -              (if buffer
> -                  (progn
> -                    (set-visited-file-name buffer-name)
> -                    (set-buffer-modified-p nil))
> -                (kill-buffer (current-buffer)))))))))
> -  (setq package--init-file-ensured t))
> -
>  ;;;###autoload
>  (defun package-install (pkg &optional dont-select)
>    "Install the package PKG.
> diff --git a/lisp/startup.el b/lisp/startup.el
> index 4575f1f94d..de85933983 100644
> --- a/lisp/startup.el
> +++ b/lisp/startup.el
> @@ -312,6 +312,15 @@ inhibit-startup-hooks
>  Currently this applies to: `emacs-startup-hook', `term-setup-hook',
>  and `window-setup-hook'.")
>  
> +(defvar early-init-file nil
> +  "File name, including directory, of user's early init file.
> +If the file loaded had extension `.elc', and the corresponding
> +source file exists, this variable contains the name of source
> +file, suitable for use by functions like `custom-save-all' which
> +edit the init file.  While Emacs loads and evaluates the init
> +file, value is the real name of the file, regardless of whether
> +or not it has the `.elc' extension.")
> +
>  (defvar keyboard-type nil
>    "The brand of keyboard you are using.
>  This variable is used to define the proper function and keypad
> @@ -870,6 +879,129 @@ startup--setup-quote-display
>            (when standard-display-table
>              (aset standard-display-table char nil)))))))
>  
> +(defun load-user-init-file
> +    (compute-filename &optional compute-alternate-filename load-defaults)
> +  "Load a user init-file.
> +COMPUTE-FILENAME is called with no arguments and should return
> +the name of the init-file to load. If this file cannot be loaded,
> +and COMPUTE-ALTERNATE-FILENAME is non-nil, then it is called with
> +no arguments and should return the name of an alternate init-file
> +to load. If LOAD-DEFAULTS is non-nil, then load default.el after
> +the init-file.
> +
> +This function sets `user-init-file' to the name of the loaded
> +init-file, or to a default value if loading is not possible."
> +  (let ((debug-on-error-from-init-file nil)
> +        (debug-on-error-should-be-set nil)
> +        (debug-on-error-initial
> +         (if (eq init-file-debug t)
> +             'startup
> +           init-file-debug))
> +        (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
> +    (let ((debug-on-error debug-on-error-initial)
> +          ;; We create an anonymous function here so that we can call
> +          ;; it in different contexts depending on the value of
> +          ;; `debug-on-error'.
> +          (read-init-file
> +           (lambda ()
> +             (when init-file-user
> +               (let ((init-file-name (funcall compute-filename)))
> +
> +                 ;; If `user-init-file' is t, then `load' will store
> +                 ;; the name of the file that it loads into
> +                 ;; `user-init-file'.
> +                 (setq user-init-file t)
> +                 (load init-file-name 'noerror 'nomessage)
> +
> +                 (when (eq user-init-file t)
> +                   (let ((alt-file-name (funcall compute-alternate-filename)))
> +                     (load alt-file-name 'noerror 'nomessage)
> +
> +                     ;; If we did not find the user's init file, set
> +                     ;; user-init-file conclusively.  Don't let it be
> +                     ;; set from default.el.
> +                     (when (eq user-init-file t)
> +                       (setq user-init-file init-file-name)))))
> +
> +               ;; If we loaded a compiled file, set `user-init-file' to
> +               ;; the source version if that exists.
> +               (when (equal (file-name-extension user-init-file)
> +                            "elc")
> +                 (let* ((source (file-name-sans-extension user-init-file))
> +                        (alt (concat source ".el")))
> +                   (setq source (cond ((file-exists-p alt) alt)
> +                                      ((file-exists-p source) source)
> +                                      (t nil)))
> +                   (when source
> +                     (when (file-newer-than-file-p source user-init-file)
> +                       (message "Warning: %s is newer than %s"
> +                                source user-init-file)
> +                       (sit-for 1))
> +                     (setq user-init-file source))))
> +
> +               (when load-defaults
> +
> +                 ;; Prevent default.el from changing the value of
> +                 ;; `inhibit-startup-screen'.
> +                 (let ((inhibit-startup-screen nil))
> +                   (load "default" 'noerror 'nomessage)))))))
> +      ;; Now call our anonymous function.
> +      (if init-file-debug
> +          ;; Do this without a `condition-case' if the user wants to
> +          ;; debug.
> +          (funcall read-init-file)
> +        (condition-case error
> +            (progn
> +              (funcall read-init-file)
> +
> +              ;; If a previous init-file had an error, don't forget
> +              ;; about that.
> +              (unless init-file-had-error
> +                (setq init-file-had-error nil)))
> +          (error
> +           (display-warning
> +            'initialization
> +            (format-message "\
> +An error occurred while loading `%s':\n\n%s%s%s\n\n\
> +To ensure normal operation, you should investigate and remove the
> +cause of the error in your initialization file.  Start Emacs with
> +the `--debug-init' option to view a complete error backtrace."
> +                            user-init-file
> +                            (get (car error) 'error-message)
> +                            (if (cdr error) ": " "")
> +                            (mapconcat (lambda (s) (prin1-to-string s t))
> +                                       (cdr error) ", "))
> +            :warning)
> +           (setq init-file-had-error t))))
> +
> +      ;; If we can tell that the init file altered debug-on-error,
> +      ;; arrange to preserve the value that it set up.
> +      (or (eq debug-on-error debug-on-error-initial)
> +          (setq debug-on-error-should-be-set t
> +                debug-on-error-from-init-file debug-on-error)))
> +
> +    (when debug-on-error-should-be-set
> +      (setq debug-on-error debug-on-error-from-init-file))
> +
> +    (unless (or (default-value 'enable-multibyte-characters)
> +                (eq orig-enable-multibyte (default-value
> +                                            'enable-multibyte-characters)))
> +
> +      ;; Init file changed to unibyte.  Reset existing multibyte
> +      ;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
> +      ;; Arguably this should only be done if they're free of
> +      ;; multibyte characters.
> +      (mapc (lambda (buffer)
> +              (with-current-buffer buffer
> +                (if enable-multibyte-characters
> +                    (set-buffer-multibyte nil))))
> +            (buffer-list))
> +
> +      ;; Also re-set the language environment in case it was
> +      ;; originally done before unibyte was set and is sensitive to
> +      ;; unibyte (display table, terminal coding system &c).
> +      (set-language-environment current-language-environment))))
> +
>  (defun command-line ()
>    "A subroutine of `normal-top-level'.
>  Amongst another things, it parses the command-line arguments."
> @@ -1021,6 +1153,69 @@ command-line
>      (and command-line-args
>           (setcdr command-line-args args)))
>  
> +  ;; Warn for invalid user name.
> +  (when init-file-user
> +    (if (string-match "[~/:\n]" init-file-user)
> +        (display-warning 'initialization
> +                         (format "Invalid user name %s"
> +                                 init-file-user)
> +                         :error)
> +      (if (file-directory-p (expand-file-name
> +                             ;; We don't support ~USER on MS-Windows
> +                             ;; and MS-DOS except for the current
> +                             ;; user, and always load .emacs from
> +                             ;; the current user's home directory
> +                             ;; (see below).  So always check "~",
> +                             ;; even if invoked with "-u USER", or
> +                             ;; if $USER or $LOGNAME are set to
> +                             ;; something different.
> +                             (if (memq system-type '(windows-nt ms-dos))
> +                                 "~"
> +                               (concat "~" init-file-user))))
> +          nil
> +        (display-warning 'initialization
> +                         (format "User %s has no home directory"
> +                                 (if (equal init-file-user "")
> +                                     (user-real-login-name)
> +                                   init-file-user))
> +                         :error))))
> +
> +  ;; Load the early init file, if found.
> +  (load-user-init-file
> +   (lambda ()
> +     (expand-file-name
> +      "early-init"
> +      (file-name-as-directory
> +       (concat "~" init-file-user "/.emacs.d")))))
> +  (setq early-init-file user-init-file)
> +
> +  ;; If any package directory exists, initialize the package system.
> +  (and user-init-file
> +       package-enable-at-startup
> +       (catch 'package-dir-found
> +	 (let (dirs)
> +	   (if (boundp 'package-directory-list)
> +	       (setq dirs package-directory-list)
> +	     (dolist (f load-path)
> +	       (and (stringp f)
> +		    (equal (file-name-nondirectory f) "site-lisp")
> +		    (push (expand-file-name "elpa" f) dirs))))
> +	   (push (if (boundp 'package-user-dir)
> +		     package-user-dir
> +		   (locate-user-emacs-file "elpa"))
> +		 dirs)
> +	   (dolist (dir dirs)
> +	     (when (file-directory-p dir)
> +	       (dolist (subdir (directory-files dir))
> +		 (when (let ((subdir (expand-file-name subdir dir)))
> +                         (and (file-directory-p subdir)
> +                              (file-exists-p
> +                               (expand-file-name
> +                                (package--description-file subdir)
> +                                subdir))))
> +		   (throw 'package-dir-found t)))))))
> +       (package-initialize))
> +
>    ;; Make sure window system's init file was loaded in loadup.el if
>    ;; using a window system.
>    ;; Initialize the window-system only after processing the command-line
> @@ -1127,170 +1322,47 @@ command-line
>      ;; the startup screen.
>      (setq inhibit-startup-screen nil)
>  
> -    ;; Warn for invalid user name.
> -    (when init-file-user
> -      (if (string-match "[~/:\n]" init-file-user)
> -	  (display-warning 'initialization
> -			   (format "Invalid user name %s"
> -				   init-file-user)
> -			   :error)
> -	(if (file-directory-p (expand-file-name
> -			       ;; We don't support ~USER on MS-Windows
> -			       ;; and MS-DOS except for the current
> -			       ;; user, and always load .emacs from
> -			       ;; the current user's home directory
> -			       ;; (see below).  So always check "~",
> -			       ;; even if invoked with "-u USER", or
> -			       ;; if $USER or $LOGNAME are set to
> -			       ;; something different.
> -			       (if (memq system-type '(windows-nt ms-dos))
> -				   "~"
> -				 (concat "~" init-file-user))))
> -	    nil
> -	  (display-warning 'initialization
> -			   (format "User %s has no home directory"
> -				   (if (equal init-file-user "")
> -				       (user-real-login-name)
> -				     init-file-user))
> -			   :error))))
> -
>      ;; Load that user's init file, or the default one, or none.
> -    (let (debug-on-error-from-init-file
> -	  debug-on-error-should-be-set
> -	  (debug-on-error-initial
> -	   (if (eq init-file-debug t) 'startup init-file-debug))
> -	  (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
> -      (let ((debug-on-error debug-on-error-initial)
> -	    ;; This function actually reads the init files.
> -	    (inner
> -	     (function
> -	      (lambda ()
> -		(if init-file-user
> -		    (let ((user-init-file-1
> -			   (cond
> -			     ((eq system-type 'ms-dos)
> -			      (concat "~" init-file-user "/_emacs"))
> -			     ((not (eq system-type 'windows-nt))
> -			      (concat "~" init-file-user "/.emacs"))
> -			     ;; Else deal with the Windows situation
> -			     ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
> -			      ;; Prefer .emacs on Windows.
> -			      "~/.emacs")
> -			     ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
> -			      ;; Also support _emacs for compatibility, but warn about it.
> -			      (push `(initialization
> -				      ,(format-message
> -					"`_emacs' init file is deprecated, please use `.emacs'"))
> -				    delayed-warnings-list)
> -			      "~/_emacs")
> -			     (t ;; But default to .emacs if _emacs does not exist.
> -			      "~/.emacs"))))
> -		      ;; This tells `load' to store the file name found
> -		      ;; into user-init-file.
> -		      (setq user-init-file t)
> -		      (load user-init-file-1 t t)
> -
> -		      (when (eq user-init-file t)
> -			;; If we did not find ~/.emacs, try
> -			;; ~/.emacs.d/init.el.
> -			(let ((otherfile
> -			       (expand-file-name
> -				"init"
> -				(file-name-as-directory
> -				 (concat "~" init-file-user "/.emacs.d")))))
> -			  (load otherfile t t)
> -
> -			  ;; If we did not find the user's init file,
> -			  ;; set user-init-file conclusively.
> -			  ;; Don't let it be set from default.el.
> -			  (when (eq user-init-file t)
> -			    (setq user-init-file user-init-file-1))))
> -
> -		      ;; If we loaded a compiled file, set
> -		      ;; `user-init-file' to the source version if that
> -		      ;; exists.
> -		      (when (and user-init-file
> -				 (equal (file-name-extension user-init-file)
> -					"elc"))
> -			(let* ((source (file-name-sans-extension user-init-file))
> -			       (alt (concat source ".el")))
> -			  (setq source (cond ((file-exists-p alt) alt)
> -					     ((file-exists-p source) source)
> -					     (t nil)))
> -			  (when source
> -			    (when (file-newer-than-file-p source user-init-file)
> -			      (message "Warning: %s is newer than %s"
> -				       source user-init-file)
> -			      (sit-for 1))
> -			    (setq user-init-file source))))
> -
> -		      (unless inhibit-default-init
> -                        (let ((inhibit-startup-screen nil))
> -                          ;; Users are supposed to be told their rights.
> -                          ;; (Plus how to get help and how to undo.)
> -                          ;; Don't you dare turn this off for anyone
> -                          ;; except yourself.
> -                          (load "default" t t)))))))))
> -	(if init-file-debug
> -	    ;; Do this without a condition-case if the user wants to debug.
> -	    (funcall inner)
> -	  (condition-case error
> -	      (progn
> -		(funcall inner)
> -		(setq init-file-had-error nil))
> -	    (error
> -	     (display-warning
> -	      'initialization
> -	      (format-message "\
> -An error occurred while loading `%s':\n\n%s%s%s\n\n\
> -To ensure normal operation, you should investigate and remove the
> -cause of the error in your initialization file.  Start Emacs with
> -the `--debug-init' option to view a complete error backtrace."
> -		      user-init-file
> -		      (get (car error) 'error-message)
> -		      (if (cdr error) ": " "")
> -		      (mapconcat (lambda (s) (prin1-to-string s t))
> -				 (cdr error) ", "))
> -	      :warning)
> -	     (setq init-file-had-error t))))
> -
> -      (if (and deactivate-mark transient-mark-mode)
> -	    (with-current-buffer (window-buffer)
> -	      (deactivate-mark)))
> -
> -	;; If the user has a file of abbrevs, read it (unless -batch).
> -	(when (and (not noninteractive)
> -		   (file-exists-p abbrev-file-name)
> -		   (file-readable-p abbrev-file-name))
> -	    (quietly-read-abbrev-file abbrev-file-name))
> -
> -	;; If the abbrevs came entirely from the init file or the
> -	;; abbrevs file, they do not need saving.
> -	(setq abbrevs-changed nil)
> -
> -	;; If we can tell that the init file altered debug-on-error,
> -	;; arrange to preserve the value that it set up.
> -	(or (eq debug-on-error debug-on-error-initial)
> -	    (setq debug-on-error-should-be-set t
> -		  debug-on-error-from-init-file debug-on-error)))
> -      (if debug-on-error-should-be-set
> -	  (setq debug-on-error debug-on-error-from-init-file))
> -      (unless (or (default-value 'enable-multibyte-characters)
> -		  (eq orig-enable-multibyte (default-value
> -					      'enable-multibyte-characters)))
> -	;; Init file changed to unibyte.  Reset existing multibyte
> -	;; buffers (probably *scratch*, *Messages*, *Minibuf-0*).
> -	;; Arguably this should only be done if they're free of
> -	;; multibyte characters.
> -	(mapc (lambda (buffer)
> -		(with-current-buffer buffer
> -		  (if enable-multibyte-characters
> -		      (set-buffer-multibyte nil))))
> -	      (buffer-list))
> -	;; Also re-set the language environment in case it was
> -	;; originally done before unibyte was set and is sensitive to
> -	;; unibyte (display table, terminal coding system &c).
> -	(set-language-environment current-language-environment)))
> +    (load-user-init-file
> +     (lambda ()
> +       (cond
> +        ((eq system-type 'ms-dos)
> +         (concat "~" init-file-user "/_emacs"))
> +        ((not (eq system-type 'windows-nt))
> +         (concat "~" init-file-user "/.emacs"))
> +        ;; Else deal with the Windows situation.
> +        ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
> +         ;; Prefer .emacs on Windows.
> +         "~/.emacs")
> +        ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
> +         ;; Also support _emacs for compatibility, but warn about it.
> +         (push `(initialization
> +                 ,(format-message
> +                   "`_emacs' init file is deprecated, please use `.emacs'"))
> +               delayed-warnings-list)
> +         "~/_emacs")
> +        (t ;; But default to .emacs if _emacs does not exist.
> +         "~/.emacs")))
> +     (lambda ()
> +       (expand-file-name
> +        "init"
> +        (file-name-as-directory
> +         (concat "~" init-file-user "/.emacs.d"))))
> +     (not inhibit-default-init))
> +
> +    (when (and deactivate-mark transient-mark-mode)
> +      (with-current-buffer (window-buffer)
> +        (deactivate-mark)))
> +
> +    ;; If the user has a file of abbrevs, read it (unless -batch).
> +    (when (and (not noninteractive)
> +               (file-exists-p abbrev-file-name)
> +               (file-readable-p abbrev-file-name))
> +      (quietly-read-abbrev-file abbrev-file-name))
> +
> +    ;; If the abbrevs came entirely from the init file or the
> +    ;; abbrevs file, they do not need saving.
> +    (setq abbrevs-changed nil)
>  
>      ;; Do this here in case the init file sets mail-host-address.
>      (and mail-host-address
> @@ -1312,33 +1384,6 @@ command-line
>  		 (eq face-ignored-fonts old-face-ignored-fonts))
>        (clear-face-cache)))
>  
> -  ;; If any package directory exists, initialize the package system.
> -  (and user-init-file
> -       package-enable-at-startup
> -       (catch 'package-dir-found
> -	 (let (dirs)
> -	   (if (boundp 'package-directory-list)
> -	       (setq dirs package-directory-list)
> -	     (dolist (f load-path)
> -	       (and (stringp f)
> -		    (equal (file-name-nondirectory f) "site-lisp")
> -		    (push (expand-file-name "elpa" f) dirs))))
> -	   (push (if (boundp 'package-user-dir)
> -		     package-user-dir
> -		   (locate-user-emacs-file "elpa"))
> -		 dirs)
> -	   (dolist (dir dirs)
> -	     (when (file-directory-p dir)
> -	       (dolist (subdir (directory-files dir))
> -		 (when (let ((subdir (expand-file-name subdir dir)))
> -                         (and (file-directory-p subdir)
> -                              (file-exists-p
> -                               (expand-file-name
> -                                (package--description-file subdir)
> -                                subdir))))
> -		   (throw 'package-dir-found t)))))))
> -       (package-initialize))
> -
>    (setq after-init-time (current-time))
>    ;; Display any accumulated warnings after all functions in
>    ;; `after-init-hook' like `desktop-read' have finalized possible
> diff --git a/src/lread.c b/src/lread.c
> index 52897b4fcc..5ff438041b 100644
> --- a/src/lread.c
> +++ b/src/lread.c
> @@ -4892,7 +4892,7 @@ directory.  These file names are converted to absolute at startup.  */);
>  If the file loaded had extension `.elc', and the corresponding source file
>  exists, this variable contains the name of source file, suitable for use
>  by functions like `custom-save-all' which edit the init file.
> -While Emacs loads and evaluates the init file, value is the real name
> +While Emacs loads and evaluates any init file, value is the real name
>  of the file, regardless of whether or not it has the `.elc' extension.  */);
>    Vuser_init_file = Qnil;
>  
> -- 
> 2.14.3
> 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-25 15:43                   ` Clément Pit-Claudel
@ 2018-01-25 16:03                     ` Stefan Monnier
  2018-01-25 16:22                       ` Clément Pit-Claudel
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-25 16:03 UTC (permalink / raw)
  To: emacs-devel

>>    By default, Emacs also automatically loads all installed packages in
>> -subsequent Emacs sessions.  This happens at startup, after processing
>> -the init file (@pxref{Init File}).  As an exception, Emacs does not
>> -load packages at startup if invoked with the @samp{-q} or
>> -@samp{--no-init-file} options (@pxref{Initial Options}).
>> +subsequent Emacs sessions.  This happens at startup, before processing
>
> Was this supposed to be "previous" rather than "subsequent" (this
> isn't from your patch, though).

Depends how you parse the sentence:

    Emacs also automatically loads all (installed packages) in
    subsequent Emacs sessions
vs
    Emacs also automatically loads all (installed packages in
    previous Emacs sessions)

but in the second case you'd rather write it

    Emacs also automatically loads all packages installed in
    previous Emacs sessions

so I think "subsequent" was not a typo.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-25 16:03                     ` Stefan Monnier
@ 2018-01-25 16:22                       ` Clément Pit-Claudel
  2018-01-25 17:12                         ` Stefan Monnier
                                           ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-01-25 16:22 UTC (permalink / raw)
  To: emacs-devel

On 2018-01-25 11:03, Stefan Monnier wrote:
> but in the second case you'd rather write it
> 
>     Emacs also automatically loads all packages installed in
>     previous Emacs sessions

Indeed, good point.  Then let me amend the suggestion: just remove the "in subsequent Emacs sessions" part :)




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-25  4:35                 ` Radon Rosborough
  2018-01-25 15:43                   ` Clément Pit-Claudel
@ 2018-01-25 17:07                   ` Stefan Monnier
  2018-01-28 19:42                     ` Radon Rosborough
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-25 17:07 UTC (permalink / raw)
  To: emacs-devel

> Since it has been more than a month with no response, I am re-posting
> the patch which fixes the problems previously discussed [1] [2] [3]
> with `package-initialize' by adding a second (optional) init-file
> `early-init.el'. This patch includes some refactoring of the code in
> `startup.el' to provide for loading any number of init-files in an
> extensible way. I hope that the change can be included in Emacs 26.2
> or Emacs 27.

Sorry for the delay, here are my comments (I doubt it's appropriate for
Emacs-26.2 since I think 26.N should be kept exclusively for bug-fixes).

Once you fix the two minor problems I mention below, looks good to me,


        Stefan


> * lisp/startup.el (early-init-file): New variable, for the filename of
>   the early init file after it has been loaded.
>
> * lisp/startup.el (load-user-init-file): New function, used to
>   eliminate duplicate code in loading the early and regular init
>   files.
>
> * lisp/startup.el (command-line): Load the early init file using
>   `load-user-init-file'. Move the check for an invalid username to
>   just before that, and move the initialization of the package system
>   to just after. Load the regular init file using
>   `load-user-init-file'.

The format for commit messages wants to combine those as follows
(notice also that we use double-spaces after "."):

    * lisp/startup.el (early-init-file): New variable, for the filename of
    the early init file after it has been loaded.
    (load-user-init-file): New function, used to eliminate duplicate code
    in loading the early and regular init files.
    (command-line): Load the early init file using `load-user-init-file'.
    Move the check for an invalid username to just before that, and move
    the initialization of the package system to just after.
    Load the regular init file using `load-user-init-file'.

> * src/lread.c (Vuser_init_file): Note change in semantics due to its
>   usage while loading the early init file.
>
> * lisp/emacs-lisp/package.el (package--ensure-init-file): Remove
>   definition, usage, and documentation.
>
> * lisp/emacs-lisp/package.el (package--init-file-ensured): Remove
>   definition and usage.

Same here, please combine the two messages about lisp/emacs-lisp/package.el.

> * etc/NEWS: Document changes to startup and package.el.

No need to mention these changes to NEWS here.

> diff --git a/lisp/startup.el b/lisp/startup.el
> index 4575f1f94d..de85933983 100644
> --- a/lisp/startup.el
> +++ b/lisp/startup.el
> @@ -312,6 +312,15 @@ inhibit-startup-hooks
>  Currently this applies to: `emacs-startup-hook', `term-setup-hook',
>  and `window-setup-hook'.")
>  
> +(defvar early-init-file nil
> +  "File name, including directory, of user's early init file.
> +If the file loaded had extension `.elc', and the corresponding
> +source file exists, this variable contains the name of source
> +file, suitable for use by functions like `custom-save-all' which
> +edit the init file.  While Emacs loads and evaluates the init
> +file, value is the real name of the file, regardless of whether
> +or not it has the `.elc' extension.")

This duplicates the doc of user-init-file, basically.  I think it'd be
better to refer to user-init-file and just explains in which way
it's different.

Also, IIUC the above is not true: while loading the early init file,
`early-init-file` will not be bound to the file being loaded, instead it
will be `user-init-file` which will be bound to it (and I'd rather not
document that quirk).

> +(defun load-user-init-file
> +    (compute-filename &optional compute-alternate-filename load-defaults)

We usually use names like `filename-function` rather than
`compute-filename` (the function itself could be named
`compute-filename` since a function *does* something, but a variable
doesn't *do* it just contains a value, in this case a function value).

> +  "Load a user init-file.
> +COMPUTE-FILENAME is called with no arguments and should return
> +the name of the init-file to load. If this file cannot be loaded,
> +and COMPUTE-ALTERNATE-FILENAME is non-nil, then it is called with
> +no arguments and should return the name of an alternate init-file
> +to load. If LOAD-DEFAULTS is non-nil, then load default.el after
> +the init-file.
> +
> +This function sets `user-init-file' to the name of the loaded
> +init-file, or to a default value if loading is not possible."
> +  (let ((debug-on-error-from-init-file nil)
> +        (debug-on-error-should-be-set nil)
> +        (debug-on-error-initial
> +         (if (eq init-file-debug t)
> +             'startup
> +           init-file-debug))
> +        (orig-enable-multibyte (default-value 'enable-multibyte-characters)))
> +    (let ((debug-on-error debug-on-error-initial)
> +          ;; We create an anonymous function here so that we can call
> +          ;; it in different contexts depending on the value of
> +          ;; `debug-on-error'.
> +          (read-init-file
> +           (lambda ()
> +             (when init-file-user
> +               (let ((init-file-name (funcall compute-filename)))
> +
> +                 ;; If `user-init-file' is t, then `load' will store
> +                 ;; the name of the file that it loads into
> +                 ;; `user-init-file'.
> +                 (setq user-init-file t)
> +                 (load init-file-name 'noerror 'nomessage)
> +
> +                 (when (eq user-init-file t)
> +                   (let ((alt-file-name (funcall compute-alternate-filename)))
> +                     (load alt-file-name 'noerror 'nomessage)

You could directly do

    (load (funcall compute-alternate-filename) 'noerror 'nomessage)

here.  But more significantly, compute-alternate-filename is an optional
arg yet you forget to check if it's nil!

> +              ;; If a previous init-file had an error, don't forget
> +              ;; about that.
> +              (unless init-file-had-error
> +                (setq init-file-had-error nil)))

There's a problem here, since this is a nop.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-25 16:22                       ` Clément Pit-Claudel
@ 2018-01-25 17:12                         ` Stefan Monnier
  2018-01-26  9:31                         ` Eli Zaretskii
  2018-01-26 14:34                         ` Loading a package applies automatically to future sessions? Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-01-25 17:12 UTC (permalink / raw)
  To: emacs-devel

>> but in the second case you'd rather write it
>> 
>>     Emacs also automatically loads all packages installed in
>>     previous Emacs sessions
>
> Indeed, good point.  Then let me amend the suggestion: just remove the "in
> subsequent Emacs sessions" part :)

Fine by me,


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-25 16:22                       ` Clément Pit-Claudel
  2018-01-25 17:12                         ` Stefan Monnier
@ 2018-01-26  9:31                         ` Eli Zaretskii
  2018-01-26 14:34                         ` Loading a package applies automatically to future sessions? Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-01-26  9:31 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

> From: Clément Pit-Claudel <cpitclaudel@gmail.com>
> Date: Thu, 25 Jan 2018 11:22:25 -0500
> 
> On 2018-01-25 11:03, Stefan Monnier wrote:
> > but in the second case you'd rather write it
> > 
> >     Emacs also automatically loads all packages installed in
> >     previous Emacs sessions
> 
> Indeed, good point.  Then let me amend the suggestion: just remove the "in subsequent Emacs sessions" part :)

There's no need to remove text that is unclear; instead, it should be
rephrased to make it more clear.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Loading a package applies automatically to future sessions?
  2018-01-25 16:22                       ` Clément Pit-Claudel
  2018-01-25 17:12                         ` Stefan Monnier
  2018-01-26  9:31                         ` Eli Zaretskii
@ 2018-01-26 14:34                         ` Richard Stallman
  2018-01-26 17:03                           ` Stefan Monnier
  2018-01-26 19:24                           ` Radon Rosborough
  2 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2018-01-26 14:34 UTC (permalink / raw)
  To: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

Discussion of a patch cited this:

  > >     Emacs also automatically loads all packages installed in
  > >     previous Emacs sessions

If that means what I think it means, I think it is bad design for this
feature.

Suppose the user loads a package to try it out.  Will that cause it to
be loaded again in every session?  It appears that way.

I think that asking for a package to be loaded in every session
should be distinguished from loading it for the current session.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-26 14:34                         ` Loading a package applies automatically to future sessions? Richard Stallman
@ 2018-01-26 17:03                           ` Stefan Monnier
  2018-01-28 12:07                             ` Richard Stallman
  2018-01-26 19:24                           ` Radon Rosborough
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-26 17:03 UTC (permalink / raw)
  To: emacs-devel

> Suppose the user loads a package to try it out.  Will that cause it to
> be loaded again in every session?  It appears that way.
> I think that asking for a package to be loaded in every session
> should be distinguished from loading it for the current session.

There are 3 different steps:
A- installing a package: this places its files under ~/.emacs.d/elpa
B- activating a package: this loads its <pkg>-autoloads.el file.
C- actually loading the package's files.

When a user does A, by default, it will do B in the current session and
causes subsequent Emacs invocations to automatically do B as well
(i.e. B is done by default on all installed packages).

You can configure `package-load-list` if you want to prevent
a particular package from being activated even though you still want it
to be installed.

But regardless, C should only happen on-demand when something actively
requests it.

Of course, a package is free to set up its autoloads such that
B causes C.  I'd consider it a misfeature of that package, tho.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-26 14:34                         ` Loading a package applies automatically to future sessions? Richard Stallman
  2018-01-26 17:03                           ` Stefan Monnier
@ 2018-01-26 19:24                           ` Radon Rosborough
  2018-01-26 20:02                             ` Eli Zaretskii
  2018-01-27 20:44                             ` Richard Stallman
  1 sibling, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-01-26 19:24 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel

> Suppose the user loads a package to try it out.  Will that cause it to
> be loaded again in every session?  It appears that way.

I think the confusion here is because the Emacs manual currently uses
the term "load" in two incompatible ways. Loading a package means
evaluating its autoloads, while loading a Lisp file means evaluating
the file's Lisp code. The problem is complicated by the fact that the
word "package" is sometimes used to refer to a package in the package
manager sense, and sometimes used to refer to a Lisp file.

Perhaps some better terminology would be in order? I would suggest
that we never refer to "loading" a package, and instead say:

* "activating a package" means evaluating its autoloads
* "loading a file/feature" means evaluating some particular file of
  Lisp code, which is possibly part of a package

I don't have strong opinions, except that the current terminology is
bad.

-- Radon



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-26 19:24                           ` Radon Rosborough
@ 2018-01-26 20:02                             ` Eli Zaretskii
  2018-01-28 18:20                               ` Radon Rosborough
  2018-01-27 20:44                             ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2018-01-26 20:02 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: rms, emacs-devel

> From: Radon Rosborough <radon.neon@gmail.com>
> Date: Fri, 26 Jan 2018 11:24:32 -0800
> Cc: emacs-devel <emacs-devel@gnu.org>
> 
> I think the confusion here is because the Emacs manual currently uses
> the term "load" in two incompatible ways. Loading a package means
> evaluating its autoloads, while loading a Lisp file means evaluating
> the file's Lisp code.

Please point out the places in the manual where we use "load" in the
former sense.  I think those places need to be fixed, because that's
not what "load" means in the Emacs context.

Thanks.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-26 19:24                           ` Radon Rosborough
  2018-01-26 20:02                             ` Eli Zaretskii
@ 2018-01-27 20:44                             ` Richard Stallman
  2018-01-28  6:30                               ` Radon Rosborough
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-01-27 20:44 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Perhaps some better terminology would be in order? I would suggest
  > that we never refer to "loading" a package, and instead say:

  > * "activating a package" means evaluating its autoloads
  > * "loading a file/feature" means evaluating some particular file of
  >   Lisp code, which is possibly part of a package

I think it is ok to talk about "loading a package"
if that means loading its files.

However, if you evaluate its autoloads, you won't need to explicitly
load its files ever, since the autoloads will do that.  Thus, the
manual may only need to talk about activating it.

I think there should be a way to activate a package explicitly for the
current session _without_ automatically activating it for future
sessions.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-27 20:44                             ` Richard Stallman
@ 2018-01-28  6:30                               ` Radon Rosborough
  2018-01-28  9:33                                 ` Charles A. Roelli
  2018-01-28 13:21                                 ` Stefan Monnier
  0 siblings, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-01-28  6:30 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel

> I think there should be a way to activate a package explicitly for the
> current session _without_ automatically activating it for future
> sessions.

The failure of package.el to support this use case is (one reason) why
I wrote straight.el [1]. Another tool which is designed to extend
package.el to allow for temporary activation of packages is Try [2].
If functionality in this area were added directly to package.el, I
think it would be a great improvement.

[1]: https://github.com/raxod502/straight.el
[2]: https://github.com/larstvei/Try



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28  6:30                               ` Radon Rosborough
@ 2018-01-28  9:33                                 ` Charles A. Roelli
  2018-01-28 13:21                                 ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: Charles A. Roelli @ 2018-01-28  9:33 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: rms, emacs-devel

> From: Radon Rosborough <radon.neon@gmail.com>
> Date: Sat, 27 Jan 2018 22:30:14 -0800
> 
> > I think there should be a way to activate a package explicitly for the
> > current session _without_ automatically activating it for future
> > sessions.
> 
> The failure of package.el to support this use case is (one reason) why
> I wrote straight.el [1]. Another tool which is designed to extend
> package.el to allow for temporary activation of packages is Try [2].
> If functionality in this area were added directly to package.el, I
> think it would be a great improvement.
> 
> [1]: https://github.com/raxod502/straight.el
> [2]: https://github.com/larstvei/Try

One of the proposals listed in an earlier message was to not insert
the call to package-initialize anymore:

> URL: https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
>
> ==> Proposal H: Make the user do it manually

> Summary:
>   - make it so that package.el doesn't modify the init-file, but don't
>     change anything else
>   - this is how it worked before the first "solution" to this problem
>     was implemented

> Advantages:
>   - Emacs does not modify the user's init-file

> Disadvantages:
>   - package.el does not work out of the box, since package
>     customizations will fail when put into the init-file
>   - consequently we get lots of superfluous bug reports

FWIW, taking this route would allow people to install packages in a
session without affecting their initialization file, so it would be
the user's burden to arrange activating the package in future
sessions.  It could at least lead to a better understanding of
package.el for the average user, but as stated, it would probably be
the cause of at least a few "superfluous bug reports".



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-26 17:03                           ` Stefan Monnier
@ 2018-01-28 12:07                             ` Richard Stallman
  2018-01-28 13:24                               ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-01-28 12:07 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > There are 3 different steps:
  > A- installing a package: this places its files under ~/.emacs.d/elpa
  > B- activating a package: this loads its <pkg>-autoloads.el file.
  > C- actually loading the package's files.

  > When a user does A, by default, it will do B in the current session and
  > causes subsequent Emacs invocations to automatically do B as well
  > (i.e. B is done by default on all installed packages).

That doesn't make sense to me.

I think A should not, automatically or by default, do B.

I think there should be a way to activate the package right now,
and a way to specify to activate it in future sessions.

Perhaps each of those should automatically do A, since B requires A.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28  6:30                               ` Radon Rosborough
  2018-01-28  9:33                                 ` Charles A. Roelli
@ 2018-01-28 13:21                                 ` Stefan Monnier
  2018-01-28 17:32                                   ` Radon Rosborough
  2018-01-29  1:50                                   ` Richard Stallman
  1 sibling, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-01-28 13:21 UTC (permalink / raw)
  To: emacs-devel

>> I think there should be a way to activate a package explicitly for the
>> current session _without_ automatically activating it for future
>> sessions.
> The failure of package.el to support this use case

FWIW, package.el does support this case:
- one way is to prevent package-initialize from activating packages,
  and then activating the ones you want by explicit calls to package-active.
- another is to set package-load-list.  E.g.

    (setq package-load-list '((auctex nil) all))

This said, if a package's activation gets in the way of the user, I'd
generally consider it to be a bug in that package (similar to the fact
that if (require <foo>) has undesirable effects it's usually a bug in
<foo>).

E.g. packages providing some kind of global minor mode should never have
that minor mode enabled just by activating the package: instead the
activation should do nothing more than autoload the minor mode function.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 12:07                             ` Richard Stallman
@ 2018-01-28 13:24                               ` Stefan Monnier
  2018-01-29  1:50                                 ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-28 13:24 UTC (permalink / raw)
  To: emacs-devel

>   > When a user does A, by default, it will do B in the current session and
>   > causes subsequent Emacs invocations to automatically do B as well
>   > (i.e. B is done by default on all installed packages).
> That doesn't make sense to me.

Why not?  All the packages that come bundled with Emacs are always
unconditionally activated and we don't offer any way to prevent this
activation (indeed, it's activated during the dump so we basically
can't prevent it).

Package.el follows the same idea (except that it does offer some way to
prevent activation of some packages, by customizing package-load-list).


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 13:21                                 ` Stefan Monnier
@ 2018-01-28 17:32                                   ` Radon Rosborough
  2018-01-28 22:11                                     ` Stefan Monnier
  2018-01-29  1:50                                   ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2018-01-28 17:32 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: John Wiegley, emacs-devel

> This said, if a package's activation gets in the way of the user, I'd
> generally consider it to be a bug in that package (similar to the fact
> that if (require <foo>) has undesirable effects it's usually a bug in
> <foo>).

Activation of packages is a significant performance hit. It's
therefore not a good idea to be activating superfluous packages. JW
has told me that one of the reasons his Emacs configuration does not
use package.el is that activating packages was too slow.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-26 20:02                             ` Eli Zaretskii
@ 2018-01-28 18:20                               ` Radon Rosborough
  2018-01-29  1:52                                 ` Richard Stallman
  2018-02-10 12:00                                 ` Eli Zaretskii
  0 siblings, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-01-28 18:20 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, emacs-devel

> Please point out the places in the manual where we use "load" in the
> former sense.  I think those places need to be fixed, because that's
> not what "load" means in the Emacs context.

The crux of the problem is here in emacs/package.texi:

"Once a package is downloaded and installed, it is @dfn{loaded} into
the current Emacs session. Loading a package is not quite the same as
loading a Lisp library (@pxref{Lisp Libraries}); loading a package
adds its directory to @code{load-path} and loads its autoloads."

Frankly the name of `package-load-list' is misleading if we're going
to change this terminology. It implies you are setting which packages
are going to be loaded.

We also have usage of this terminology in emacs/package.texi:

"After a package is installed, it is automatically loaded by Emacs in
all subsequent sessions."

"As an exception, Emacs does not load packages at startup if invoked
with the @samp{-q} or @samp{--no-init-file} options (@xref{Initial
Options})."

"To disable automatic package loading, change the variable
@code{package-enable-at-startup} to @code{nil}. You must do this in
the early init file, as the variable is read before loading the
regular init file."

"For finer control over package loading, you can use the variable
@code{package-load-list}."

"A list element of the form @code{(@var{name} @var{version})} tells
Emacs to load version @var{version} of the package named @var{name}.
Here, @var{version} should be a version string (corresponding to a
specific version of the package), or @code{t} (which means to load any
installed version), or @code{nil} (which means no version; this
disables the package, preventing it from being loaded). A list element
can also be the symbol @code{all}, which means to load the latest
installed version of any package not named by the other list
elements."

"For example, if you set @code{package-load-list} to @code{'((muse
"3.20") all)}, then Emacs only loads version 3.20 of the @samp{muse}
package, plus any installed version of packages other than
@samp{muse}."

In lispref/package.texi:

"Whenever Emacs starts up, it automatically calls the function
@code{package-initialize} to load installed packages."

"Automatic package loading is disabled if the user option
@code{package-enable-at-startup} is set to @code{nil} in the early
init file."

"This function initializes Emacs' internal record of which packages
are installed, and loads them. The user option
@code{package-load-list} specifies which packages to load; by default,
all installed packages are loaded. If called during startup, this
function also sets @code{package-enable-at-startup} to @code{nil}, to
avoid accidentally loading the packages twice."

"The optional argument @var{no-activate}, if non-@code{nil}, causes
Emacs to update its record of installed packages without actually
loading them; it is for internal use only."

In lispref/os.texi:

"For example, you can customize the process of loading installed
packages, by setting variables such as @var{package-load-list} or
@var{package-enable-at-startup}. @xref{Package Installation,,,
emacs,The GNU Emacs Manual}."



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-25 17:07                   ` [PATCH] Fixing package-initialize, adding early init file Stefan Monnier
@ 2018-01-28 19:42                     ` Radon Rosborough
  2018-01-30 15:02                       ` Stefan Monnier
  2018-02-10 11:56                       ` Eli Zaretskii
  0 siblings, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-01-28 19:42 UTC (permalink / raw)
  To: Stefan Monnier, Clément Pit-Claudel; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 127 bytes --]

I've fixed all the problems noted by Stefan and Clément, and rebased
onto the latest master. The revised patch is attached.

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 31675 bytes --]

From 7e45f0e4ee1eb666c096ed12435f5edb434bb2bf Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Dec 2017 17:31:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* lisp/startup.el (early-init-file): New variable, for the filename of
the early init file after it has been loaded.
(load-user-init-file): New function, used to eliminate duplicate code
in loading the early and regular init files.
(command-line): Load the early init file using `load-user-init-file'.
Move the check for an invalid username to just before that, and move
the initialization of the package system to just after.  Load the
regular init file using `load-user-init-file'.

* src/lread.c (Vuser_init_file): Note change in semantics due to its
usage while loading the early init file.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove
definition, usage, and documentation.
(package--init-file-ensured): Remove definition and usage.

* doc/lispref/os.texi: Document early init file.

* doc/lispref/package.texi: Document changes to when
package-initialize is called, and advise against calling it in the
init file.

* doc/emacs/package.texi: Document changes to when package-initialize
is called.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
init file.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00599.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00332.html
---
 doc/emacs/package.texi     |  31 ++--
 doc/lispref/os.texi        |  14 ++
 doc/lispref/package.texi   |  16 +-
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  20 +++
 lisp/emacs-lisp/package.el |  71 +--------
 lisp/startup.el            | 379 ++++++++++++++++++++++++---------------------
 src/lread.c                |   2 +-
 8 files changed, 264 insertions(+), 273 deletions(-)

diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 5f05bc0f9e..9629f41c80 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -250,31 +250,18 @@ Package Installation
 wide-ranging effects on the Emacs session.  For such information,
 consult the package's help buffer.
 
-  By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+  After a package is installed, it is automatically loaded by Emacs in
+all subsequent sessions.  This happens at startup, before processing
+the init file but after processing the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an
+exception, Emacs does not load packages at startup if invoked with the
+@samp{-q} or @samp{--no-init-file} options (@xref{Initial Options}).
 
 @vindex package-enable-at-startup
   To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
-
-@findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+@code{package-enable-at-startup} to @code{nil}.  You must do this in
+the early init file, as the variable is read before loading the
+regular init file.  Currently it cannot be done via Customize.
 
 @vindex package-load-list
   For finer control over package loading, you can use the variable
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 0854468835..209e450fbd 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -361,6 +361,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +385,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+  @dfn{early init file}, if it exists.  This is a file named
+  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
+  home directory.  The difference is that the early init file is
+  loaded much earlier during the startup process, so you can use it to
+  customize some things that are initialized before loading the
+  regular init file.  For example, you can customize the process of
+  loading installed packages, by setting variables such as
+  @var{package-load-list} or
+  @var{package-enable-at-startup}. @xref{Package Installation,,,
+  emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 21dfe1c271..d5ee4cbd47 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -106,10 +106,12 @@ Packaging Basics
 
   Whenever Emacs starts up, it automatically calls the function
 @code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+after loading the early init file, but before loading the regular init
+file and abbrev file (if any) and before running
+@code{after-init-hook} (@pxref{Startup Summary}).  Automatic package
+loading is disabled if the user option
+@code{package-enable-at-startup} is set to @code{nil} in the early
+init file.
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
@@ -123,6 +125,12 @@ Packaging Basics
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
 loading them; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after it in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index 762dfafdda..ef2c931b6d 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -890,9 +890,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index ad31553603..97f08dc0d9 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -49,6 +49,26 @@ to reduce differences between developer and production builds.
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called 'early-init.el', in 'user-emacs-directory'.  It is
+loaded very early in the startup process: before graphical elements
+such as the tool bar are initialized, and before the package manager
+is initialized.
+
++++
+** Emacs now calls 'package-initialize' before loading the init file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to 'package-initialize' into the init
+file, which was previously done when Emacs was started.  You only need
+to make changes to your configuration if some of it needs to be run
+before 'package-initialize' is called (for example, if you set
+'package-load-list' or 'package-user-dir').  In that case, place the
+configuration that needs to be run before 'package-initialize' into
+the early init file.  Note that variables like 'package-archives' can
+be set after 'package-initialize', so they can still be customized in
+the regular init file.
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 71d1c41ec3..ab02d4255b 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1431,16 +1431,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1449,13 +1444,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1872,64 +1861,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 8c36c19e82..69bc8fa781 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -312,6 +312,12 @@ inhibit-startup-hooks
 Currently this applies to: `emacs-startup-hook', `term-setup-hook',
 and `window-setup-hook'.")
 
+(defvar early-init-file nil
+  "File name, including directory, of user's early init file.
+See `user-init-file'.  The only difference is that
+`early-init-file' is not set during the course of evaluating the
+early init file.")
+
 (defvar keyboard-type nil
   "The brand of keyboard you are using.
 This variable is used to define the proper function and keypad
@@ -870,6 +876,103 @@ startup--setup-quote-display
           (when standard-display-table
             (aset standard-display-table char nil)))))))
 
+(defun load-user-init-file
+    (filename-function &optional alternate-filename-function load-defaults)
+  "Load a user init-file.
+FILENAME-FUNCTION is called with no arguments and should return
+the name of the init-file to load.  If this file cannot be
+loaded, and ALTERNATE-FILENAME-FUNCTION is non-nil, then it is
+called with no arguments and should return the name of an
+alternate init-file to load.  If LOAD-DEFAULTS is non-nil, then
+load default.el after the init-file.
+
+This function sets `user-init-file' to the name of the loaded
+init-file, or to a default value if loading is not possible."
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial
+         (if (eq init-file-debug t)
+             'startup
+           init-file-debug)))
+    (let ((debug-on-error debug-on-error-initial)
+          ;; We create an anonymous function here so that we can call
+          ;; it in different contexts depending on the value of
+          ;; `debug-on-error'.
+          (read-init-file
+           (lambda ()
+             (when init-file-user
+               (let ((init-file-name (funcall filename-function)))
+
+                 ;; If `user-init-file' is t, then `load' will store
+                 ;; the name of the file that it loads into
+                 ;; `user-init-file'.
+                 (setq user-init-file t)
+                 (load init-file-name 'noerror 'nomessage)
+
+                 (when (and (eq user-init-file t) alternate-filename-function)
+                   (load (funcall alternate-filename-function)
+                         'noerror 'nomessage))
+
+                 ;; If we did not find the user's init file, set
+                 ;; user-init-file conclusively.  Don't let it be
+                 ;; set from default.el.
+                 (when (eq user-init-file t)
+                   (setq user-init-file init-file-name)))
+
+               ;; If we loaded a compiled file, set `user-init-file' to
+               ;; the source version if that exists.
+               (when (equal (file-name-extension user-init-file)
+                            "elc")
+                 (let* ((source (file-name-sans-extension user-init-file))
+                        (alt (concat source ".el")))
+                   (setq source (cond ((file-exists-p alt) alt)
+                                      ((file-exists-p source) source)
+                                      (t nil)))
+                   (when source
+                     (when (file-newer-than-file-p source user-init-file)
+                       (message "Warning: %s is newer than %s"
+                                source user-init-file)
+                       (sit-for 1))
+                     (setq user-init-file source))))
+
+               (when load-defaults
+
+                 ;; Prevent default.el from changing the value of
+                 ;; `inhibit-startup-screen'.
+                 (let ((inhibit-startup-screen nil))
+                   (load "default" 'noerror 'nomessage)))))))
+      ;; Now call our anonymous function.
+      (if init-file-debug
+          ;; Do this without a `condition-case' if the user wants to
+          ;; debug.
+          (funcall read-init-file)
+        (condition-case error
+            (funcall read-init-file)
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+
+      ;; If we can tell that the init file altered debug-on-error,
+      ;; arrange to preserve the value that it set up.
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+
+    (when debug-on-error-should-be-set
+      (setq debug-on-error debug-on-error-from-init-file))))
+
 (defun command-line ()
   "A subroutine of `normal-top-level'.
 Amongst another things, it parses the command-line arguments."
@@ -1021,6 +1124,69 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (load-user-init-file
+   (lambda ()
+     (expand-file-name
+      "early-init"
+      (file-name-as-directory
+       (concat "~" init-file-user "/.emacs.d")))))
+  (setq early-init-file user-init-file)
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1128,153 +1294,47 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
-    (let (debug-on-error-from-init-file
-	  debug-on-error-should-be-set
-	  (debug-on-error-initial
-	   (if (eq init-file-debug t) 'startup init-file-debug)))
-      (let ((debug-on-error debug-on-error-initial)
-	    ;; This function actually reads the init files.
-	    (inner
-	     (function
-	      (lambda ()
-		(if init-file-user
-		    (let ((user-init-file-1
-			   (cond
-			     ((eq system-type 'ms-dos)
-			      (concat "~" init-file-user "/_emacs"))
-			     ((not (eq system-type 'windows-nt))
-			      (concat "~" init-file-user "/.emacs"))
-			     ;; Else deal with the Windows situation
-			     ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
-			      ;; Prefer .emacs on Windows.
-			      "~/.emacs")
-			     ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
-			      ;; Also support _emacs for compatibility, but warn about it.
-			      (push `(initialization
-				      ,(format-message
-					"`_emacs' init file is deprecated, please use `.emacs'"))
-				    delayed-warnings-list)
-			      "~/_emacs")
-			     (t ;; But default to .emacs if _emacs does not exist.
-			      "~/.emacs"))))
-		      ;; This tells `load' to store the file name found
-		      ;; into user-init-file.
-		      (setq user-init-file t)
-		      (load user-init-file-1 t t)
-
-		      (when (eq user-init-file t)
-			;; If we did not find ~/.emacs, try
-			;; ~/.emacs.d/init.el.
-			(let ((otherfile
-			       (expand-file-name
-				"init"
-				(file-name-as-directory
-				 (concat "~" init-file-user "/.emacs.d")))))
-			  (load otherfile t t)
-
-			  ;; If we did not find the user's init file,
-			  ;; set user-init-file conclusively.
-			  ;; Don't let it be set from default.el.
-			  (when (eq user-init-file t)
-			    (setq user-init-file user-init-file-1))))
-
-		      ;; If we loaded a compiled file, set
-		      ;; `user-init-file' to the source version if that
-		      ;; exists.
-		      (when (and user-init-file
-				 (equal (file-name-extension user-init-file)
-					"elc"))
-			(let* ((source (file-name-sans-extension user-init-file))
-			       (alt (concat source ".el")))
-			  (setq source (cond ((file-exists-p alt) alt)
-					     ((file-exists-p source) source)
-					     (t nil)))
-			  (when source
-			    (when (file-newer-than-file-p source user-init-file)
-			      (message "Warning: %s is newer than %s"
-				       source user-init-file)
-			      (sit-for 1))
-			    (setq user-init-file source))))
-
-		      (unless inhibit-default-init
-                        (let ((inhibit-startup-screen nil))
-                          ;; Users are supposed to be told their rights.
-                          ;; (Plus how to get help and how to undo.)
-                          ;; Don't you dare turn this off for anyone
-                          ;; except yourself.
-                          (load "default" t t)))))))))
-	(if init-file-debug
-	    ;; Do this without a condition-case if the user wants to debug.
-	    (funcall inner)
-	  (condition-case error
-	      (progn
-		(funcall inner)
-		(setq init-file-had-error nil))
-	    (error
-	     (display-warning
-	      'initialization
-	      (format-message "\
-An error occurred while loading `%s':\n\n%s%s%s\n\n\
-To ensure normal operation, you should investigate and remove the
-cause of the error in your initialization file.  Start Emacs with
-the `--debug-init' option to view a complete error backtrace."
-		      user-init-file
-		      (get (car error) 'error-message)
-		      (if (cdr error) ": " "")
-		      (mapconcat (lambda (s) (prin1-to-string s t))
-				 (cdr error) ", "))
-	      :warning)
-	     (setq init-file-had-error t))))
-
-      (if (and deactivate-mark transient-mark-mode)
-	    (with-current-buffer (window-buffer)
-	      (deactivate-mark)))
-
-	;; If the user has a file of abbrevs, read it (unless -batch).
-	(when (and (not noninteractive)
-		   (file-exists-p abbrev-file-name)
-		   (file-readable-p abbrev-file-name))
-	    (quietly-read-abbrev-file abbrev-file-name))
-
-	;; If the abbrevs came entirely from the init file or the
-	;; abbrevs file, they do not need saving.
-	(setq abbrevs-changed nil)
-
-	;; If we can tell that the init file altered debug-on-error,
-	;; arrange to preserve the value that it set up.
-	(or (eq debug-on-error debug-on-error-initial)
-	    (setq debug-on-error-should-be-set t
-		  debug-on-error-from-init-file debug-on-error)))
-      (if debug-on-error-should-be-set
-	  (setq debug-on-error debug-on-error-from-init-file)))
+    (load-user-init-file
+     (lambda ()
+       (cond
+        ((eq system-type 'ms-dos)
+         (concat "~" init-file-user "/_emacs"))
+        ((not (eq system-type 'windows-nt))
+         (concat "~" init-file-user "/.emacs"))
+        ;; Else deal with the Windows situation.
+        ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
+         ;; Prefer .emacs on Windows.
+         "~/.emacs")
+        ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
+         ;; Also support _emacs for compatibility, but warn about it.
+         (push `(initialization
+                 ,(format-message
+                   "`_emacs' init file is deprecated, please use `.emacs'"))
+               delayed-warnings-list)
+         "~/_emacs")
+        (t ;; But default to .emacs if _emacs does not exist.
+         "~/.emacs")))
+     (lambda ()
+       (expand-file-name
+        "init"
+        (file-name-as-directory
+         (concat "~" init-file-user "/.emacs.d"))))
+     (not inhibit-default-init))
+
+    (when (and deactivate-mark transient-mark-mode)
+      (with-current-buffer (window-buffer)
+        (deactivate-mark)))
+
+    ;; If the user has a file of abbrevs, read it (unless -batch).
+    (when (and (not noninteractive)
+               (file-exists-p abbrev-file-name)
+               (file-readable-p abbrev-file-name))
+      (quietly-read-abbrev-file abbrev-file-name))
+
+    ;; If the abbrevs came entirely from the init file or the
+    ;; abbrevs file, they do not need saving.
+    (setq abbrevs-changed nil)
 
     ;; Do this here in case the init file sets mail-host-address.
     (and mail-host-address
@@ -1296,33 +1356,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
diff --git a/src/lread.c b/src/lread.c
index 28d4bf9a4f..0f674803f2 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4897,7 +4897,7 @@ directory.  These file names are converted to absolute at startup.  */);
 If the file loaded had extension `.elc', and the corresponding source file
 exists, this variable contains the name of source file, suitable for use
 by functions like `custom-save-all' which edit the init file.
-While Emacs loads and evaluates the init file, value is the real name
+While Emacs loads and evaluates any init file, value is the real name
 of the file, regardless of whether or not it has the `.elc' extension.  */);
   Vuser_init_file = Qnil;
 
-- 
2.16.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 17:32                                   ` Radon Rosborough
@ 2018-01-28 22:11                                     ` Stefan Monnier
  2018-01-29  1:08                                       ` T.V Raman
                                                         ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-01-28 22:11 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: John Wiegley, George Plymale II, emacs-devel

>> This said, if a package's activation gets in the way of the user, I'd
>> generally consider it to be a bug in that package (similar to the fact
>> that if (require <foo>) has undesirable effects it's usually a bug in
>> <foo>).
> Activation of packages is a significant performance hit.
> It's therefore not a good idea to be activating superfluous packages.
> JW has told me that one of the reasons his Emacs configuration does
> not use package.el is that activating packages was too slow.

The performance impact is indeed something that probably deserves a bit
more work.  But we need to clarify what are the expected use cases and
sources of problems.  E.g.:

- In the case of JW, why does he have so many packages installed to slow
  down his startup, yet he doesn't want them activated?  Are these
  packages that he does use, but just rarely?  Or does he just have lots of
  packages installed that he doesn't use (e.g. that's my case: I always
  have all GNU ELPA packages installed, even though I use very few of
  them)?  If so, why does he have so many packages installed even tho he
  doesn't use them?

- In my case I have around 200 packages installed and I measured the
  startup cost of package-initialize to be 0.9s (with a warm cache).
  That's plenty fast for my use case (where I rarely start a new Emacs
  session), but I understand it may not be for people who like to use
  Emacs for quick one-off editing sessions.  Still, what kind of
  slowdown is JW talking about: is it also in the order of 1s?  more?
  If the slowdown is significant, could it be due to packages that do
  "too much work" in the <pkg>-autoloads.el or is it really just the
  sheer number of <pkg>-autoloads.el and <pkg>-pkg.el to process?

The issue came up recently on stackexchange and I whipped up
a quick&dirty patch to experiment (see below) which shows that my 0.9s
can be brought down to 0.3s by pre-computing a "big autoloads file",
which can then be brought down to 0.2s by loading it with
load-source-file-function bound to nil and can be reduced further to
0.1s by byte-compiling it.

Another thing we could do is add support for activating a package
without calling package-initialize beforehand (since just calling
(package-initialize t) can already take a non-negligible amount of time,
reading all the <pkg>-pkg.el files).  This way, a user could simply skip
package-initialize completely and just "manually" activate those few
packages he wants to activate.  It should be fairly easy to implement.


        Stefan


diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 71d1c41ec3..63ec6f40f7 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -676,6 +676,8 @@ package--activate-autoloads-and-load-path
 (defvar Info-directory-list)
 (declare-function info-initialize "info" ())
 
+(defvar package--fastpath-pkgs t)
+
 (defun package--load-files-for-activation (pkg-desc reload)
   "Load files for activating a package given by PKG-DESC.
 Load the autoloads file, and ensure `load-path' is setup.  If
@@ -718,16 +720,19 @@ package-activate-1
             (message "Unable to activate package `%s'.\nRequired package `%s-%s' is unavailable"
                      name (car req) (package-version-join (cadr req)))
             (throw 'exit nil))))
-      (package--load-files-for-activation pkg-desc reload)
-      ;; Add info node.
-      (when (file-exists-p (expand-file-name "dir" pkg-dir))
-        ;; FIXME: not the friendliest, but simple.
-        (require 'info)
-        (info-initialize)
-        (push pkg-dir Info-directory-list))
-      (push name package-activated-list)
-      ;; Don't return nil.
-      t)))
+      (if (listp package--fastpath-pkgs)
+          ;; We're only collecting the set of packages to activate!
+          (push pkg-desc package--fastpath-pkgs)
+        (package--load-files-for-activation pkg-desc reload)
+        ;; Add info node.
+        (when (file-exists-p (expand-file-name "dir" pkg-dir))
+          ;; FIXME: not the friendliest, but simple.
+          (require 'info)
+          (info-initialize)
+          (push pkg-dir Info-directory-list))
+        (push name package-activated-list)
+        ;; Don't return nil.
+        t))))
 
 (declare-function find-library-name "find-func" (library))
 
@@ -3468,6 +3473,49 @@ package-list-packages-no-fetch
   (interactive)
   (list-packages t))
 
+;;;; Fast-path for activation!
+
+(defcustom package-fastpath-file (locate-user-emacs-file "package-fastpath.el")
+  "Location of the file used to speed up activation of packages at startup."
+  :type 'file)
+
+(defun package-fastpath-refresh ()
+  "(Re)Generate the `package-fastpath-file'."
+  (interactive)
+  (package-initialize 'no-activate)
+  (let ((package--fastpath-pkgs ())
+        ;; Pretend we haven't activated anything yet!
+        (package-activated-list ()))
+    (dolist (elt package-alist)
+      (condition-case err
+          (package-activate (car elt))
+        ;; Don't let failure of activation of a package arbitrarily stop
+        ;; activation of further packages.
+        (error (message "%s" (error-message-string err)))))
+    (with-temp-file package-fastpath-file
+      (insert ";;; FastPath file to speed up package activation at startup  -*- lexical-binding:t -*-\n")
+      (insert ";; ¡¡ This file is autogenerated, DO NOT EDIT !!\n\n")
+      (dolist (pkg package--fastpath-pkgs)
+        (let* ((file (locate-library (package--autoloads-file-name pkg)))
+               (pfile (prin1-to-string file)))
+          (insert "(let ((load-file-name " pfile "))\n")
+          (insert-file-contents file)
+          (while (search-forward "#$" nil 'move)
+            (replace-match pfile t t))
+          (unless (bolp) (insert "\n"))
+          (insert ")\n")))
+      (pp `(setq package-activated-list
+                 (append ',(mapcar #'package-desc-name package--fastpath-pkgs)
+                         package-activated-list))
+          (current-buffer))
+      (insert "\f
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: nil
+;; no-update-autoloads: t
+;; End:
+"))))
+
 (provide 'package)
 
 ;;; package.el ends here



^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 22:11                                     ` Stefan Monnier
@ 2018-01-29  1:08                                       ` T.V Raman
  2018-01-29  5:53                                       ` Radon Rosborough
  2018-01-29  6:55                                       ` John Wiegley
  2 siblings, 0 replies; 838+ messages in thread
From: T.V Raman @ 2018-01-29  1:08 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: John Wiegley, Radon Rosborough, George Plymale II, emacs-devel

The trick re load-source-file-function is one I did not know.

A few months ago I discovered that 
let-binding 
file-name-handler-alist to nil during startup significantly sped things up.
-- 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 13:21                                 ` Stefan Monnier
  2018-01-28 17:32                                   ` Radon Rosborough
@ 2018-01-29  1:50                                   ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-01-29  1:50 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > >> I think there should be a way to activate a package explicitly for the
  > >> current session _without_ automatically activating it for future
  > >> sessions.
  > > The failure of package.el to support this use case

  > FWIW, package.el does support this case:
  > - one way is to prevent package-initialize from activating packages,
  >   and then activating the ones you want by explicit calls to package-active.
  > - another is to set package-load-list.  E.g.

This means a user _can_ do it -- but it isn't naturak and easy.
I suggest adding a convenient interface for it.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 13:24                               ` Stefan Monnier
@ 2018-01-29  1:50                                 ` Richard Stallman
  2018-01-29  5:56                                   ` Radon Rosborough
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-01-29  1:50 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Why not?  All the packages that come bundled with Emacs are always
  > unconditionally activated and we don't offer any way to prevent this
  > activation (indeed, it's activated during the dump so we basically
  > can't prevent it).

They are always "activated", but the downloadable packages are not.
Since the status of activation can change, let's handle this in the
way users expect, for things that can be enabled and disabled.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 18:20                               ` Radon Rosborough
@ 2018-01-29  1:52                                 ` Richard Stallman
  2018-02-10 12:00                                 ` Eli Zaretskii
  1 sibling, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-01-29  1:52 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: eliz, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

We can change the name of a variable painlessly by defining an alias
for it.  So let's decide which terms are best and clearest.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 22:11                                     ` Stefan Monnier
  2018-01-29  1:08                                       ` T.V Raman
@ 2018-01-29  5:53                                       ` Radon Rosborough
  2018-01-29  7:21                                         ` John Wiegley
  2018-01-29 18:54                                         ` Stefan Monnier
  2018-01-29  6:55                                       ` John Wiegley
  2 siblings, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-01-29  5:53 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: John Wiegley, George Plymale II, emacs-devel

> - In the case of JW, why does he have so many packages installed to slow
>   down his startup, yet he doesn't want them activated?  Are these
>   packages that he does use, but just rarely?  Or does he just have lots of
>   packages installed that he doesn't use (e.g. that's my case: I always
>   have all GNU ELPA packages installed, even though I use very few of
>   them)?  If so, why does he have so many packages installed even tho he
>   doesn't use them?

JW does not use package.el. Instead he uses git-subtree to manage the
packages and use-package to autoload them. The point I was trying to
demonstrate by bringing this up was that package activation is not
cheap.

> Still, what kind of slowdown is JW talking about: is it also in the
> order of 1s?

I quote:

  Especially when working on modes with complex state, I frequently
  restart Emacs, sometimes hundreds of times a day. Before use-package,
  my load times were upwards of 10-20 seconds. Today, even with >300
  declarations, it's down to 0.44 seconds, without any loss of
  functionality.

-- Radon



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29  1:50                                 ` Richard Stallman
@ 2018-01-29  5:56                                   ` Radon Rosborough
  2018-02-02  2:14                                     ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2018-01-29  5:56 UTC (permalink / raw)
  To: rms; +Cc: Stefan Monnier, emacs-devel

> They are always "activated", but the downloadable packages are not.
> Since the status of activation can change, let's handle this in the
> way users expect, for things that can be enabled and disabled.

I think things already work the way users expect. Let's look at
Python. When you install a package using 'pip', the package files are
placed on Python's search path. Thereafter, 'import <package>' works
without any further "activation" step. The package is automatically
made available in future sessions, although it is not loaded until
requested.

The analogous behavior is to have installed packages' autoloads be
made available automatically in future sessions of Emacs, although the
packages are not loaded until requested.

-- Radon



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 22:11                                     ` Stefan Monnier
  2018-01-29  1:08                                       ` T.V Raman
  2018-01-29  5:53                                       ` Radon Rosborough
@ 2018-01-29  6:55                                       ` John Wiegley
  2018-01-29 19:08                                         ` Stefan Monnier
  2 siblings, 1 reply; 838+ messages in thread
From: John Wiegley @ 2018-01-29  6:55 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Radon Rosborough, George Plymale II, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2514 bytes --]

>>>>> "SM" == Stefan Monnier <monnier@IRO.UMontreal.CA> writes:

SM> - In the case of JW, why does he have so many packages installed to slow
SM> down his startup, yet he doesn't want them activated? Are these packages
SM> that he does use, but just rarely? Or does he just have lots of packages
SM> installed that he doesn't use (e.g. that's my case: I always have all GNU
SM> ELPA packages installed, even though I use very few of them)? If so, why
SM> does he have so many packages installed even tho he doesn't use them?

I do use them, all of them. At present there are just over 385 in my local
configuration.

However, they don't all need to be active and available immediately after
startup. They fall into several categories, all of which can be deferred:

  1. A set of keybinding(s) that should "activate" the package and make its
     functionality available. Until I press one of those keys, the package
     can stay dormant, and no time should be spent on it.

  2. An entry in auto-mode-alist, interpreter-mode-list, etc.

  3. A command I must invoke via M-x to trigger autoload.

  4. Some other condition, like the loading of one of the aforementioned
     packages.

  5. Waiting until some amount of idle time has passed, since the mode in
     question is just a "bell & whistle", and I shouldn't need to wait for
     it to start using Emacs.

In fact, the packages I require to be immediately available, the instant Emacs
becomes ready, are incredibly few (I'm not even sure there are any!). By
deferring absolutely everything, and autoloading only precisely what is needed
to trigger activation, I can have Emacs available within 0.4 seconds after
startup, with all the other functionality coming online as I perform the
actions that cause them to lazy load.

And before you ask: Yes, I do restart my Emacs. A lot. This is the whole
reason I evolved this technique. Sometimes I restart Emacs over a 100 times a
day, simply because it's the only way I can be completely sure that my state
has been reset (which includes Emacs state, Nix state, shell state, OS state).

Thanks to use-package, I don't need to think very hard to make such a setup
work. And since there's almost no cost to adding in more functionality to my
Emacs, I add tons and tons: all within easy reach should I need it.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 658 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29  5:53                                       ` Radon Rosborough
@ 2018-01-29  7:21                                         ` John Wiegley
  2018-01-29 18:54                                         ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: John Wiegley @ 2018-01-29  7:21 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: emacs-devel, Stefan Monnier, George Plymale II

>>>>> "RR" == Radon Rosborough <radon.neon@gmail.com> writes:

RR> JW does not use package.el. Instead he uses git-subtree to manage the
RR> packages and use-package to autoload them. The point I was trying to
RR> demonstrate by bringing this up was that package activation is not cheap.

As of tow weeks ago, I now use Nix to manage my environment, instead of
subtrees. :) This makes it easier to vary what is installed based on the
combination of Emacs and OS version, and also I can pin individual packages at
specific versions, install custom patches, or add installation details for
packages not in ELPA or MELPA.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29  5:53                                       ` Radon Rosborough
  2018-01-29  7:21                                         ` John Wiegley
@ 2018-01-29 18:54                                         ` Stefan Monnier
  2018-01-29 19:19                                           ` John Wiegley
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-29 18:54 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: John Wiegley, George Plymale II, emacs-devel

>> Still, what kind of slowdown is JW talking about: is it also in the
>> order of 1s?
> I quote:
>   Especially when working on modes with complex state, I frequently
>   restart Emacs, sometimes hundreds of times a day. Before use-package,
>   my load times were upwards of 10-20 seconds. Today, even with >300
>   declarations, it's down to 0.44 seconds, without any loss of
>   functionality.

Hopefully John will chime in to correct me, but my vague understanding
is that his 10-20s were not due to package-initialize, but rather to
"manual installation" methods and configuration.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29  6:55                                       ` John Wiegley
@ 2018-01-29 19:08                                         ` Stefan Monnier
  2018-01-29 19:55                                           ` John Wiegley
  2018-01-29 20:18                                           ` Clément Pit-Claudel
  0 siblings, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-01-29 19:08 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: George Plymale II, emacs-devel

> Thanks to use-package, I don't need to think very hard to make such a setup
> work.  And since there's almost no cost to adding in more functionality to my
> Emacs, I add tons and tons: all within easy reach should I need it.

We were talking about package activation rather than configuration, so
use-package is not an apples-to-apples comparison.

`package-initialize` is supposed to do things like:

> 1. A set of keybinding(s) that should "activate" the package and make its
>    functionality available. Until I press one of those keys, the package
>    can stay dormant, and no time should be spent on it.
>
> 2. An entry in auto-mode-alist, interpreter-mode-list, etc.
>
> 3. A command I must invoke via M-x to trigger autoload.

and pretty much nothing else, i.e. a subset of what use-package is often
used for.  AFAIK for packages installed with package.el, this part of
use-package only makes sense when the packages is not properly packaged
(i.e. doesn't do 1/2/3 correctly in their <pkg>-autoloads.el).

Regarding the other two points:

> 4. Some other condition, like the loading of one of the aforementioned
>    packages.
>
> 5. Waiting until some amount of idle time has passed, since the mode in
>    question is just a "bell & whistle", and I shouldn't need to wait for
>    it to start using Emacs.

These have to do with configuration, not with activation, so
package-initialize should never do any of that nor prevent doing any of
that.  This part of use-package is just as useful for ELPA-installed
packages as for any others.

> I do use them, all of them. At present there are just over 385 in my local
> configuration.
[...]
> to trigger activation, I can have Emacs available within 0.4 seconds after
> startup, with all the other functionality coming online as I perform the

I don't think I can easily bring down the speed of package-initialize
much below 0.1s for my 200 packages on my Thinkpad T61.  Whether that
would still let you startup in 0.4s with your config, I can't tell.

There's no doubt that with use-package you have a finer control about
what happens when, so you can delay some of the things done during
package-initialize, but without looking more deeply into it, it's hard
to tell whether that would really be needed.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 18:54                                         ` Stefan Monnier
@ 2018-01-29 19:19                                           ` John Wiegley
  2018-01-29 19:55                                             ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: John Wiegley @ 2018-01-29 19:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Radon Rosborough, George Plymale II, emacs-devel

>>>>> "SM" == Stefan Monnier <monnier@IRO.UMontreal.CA> writes:

SM> Hopefully John will chime in to correct me, but my vague understanding is
SM> that his 10-20s were not due to package-initialize, but rather to "manual
SM> installation" methods and configuration.

It's not entirely due to package-initialize, but that accounted for about 5
seconds of it.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 19:19                                           ` John Wiegley
@ 2018-01-29 19:55                                             ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-01-29 19:55 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: George Plymale II, emacs-devel

> SM> Hopefully John will chime in to correct me, but my vague understanding is
> SM> that his 10-20s were not due to package-initialize, but rather to "manual
> SM> installation" methods and configuration.
> It's not entirely due to package-initialize, but that accounted for about 5
> seconds of it.

Hmm... since my 200 packages take 0.9s on my Thinkpad T61, there's
a good chance that those 5s with your <400 packages are linked to some
poorly packaged packages (more specifically, packages which do too much
work in their <pkg>-autoloads.el, most likely leading not only to a slow
startup but also to undesirable side-effects for those users who
have the package installed yet don't want to use it).

Maybe we should make more efforts at documenting/promoting good
practices in this regard (tho, we should likely first try and figure
out where those 5s are spent, to make sure we don't bark up the wrong
tree).

I'd also be interested to know how much time it takes your machine to
load the "package-fastpath" file that my patch builds (both in source
form and in compiled form).  To distinguish the time taken by the
packages's activation itself from the time taken by package-initialize to
find and fetch that package activation code.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 19:08                                         ` Stefan Monnier
@ 2018-01-29 19:55                                           ` John Wiegley
  2018-01-29 21:50                                             ` Stefan Monnier
  2018-01-29 20:18                                           ` Clément Pit-Claudel
  1 sibling, 1 reply; 838+ messages in thread
From: John Wiegley @ 2018-01-29 19:55 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Radon Rosborough, George Plymale II, emacs-devel

>>>>> "SM" == Stefan Monnier <monnier@IRO.UMontreal.CA> writes:

SM> I don't think I can easily bring down the speed of package-initialize much
SM> below 0.1s for my 200 packages on my Thinkpad T61. Whether that would
SM> still let you startup in 0.4s with your config, I can't tell.

SM> There's no doubt that with use-package you have a finer control about what
SM> happens when, so you can delay some of the things done during
SM> package-initialize, but without looking more deeply into it, it's hard to
SM> tell whether that would really be needed.

True. Note that I did shave an entire second from my startup time just by
adding:

    (setq package-enable-at-startup nil)

I determined this was slowing things down considerably (at least, in my
environment) by running profiler-start as the very first thing in my init
file.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 19:08                                         ` Stefan Monnier
  2018-01-29 19:55                                           ` John Wiegley
@ 2018-01-29 20:18                                           ` Clément Pit-Claudel
  2018-01-30 15:11                                             ` Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-01-29 20:18 UTC (permalink / raw)
  To: emacs-devel

On 2018-01-29 14:08, Stefan Monnier wrote:
> I don't think I can easily bring down the speed of package-initialize
> much below 0.1s for my 200 packages on my Thinkpad T61.

FWIW, activating about 100 packages in my config takes about .4s:

              - package-initialize                                232  89%
               + package-activate                                 136  52%
               + package-read-all-archive-contents                 64  24%
               + package-load-all-descriptors                      24   9%
               + package--build-compatibility-table                  8   3%

More precisely:

              - package-initialize                                232  89%
               - package-activate                                 136  52%
                - package-activate-1                              136  52%
                 - package--load-files-for-activation              96  36%
                  - package--activate-autoloads-and-load-path      68  26%
                   + load                                          68  26%
                  + file-truename                                  28  10%
                 - package-activate                                32  12%
                  + package-activate-1                             32  12%
                 - require                                          8   3%
                  + defvar                                          4   1%
               - package-read-all-archive-contents                 64  24%
                - package-read-archive-contents                    64  24%
                 - package--add-to-archive-contents                44  16%
                  + package--append-to-alist                        4   1%
                   package--read-archive-file                      20   7%
               - package-load-all-descriptors                      24   9%
                - package-load-descriptor                          24   9%
                 + package-process-define-package                   8   3%
                   #<compiled 0xd255c5>                             4   1%
               + package--build-compatibility-table                 8   3%

The reverse tree is also interesting:

+ file-truename                                                    60  23%
+ package--add-to-archive-contents                                 40  15%
  Automatic GC                                                     24   9%
+ package--read-archive-file                                       20   7%
+ load-with-code-conversion                                        16   6%
+ eval-buffer                                                      16   6%
+ package-load-descriptor                                          12   4%
+ package--mapc                                                     8   3%
+ let                                                               4   1%
+ #<compiled 0xd255c5>                                              4   1%
+ package-desc-from-define                                          4   1%
+ version-to-list                                                   4   1%
+ package-desc-priority-version                                     4   1%

It looks likes package--add-to-archive-contents is linear in the number of packages, and called once per package?
I'm not sure why file-truename is called that much.

Clément.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 19:55                                           ` John Wiegley
@ 2018-01-29 21:50                                             ` Stefan Monnier
  2018-01-29 23:13                                               ` Clément Pit-Claudel
  2018-01-30  1:37                                               ` T.V Raman
  0 siblings, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-01-29 21:50 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: George Plymale II, emacs-devel

> True. Note that I did shave an entire second from my startup time just by
> adding:
>     (setq package-enable-at-startup nil)

My experiments indicate that we might be able to divide this time by
almost a factor 10 if we pre-compute and byte-compile one big autoloads
file, so it would only shave 0.1s of your startup time.  Given that it
would also let you simplify the rest of your startup, there's a chance
the result would be pretty competitive with your current setup.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 21:50                                             ` Stefan Monnier
@ 2018-01-29 23:13                                               ` Clément Pit-Claudel
  2018-01-30  1:37                                               ` T.V Raman
  1 sibling, 0 replies; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-01-29 23:13 UTC (permalink / raw)
  To: emacs-devel

On 2018-01-29 16:50, Stefan Monnier wrote:
> My experiments indicate that we might be able to divide this time by
> almost a factor 10 if we pre-compute and byte-compile one big autoloads
> file

Yes please :)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 21:50                                             ` Stefan Monnier
  2018-01-29 23:13                                               ` Clément Pit-Claudel
@ 2018-01-30  1:37                                               ` T.V Raman
  1 sibling, 0 replies; 838+ messages in thread
From: T.V Raman @ 2018-01-30  1:37 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Radon Rosborough, George Plymale II, emacs-devel

How would something like 
(make-thread #'package-initialize) 
do in comparison? Effectively that should run on a separate thread and
contribute little to startup time as measured by when emacs is ready to use?
-- 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-28 19:42                     ` Radon Rosborough
@ 2018-01-30 15:02                       ` Stefan Monnier
  2018-01-30 15:44                         ` Eli Zaretskii
  2018-01-30 19:30                         ` Radon Rosborough
  2018-02-10 11:56                       ` Eli Zaretskii
  1 sibling, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-01-30 15:02 UTC (permalink / raw)
  To: emacs-devel

> I've fixed all the problems noted by Stefan and Clément, and rebased
> onto the latest master. The revised patch is attached.

LGTM
Do you have write access or do you need someone to push this for you?
Eli&John, any objection to installing this into master?


        Stefan


PS: In the mean time, some more comments to keep us busy:

> * lisp/startup.el (early-init-file): New variable, for the filename of
> the early init file after it has been loaded.

"New variable" is enough, the rest is described in the code already.

> (load-user-init-file): New function, used to eliminate duplicate code
> in loading the early and regular init files.

Same here.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29 20:18                                           ` Clément Pit-Claudel
@ 2018-01-30 15:11                                             ` Stefan Monnier
  2018-01-30 22:33                                               ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-30 15:11 UTC (permalink / raw)
  To: emacs-devel

>> I don't think I can easily bring down the speed of package-initialize
>> much below 0.1s for my 200 packages on my Thinkpad T61.
> FWIW, activating about 100 packages in my config takes about .4s:

That's consistent with my 0.9s for 200 packages (tho not with John's 1s
for almost 400 packages), but it of course depends a lot on the details
of your machine (e.g. mine is almost 10 years old, John's is only 3).

> It looks likes package--add-to-archive-contents is linear in the
> number of packages, and called once per package?  I'm not sure why
> file-truename is called that much.

Note that my attempt to bring it down to 0.1s circumvents all that code
(or rather, pre-runs it offline to generate a single "mega-autoloads"
file, so that activation of all packages reduces to loading that one
file).


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-30 15:02                       ` Stefan Monnier
@ 2018-01-30 15:44                         ` Eli Zaretskii
  2018-02-01  3:12                           ` Mark Oteiza
  2018-02-08  5:54                           ` Radon Rosborough
  2018-01-30 19:30                         ` Radon Rosborough
  1 sibling, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-01-30 15:44 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Tue, 30 Jan 2018 10:02:53 -0500
> 
> > I've fixed all the problems noted by Stefan and Clément, and rebased
> > onto the latest master. The revised patch is attached.
> 
> LGTM
> Do you have write access or do you need someone to push this for you?
> Eli&John, any objection to installing this into master?

I didn't yet have time to read the patch, will do in the following
days, and get back.  I don't expect to object, but I might have some
comments.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-30 15:02                       ` Stefan Monnier
  2018-01-30 15:44                         ` Eli Zaretskii
@ 2018-01-30 19:30                         ` Radon Rosborough
  1 sibling, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-01-30 19:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 442 bytes --]

> Do you have write access or do you need someone to push this for you?

The latter.

> > * lisp/startup.el (early-init-file): New variable, for the filename of
> > the early init file after it has been loaded.
>
> "New variable" is enough, the rest is described in the code already.
>
> > (load-user-init-file): New function, used to eliminate duplicate code
> > in loading the early and regular init files.
>
> Same here.

Fixed.

-- Radon

[-- Attachment #1.2: Type: text/html, Size: 1228 bytes --]

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 31531 bytes --]

From dfe5ebd007c2fdab8b6e7d72891ef3acf3f31df6 Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Dec 2017 17:31:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* lisp/startup.el (early-init-file): New variable.
(load-user-init-file): New function.
(command-line): Load the early init file using `load-user-init-file'.
Move the check for an invalid username to just before that, and move
the initialization of the package system to just after.  Load the
regular init file using `load-user-init-file'.

* src/lread.c (Vuser_init_file): Note change in semantics due to its
usage while loading the early init file.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove
definition, usage, and documentation.
(package--init-file-ensured): Remove definition and usage.

* doc/lispref/os.texi: Document early init file.

* doc/lispref/package.texi: Document changes to when
package-initialize is called, and advise against calling it in the
init file.

* doc/emacs/package.texi: Document changes to when package-initialize
is called.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
init file.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00599.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00332.html
---
 doc/emacs/package.texi     |  31 ++--
 doc/lispref/os.texi        |  14 ++
 doc/lispref/package.texi   |  16 +-
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  20 +++
 lisp/emacs-lisp/package.el |  71 +--------
 lisp/startup.el            | 379 ++++++++++++++++++++++++---------------------
 src/lread.c                |   2 +-
 8 files changed, 264 insertions(+), 273 deletions(-)

diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index 5f05bc0f9e..9629f41c80 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -250,31 +250,18 @@ Package Installation
 wide-ranging effects on the Emacs session.  For such information,
 consult the package's help buffer.
 
-  By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+  After a package is installed, it is automatically loaded by Emacs in
+all subsequent sessions.  This happens at startup, before processing
+the init file but after processing the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an
+exception, Emacs does not load packages at startup if invoked with the
+@samp{-q} or @samp{--no-init-file} options (@xref{Initial Options}).
 
 @vindex package-enable-at-startup
   To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
-
-@findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+@code{package-enable-at-startup} to @code{nil}.  You must do this in
+the early init file, as the variable is read before loading the
+regular init file.  Currently it cannot be done via Customize.
 
 @vindex package-load-list
   For finer control over package loading, you can use the variable
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 9352a929a7..c76c4d80b6 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -361,6 +361,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +385,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+  @dfn{early init file}, if it exists.  This is a file named
+  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
+  home directory.  The difference is that the early init file is
+  loaded much earlier during the startup process, so you can use it to
+  customize some things that are initialized before loading the
+  regular init file.  For example, you can customize the process of
+  loading installed packages, by setting variables such as
+  @var{package-load-list} or
+  @var{package-enable-at-startup}. @xref{Package Installation,,,
+  emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 21dfe1c271..d5ee4cbd47 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -106,10 +106,12 @@ Packaging Basics
 
   Whenever Emacs starts up, it automatically calls the function
 @code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+after loading the early init file, but before loading the regular init
+file and abbrev file (if any) and before running
+@code{after-init-hook} (@pxref{Startup Summary}).  Automatic package
+loading is disabled if the user option
+@code{package-enable-at-startup} is set to @code{nil} in the early
+init file.
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
@@ -123,6 +125,12 @@ Packaging Basics
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
 loading them; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after it in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index aa3b029ab7..68aa01ca18 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -890,9 +890,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index b28f284116..a440c187c4 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -49,6 +49,26 @@ to reduce differences between developer and production builds.
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called 'early-init.el', in 'user-emacs-directory'.  It is
+loaded very early in the startup process: before graphical elements
+such as the tool bar are initialized, and before the package manager
+is initialized.
+
++++
+** Emacs now calls 'package-initialize' before loading the init file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to 'package-initialize' into the init
+file, which was previously done when Emacs was started.  You only need
+to make changes to your configuration if some of it needs to be run
+before 'package-initialize' is called (for example, if you set
+'package-load-list' or 'package-user-dir').  In that case, place the
+configuration that needs to be run before 'package-initialize' into
+the early init file.  Note that variables like 'package-archives' can
+be set after 'package-initialize', so they can still be customized in
+the regular init file.
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 71d1c41ec3..ab02d4255b 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1431,16 +1431,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1449,13 +1444,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1872,64 +1861,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 8c36c19e82..69bc8fa781 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -312,6 +312,12 @@ inhibit-startup-hooks
 Currently this applies to: `emacs-startup-hook', `term-setup-hook',
 and `window-setup-hook'.")
 
+(defvar early-init-file nil
+  "File name, including directory, of user's early init file.
+See `user-init-file'.  The only difference is that
+`early-init-file' is not set during the course of evaluating the
+early init file.")
+
 (defvar keyboard-type nil
   "The brand of keyboard you are using.
 This variable is used to define the proper function and keypad
@@ -870,6 +876,103 @@ startup--setup-quote-display
           (when standard-display-table
             (aset standard-display-table char nil)))))))
 
+(defun load-user-init-file
+    (filename-function &optional alternate-filename-function load-defaults)
+  "Load a user init-file.
+FILENAME-FUNCTION is called with no arguments and should return
+the name of the init-file to load.  If this file cannot be
+loaded, and ALTERNATE-FILENAME-FUNCTION is non-nil, then it is
+called with no arguments and should return the name of an
+alternate init-file to load.  If LOAD-DEFAULTS is non-nil, then
+load default.el after the init-file.
+
+This function sets `user-init-file' to the name of the loaded
+init-file, or to a default value if loading is not possible."
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial
+         (if (eq init-file-debug t)
+             'startup
+           init-file-debug)))
+    (let ((debug-on-error debug-on-error-initial)
+          ;; We create an anonymous function here so that we can call
+          ;; it in different contexts depending on the value of
+          ;; `debug-on-error'.
+          (read-init-file
+           (lambda ()
+             (when init-file-user
+               (let ((init-file-name (funcall filename-function)))
+
+                 ;; If `user-init-file' is t, then `load' will store
+                 ;; the name of the file that it loads into
+                 ;; `user-init-file'.
+                 (setq user-init-file t)
+                 (load init-file-name 'noerror 'nomessage)
+
+                 (when (and (eq user-init-file t) alternate-filename-function)
+                   (load (funcall alternate-filename-function)
+                         'noerror 'nomessage))
+
+                 ;; If we did not find the user's init file, set
+                 ;; user-init-file conclusively.  Don't let it be
+                 ;; set from default.el.
+                 (when (eq user-init-file t)
+                   (setq user-init-file init-file-name)))
+
+               ;; If we loaded a compiled file, set `user-init-file' to
+               ;; the source version if that exists.
+               (when (equal (file-name-extension user-init-file)
+                            "elc")
+                 (let* ((source (file-name-sans-extension user-init-file))
+                        (alt (concat source ".el")))
+                   (setq source (cond ((file-exists-p alt) alt)
+                                      ((file-exists-p source) source)
+                                      (t nil)))
+                   (when source
+                     (when (file-newer-than-file-p source user-init-file)
+                       (message "Warning: %s is newer than %s"
+                                source user-init-file)
+                       (sit-for 1))
+                     (setq user-init-file source))))
+
+               (when load-defaults
+
+                 ;; Prevent default.el from changing the value of
+                 ;; `inhibit-startup-screen'.
+                 (let ((inhibit-startup-screen nil))
+                   (load "default" 'noerror 'nomessage)))))))
+      ;; Now call our anonymous function.
+      (if init-file-debug
+          ;; Do this without a `condition-case' if the user wants to
+          ;; debug.
+          (funcall read-init-file)
+        (condition-case error
+            (funcall read-init-file)
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+
+      ;; If we can tell that the init file altered debug-on-error,
+      ;; arrange to preserve the value that it set up.
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+
+    (when debug-on-error-should-be-set
+      (setq debug-on-error debug-on-error-from-init-file))))
+
 (defun command-line ()
   "A subroutine of `normal-top-level'.
 Amongst another things, it parses the command-line arguments."
@@ -1021,6 +1124,69 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (load-user-init-file
+   (lambda ()
+     (expand-file-name
+      "early-init"
+      (file-name-as-directory
+       (concat "~" init-file-user "/.emacs.d")))))
+  (setq early-init-file user-init-file)
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1128,153 +1294,47 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
-    (let (debug-on-error-from-init-file
-	  debug-on-error-should-be-set
-	  (debug-on-error-initial
-	   (if (eq init-file-debug t) 'startup init-file-debug)))
-      (let ((debug-on-error debug-on-error-initial)
-	    ;; This function actually reads the init files.
-	    (inner
-	     (function
-	      (lambda ()
-		(if init-file-user
-		    (let ((user-init-file-1
-			   (cond
-			     ((eq system-type 'ms-dos)
-			      (concat "~" init-file-user "/_emacs"))
-			     ((not (eq system-type 'windows-nt))
-			      (concat "~" init-file-user "/.emacs"))
-			     ;; Else deal with the Windows situation
-			     ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
-			      ;; Prefer .emacs on Windows.
-			      "~/.emacs")
-			     ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
-			      ;; Also support _emacs for compatibility, but warn about it.
-			      (push `(initialization
-				      ,(format-message
-					"`_emacs' init file is deprecated, please use `.emacs'"))
-				    delayed-warnings-list)
-			      "~/_emacs")
-			     (t ;; But default to .emacs if _emacs does not exist.
-			      "~/.emacs"))))
-		      ;; This tells `load' to store the file name found
-		      ;; into user-init-file.
-		      (setq user-init-file t)
-		      (load user-init-file-1 t t)
-
-		      (when (eq user-init-file t)
-			;; If we did not find ~/.emacs, try
-			;; ~/.emacs.d/init.el.
-			(let ((otherfile
-			       (expand-file-name
-				"init"
-				(file-name-as-directory
-				 (concat "~" init-file-user "/.emacs.d")))))
-			  (load otherfile t t)
-
-			  ;; If we did not find the user's init file,
-			  ;; set user-init-file conclusively.
-			  ;; Don't let it be set from default.el.
-			  (when (eq user-init-file t)
-			    (setq user-init-file user-init-file-1))))
-
-		      ;; If we loaded a compiled file, set
-		      ;; `user-init-file' to the source version if that
-		      ;; exists.
-		      (when (and user-init-file
-				 (equal (file-name-extension user-init-file)
-					"elc"))
-			(let* ((source (file-name-sans-extension user-init-file))
-			       (alt (concat source ".el")))
-			  (setq source (cond ((file-exists-p alt) alt)
-					     ((file-exists-p source) source)
-					     (t nil)))
-			  (when source
-			    (when (file-newer-than-file-p source user-init-file)
-			      (message "Warning: %s is newer than %s"
-				       source user-init-file)
-			      (sit-for 1))
-			    (setq user-init-file source))))
-
-		      (unless inhibit-default-init
-                        (let ((inhibit-startup-screen nil))
-                          ;; Users are supposed to be told their rights.
-                          ;; (Plus how to get help and how to undo.)
-                          ;; Don't you dare turn this off for anyone
-                          ;; except yourself.
-                          (load "default" t t)))))))))
-	(if init-file-debug
-	    ;; Do this without a condition-case if the user wants to debug.
-	    (funcall inner)
-	  (condition-case error
-	      (progn
-		(funcall inner)
-		(setq init-file-had-error nil))
-	    (error
-	     (display-warning
-	      'initialization
-	      (format-message "\
-An error occurred while loading `%s':\n\n%s%s%s\n\n\
-To ensure normal operation, you should investigate and remove the
-cause of the error in your initialization file.  Start Emacs with
-the `--debug-init' option to view a complete error backtrace."
-		      user-init-file
-		      (get (car error) 'error-message)
-		      (if (cdr error) ": " "")
-		      (mapconcat (lambda (s) (prin1-to-string s t))
-				 (cdr error) ", "))
-	      :warning)
-	     (setq init-file-had-error t))))
-
-      (if (and deactivate-mark transient-mark-mode)
-	    (with-current-buffer (window-buffer)
-	      (deactivate-mark)))
-
-	;; If the user has a file of abbrevs, read it (unless -batch).
-	(when (and (not noninteractive)
-		   (file-exists-p abbrev-file-name)
-		   (file-readable-p abbrev-file-name))
-	    (quietly-read-abbrev-file abbrev-file-name))
-
-	;; If the abbrevs came entirely from the init file or the
-	;; abbrevs file, they do not need saving.
-	(setq abbrevs-changed nil)
-
-	;; If we can tell that the init file altered debug-on-error,
-	;; arrange to preserve the value that it set up.
-	(or (eq debug-on-error debug-on-error-initial)
-	    (setq debug-on-error-should-be-set t
-		  debug-on-error-from-init-file debug-on-error)))
-      (if debug-on-error-should-be-set
-	  (setq debug-on-error debug-on-error-from-init-file)))
+    (load-user-init-file
+     (lambda ()
+       (cond
+        ((eq system-type 'ms-dos)
+         (concat "~" init-file-user "/_emacs"))
+        ((not (eq system-type 'windows-nt))
+         (concat "~" init-file-user "/.emacs"))
+        ;; Else deal with the Windows situation.
+        ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
+         ;; Prefer .emacs on Windows.
+         "~/.emacs")
+        ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
+         ;; Also support _emacs for compatibility, but warn about it.
+         (push `(initialization
+                 ,(format-message
+                   "`_emacs' init file is deprecated, please use `.emacs'"))
+               delayed-warnings-list)
+         "~/_emacs")
+        (t ;; But default to .emacs if _emacs does not exist.
+         "~/.emacs")))
+     (lambda ()
+       (expand-file-name
+        "init"
+        (file-name-as-directory
+         (concat "~" init-file-user "/.emacs.d"))))
+     (not inhibit-default-init))
+
+    (when (and deactivate-mark transient-mark-mode)
+      (with-current-buffer (window-buffer)
+        (deactivate-mark)))
+
+    ;; If the user has a file of abbrevs, read it (unless -batch).
+    (when (and (not noninteractive)
+               (file-exists-p abbrev-file-name)
+               (file-readable-p abbrev-file-name))
+      (quietly-read-abbrev-file abbrev-file-name))
+
+    ;; If the abbrevs came entirely from the init file or the
+    ;; abbrevs file, they do not need saving.
+    (setq abbrevs-changed nil)
 
     ;; Do this here in case the init file sets mail-host-address.
     (and mail-host-address
@@ -1296,33 +1356,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
diff --git a/src/lread.c b/src/lread.c
index 3b0a17c90b..ac1b3da7b7 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4886,7 +4886,7 @@ directory.  These file names are converted to absolute at startup.  */);
 If the file loaded had extension `.elc', and the corresponding source file
 exists, this variable contains the name of source file, suitable for use
 by functions like `custom-save-all' which edit the init file.
-While Emacs loads and evaluates the init file, value is the real name
+While Emacs loads and evaluates any init file, value is the real name
 of the file, regardless of whether or not it has the `.elc' extension.  */);
   Vuser_init_file = Qnil;
 
-- 
2.16.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-30 15:11                                             ` Stefan Monnier
@ 2018-01-30 22:33                                               ` George Plymale II
  2018-01-30 22:56                                                 ` George Plymale II
                                                                   ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: George Plymale II @ 2018-01-30 22:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Hi all,

I'm the one who posted the question on Stack Exchange, which Stefan
mentioned the other day. My specific question is detailed here:
https://emacs.stackexchange.com/q/38368/10761

So, I've tried out Stefan's patch and it's definitely an improvement on
startup time, but the improvement is not huge for me. Specifically, I've
done the following in my startup files:

(setq package-enable-at-startup nil)
(load "~/.emacs.d/package-fastpath.el")
(setq package--initialized t)

I put that code in my files after running Stefan's
`package-fastpath-refresh'. I also set `load-source-file-function' to
nil as per Stefan's suggestion. Unfortunately, I couldn't byte-compile
my package-fastpath.el file due to some packages which already
byte-compile their autoload files, such as SLIME.

Now, I do see some improvement in my startup time, but to reiterate, it
is not huge. When I run Emacs with my startup commented out,
`emacs-init-time' yields 1.2 seconds. When I run it with my startup
intact, it yields 1.3 or 1.4 seconds. This contrasts with my previous
`emacs-init-time' which was 1.6 or 1.7 seconds, but as you can see, it's
not a really big difference.

It is possible that this sub-par time is due to something on my own
system, but I'm not sure nor convinced of that. Moreover, Stefan's patch
certainly can use some improvements and some notes on how to use his
changes, as it is a bit vexing to figure it out by reading the diff ;)

I did notice a few bugs with Stefan's changes. One bug was that
`package-installed-p' no longer yields correct results on installed
packages. I believe that this is because `package-desc-p' is also broken
by these changes. This broke some code in my startup which I used to
check whether I need to install new packages.

Another bug was that some packages were placed in bad order in
package-fastpath.el. In other words, if a dependency's autoloads are
written to this file after its dependent package, the dependent package
will err, saying that it couldn't require one of its dependencies. There
is obviously some work to do on making sure that dependencies are placed
in the correct order or to change the code so that package-fastpath.el
is order-agnostic.

As a side note and a bit of an opinion, Radon Rosborough made an
interesting remark in one of his messages. He mentioned pip and how
things are done in Python, which really struck me. You never really
think about using a package in a language like Python or Ruby. You just
`require' or `import' it and that's that. It's really simple and the
amount of packages that you have never hurts the startup of the main
program. I know that Emacs is a bit more complicated since it's more of
a text editor than a language and we have somewhat more intricacies to
worry about. But I think that this kind of a model is the kind we need
to be headed for.

A user should be able to have a million packages and not have to worry
about the subsequent startup time. Heck, in my own Ruby installation I
have 436 gems and I've never even thought about startup time till now.

In any case, I think Stefan's ideas and proposed changes are a good idea
and I am in much the same boat as John Wiegley in that I restart Emacs
often enough that startup time gets on my nerves. So I hope that we'll
have some real progress on this issue and make package.el more robust.

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-30 22:33                                               ` George Plymale II
@ 2018-01-30 22:56                                                 ` George Plymale II
  2018-01-31  3:47                                                 ` Stefan Monnier
  2018-01-31  3:51                                                 ` T.V Raman
  2 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-01-30 22:56 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 338 bytes --]

One more thing in addition to my last message,

I noticed that Stefan's patch does not work on Emacs 25.3, as the second
hunk fails. It looks like the code is different there so I can only
assume that Stefan is on a newer version of Emacs. I have attached the
patch that should work on Emacs 25.3 in case anyone wants to try it on 25.3.


[-- Attachment #2: Stefan's patch adapted for Emacs 25.3 --]
[-- Type: text/x-patch, Size: 3777 bytes --]

diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 32200227de..1fa6ce4758 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -656,6 +656,8 @@ PKG-DESC is a `package-desc' object."
 (defvar Info-directory-list)
 (declare-function info-initialize "info" ())
 
+(defvar package--fastpath-pkgs t)
+
 (defun package--load-files-for-activation (pkg-desc reload)
   "Load files for activating a package given by PKG-DESC.
 Load the autoloads file, and ensure `load-path' is setup.  If
@@ -696,16 +698,19 @@ correspond to previously loaded files (those returned by
         (unless (package-activate (car req))
           (error "Unable to activate package `%s'.\nRequired package `%s-%s' is unavailable"
                  name (car req) (package-version-join (cadr req))))))
-    (package--load-files-for-activation pkg-desc reload)
-    ;; Add info node.
-    (when (file-exists-p (expand-file-name "dir" pkg-dir))
-      ;; FIXME: not the friendliest, but simple.
-      (require 'info)
-      (info-initialize)
-      (push pkg-dir Info-directory-list))
-    (push name package-activated-list)
-    ;; Don't return nil.
-    t))
+    (if (listp package--fastpath-pkgs)
+        ;; We're only collecting the set of packages to activate!
+        (push pkg-desc package--fastpath-pkgs)
+      (package--load-files-for-activation pkg-desc reload)
+      ;; Add info node.
+      (when (file-exists-p (expand-file-name "dir" pkg-dir))
+        ;; FIXME: not the friendliest, but simple.
+        (require 'info)
+        (info-initialize)
+        (push pkg-dir Info-directory-list))
+      (push name package-activated-list)
+      ;; Don't return nil.
+      t)))
 
 (declare-function find-library-name "find-func" (library))
 
@@ -3437,6 +3442,51 @@ The list is displayed in a buffer named `*Packages*'."
   (interactive)
   (list-packages t))
 
+;;;; Fast-path for activation!
+
+(defcustom package-fastpath-file (locate-user-emacs-file "package-fastpath.el")
+  "Location of the file used to speed up activation of packages at startup."
+  :type 'file)
+
+(defun package-fastpath-refresh ()
+  "(Re)Generate the `package-fastpath-file'."
+  (interactive)
+  (package-initialize 'no-activate)
+  (let ((package--fastpath-pkgs ())
+        ;; Pretend we haven't activated anything yet!
+        (package-activated-list ()))
+    (dolist (elt package-alist)
+      (condition-case err
+          (package-activate (car elt))
+        ;; Don't let failure of activation of a package arbitrarily stop
+        ;; activation of further packages.
+        (error (message "%s" (error-message-string err)))))
+    (with-temp-file package-fastpath-file
+      (insert ";;; FastPath file to speed up package activation at startup  -*- lexical-binding:t -*-\n")
+      (insert ";; ¡¡ This file is autogenerated, DO NOT EDIT !!\n\n")
+      (dolist (pkg package--fastpath-pkgs)
+        (let* ((file (locate-library (package--autoloads-file-name pkg)))
+               (pfile (prin1-to-string file)))
+          (insert "(let ((load-file-name " pfile "))\n")
+          (insert-file-contents file)
+          (while (search-forward "#$" nil 'move)
+            (replace-match pfile t t))
+          (unless (bolp) (insert "\n"))
+          (insert ")\n")))
+      (pp `(setq package-activated-list
+                 (append ',(mapcar #'package-desc-name package--fastpath-pkgs)
+                         package-activated-list))
+          (current-buffer))
+      (insert "\f
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: nil
+;; no-update-autoloads: t
+;; End:
+"))))
+
+
+
 (provide 'package)
 
 ;;; package.el ends here

^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-30 22:33                                               ` George Plymale II
  2018-01-30 22:56                                                 ` George Plymale II
@ 2018-01-31  3:47                                                 ` Stefan Monnier
  2018-01-31  5:17                                                   ` George Plymale II
  2018-01-31  3:51                                                 ` T.V Raman
  2 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-31  3:47 UTC (permalink / raw)
  To: George Plymale II; +Cc: emacs-devel

> (setq package-enable-at-startup nil)
> (load "~/.emacs.d/package-fastpath.el")
> (setq package--initialized t)

I think setting package--initialized to t is wrong, here (IIRC
package--initialized means that we've filled the tables keeping track
of which packages are available and such).  Not a problem when you're
just trying to test the speed of my proof-of-concept patch, of course.

> Unfortunately, I couldn't byte-compile my package-fastpath.el file due
> to some packages which already byte-compile their autoload files, such
> as SLIME.

Hmm... are you saying that my code ends up fetching code for
slime-autoloads.elc instead of slime-autoloads.el?
Or that slime-autoloads.el contains (pre)compiled code?

Also, I'm not 100% surprised that byte-compiling byte-compiled code would
fail, but I can't see any immediate reason why it should fail, so it's
quite possible to it'd be easy to make it work.

> Now, I do see some improvement in my startup time, but to reiterate, it
> is not huge.  When I run Emacs with my startup commented out,
> `emacs-init-time' yields 1.2 seconds.

Not quite sure what "my startup commented out" means.  I'll assume it
means a more or less empty ~/.emacs, or maybe the use of -Q ?
In any case I guess it means that 1.2s is the "speed of light", i.e. the
holy grail of package.el on your machine.

> When I run it with my startup intact, it yields 1.3 or 1.4
> seconds. This contrasts with my previous `emacs-init-time' which was
> 1.6 or 1.7 seconds, but as you can see, it's not a really
> big difference.

If you subtract the 1.2s taken by "other things", it means that your
config used to take 0.4-0.5s of startup time, and that the use of a big
precomputed autoloads file reduced that to 0.1-0.2s, so sped it up by
factor between 2.5 and 4, which I find a bit disappointing but still
respectable (and it depends which proportion was taken by
package-initialize vs which proportion was taken by your particular
customizations).

> It is possible that this sub-par time is due to something on my own
> system, but I'm not sure nor convinced of that. Moreover, Stefan's patch
> certainly can use some improvements and some notes on how to use his
> changes, as it is a bit vexing to figure it out by reading the diff ;)

Yes, it needs work.  It's just a quick experiment to see the
potential gains.

> I did notice a few bugs with Stefan's changes.  One bug was that
> `package-installed-p' no longer yields correct results on installed
> packages.

As it stands, my patch only pre-sets package-activated-list, whereas
package-installed-p requires other things set up by package-initialize.
If you don't set package--initialized to t, you'll see that
package-installed-p will rightfully complain that you haven't called
package-initialize.

I guess my patch could also add a setting for `package-alist` to the
package-fastpath.el, but I'm not sure I like the idea (it increases the
consequences of having an out-of-date package-fastpath.el).

> I believe that this is because `package-desc-p' is also broken
> by these changes. This broke some code in my startup which I used to
> check whether I need to install new packages.

Wouldn't it be better for your code to assume that if there's
a package-fastpath.el, then those checks have already been performed
(and to re-execute those checks in package-fastpath-refresh instead)?

Or maybe package-installed-p should be changed such that when it's
called with a symbol argument, it should first check if it's in
package-activated-list, and if it's not, then it should call
package-initialize before checking package-alist.

> Another bug was that some packages were placed in bad order in
> package-fastpath.el. In other words, if a dependency's autoloads are
> written to this file after its dependent package, the dependent package
> will err, saying that it couldn't require one of its dependencies.

Hmm... I thought this can't happen because the files are concatenated in
the same order that they are normally loaded by `package-initialize`.
I guess something doesn't work the way I thought it does.
Can you investigate to see when or even why it happens?

> As a side note and a bit of an opinion, Radon Rosborough made an
> interesting remark in one of his messages. He mentioned pip and how
> things are done in Python, which really struck me. You never really
> think about using a package in a language like Python or Ruby. You just
> `require' or `import' it and that's that. It's really simple and the
> amount of packages that you have never hurts the startup of the main
> program. I know that Emacs is a bit more complicated since it's more of
> a text editor than a language and we have somewhat more intricacies to
> worry about. But I think that this kind of a model is the kind we need
> to be headed for.

The fact that it's a text editor shouldn't make any difference in this
respect.  I'm not sure exactly what you mean by "the amount of packages
that you have never hurts the startup of the main program", I guess you
mean that program A is not slowed down when you install extra packages.

In Emacs the corresponding behavior happens if you install a package by
hand and don't activate/use it.  `package.el` by default tries to
auto-activate all your packages, so indeed it's slowed down by the mere
presence of extra packages.

I think a key element that lets Python and Ruby work that way is the
namespacing and its tight binding to the filesystem.  Currently, while
conventions are "similar" (e.g. function toto-titi is likely found in
file toto*.el in package toto), they're just vague conventions.

Making them more strict would indeed make it possible to change
`require` so that a (require 'toto-tata) will automatically look for
a file toto-tata.el in a package toto without having to "activate" that
package beforehand and it would let us have a "missing function handler"
which would automatically try to find the function toto-titi in one of
the files of the titi package (e.g. by activating this package).

This might make it possible to activate some packages lazily, but
There'd still be aspects of auto-activation that would go missing, tho:
e.g. registering jgraph-mode as a handler for *.jgr files.
So some packages would still need some form of auto-activation.

> A user should be able to have a million packages and not have to worry
> about the subsequent startup time. Heck, in my own Ruby installation I
> have 436 gems and I've never even thought about startup time till now.

The downside is that you have to explicitly `import` those gems when you
need them.  In Emacs you could do the same: call (package-initialize t)
in your ~/.emacs and then call `package-activate` when you need
a particular package.

> In any case, I think Stefan's ideas and proposed changes are a good idea
> and I am in much the same boat as John Wiegley in that I restart Emacs
> often enough that startup time gets on my nerves.

IIUC there are 1.2s of your startup time which are spent without even
running a single line of package.el code, so speeding up package.el
might not be good enough (at least it seems to me that if 1.6s is too
slow, then 1.2s is likely to also be too slow).

The usual answer in Emacs for those problem is "don't do that"
(i.e. use emacsclient instead).  I understand it's not always an option.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-30 22:33                                               ` George Plymale II
  2018-01-30 22:56                                                 ` George Plymale II
  2018-01-31  3:47                                                 ` Stefan Monnier
@ 2018-01-31  3:51                                                 ` T.V Raman
  2018-01-31  5:18                                                   ` George Plymale II
  2 siblings, 1 reply; 838+ messages in thread
From: T.V Raman @ 2018-01-31  3:51 UTC (permalink / raw)
  To: George Plymale II; +Cc: Stefan Monnier, emacs-devel

George Plymale II <georgedp@orbitalimpact.com> writes:

try let-binding file-name-handler-alist to nil -- in my case, that gave
a  significant speed-up  a few months ago > Hi all,
>
> I'm the one who posted the question on Stack Exchange, which Stefan
> mentioned the other day. My specific question is detailed here:
> https://emacs.stackexchange.com/q/38368/10761
>
> So, I've tried out Stefan's patch and it's definitely an improvement on
> startup time, but the improvement is not huge for me. Specifically, I've
> done the following in my startup files:
>
> (setq package-enable-at-startup nil)
> (load "~/.emacs.d/package-fastpath.el")
> (setq package--initialized t)
>
> I put that code in my files after running Stefan's
> `package-fastpath-refresh'. I also set `load-source-file-function' to
> nil as per Stefan's suggestion. Unfortunately, I couldn't byte-compile
> my package-fastpath.el file due to some packages which already
> byte-compile their autoload files, such as SLIME.
>
> Now, I do see some improvement in my startup time, but to reiterate, it
> is not huge. When I run Emacs with my startup commented out,
> `emacs-init-time' yields 1.2 seconds. When I run it with my startup
> intact, it yields 1.3 or 1.4 seconds. This contrasts with my previous
> `emacs-init-time' which was 1.6 or 1.7 seconds, but as you can see, it's
> not a really big difference.
>
> It is possible that this sub-par time is due to something on my own
> system, but I'm not sure nor convinced of that. Moreover, Stefan's patch
> certainly can use some improvements and some notes on how to use his
> changes, as it is a bit vexing to figure it out by reading the diff ;)
>
> I did notice a few bugs with Stefan's changes. One bug was that
> `package-installed-p' no longer yields correct results on installed
> packages. I believe that this is because `package-desc-p' is also broken
> by these changes. This broke some code in my startup which I used to
> check whether I need to install new packages.
>
> Another bug was that some packages were placed in bad order in
> package-fastpath.el. In other words, if a dependency's autoloads are
> written to this file after its dependent package, the dependent package
> will err, saying that it couldn't require one of its dependencies. There
> is obviously some work to do on making sure that dependencies are placed
> in the correct order or to change the code so that package-fastpath.el
> is order-agnostic.
>
> As a side note and a bit of an opinion, Radon Rosborough made an
> interesting remark in one of his messages. He mentioned pip and how
> things are done in Python, which really struck me. You never really
> think about using a package in a language like Python or Ruby. You just
> `require' or `import' it and that's that. It's really simple and the
> amount of packages that you have never hurts the startup of the main
> program. I know that Emacs is a bit more complicated since it's more of
> a text editor than a language and we have somewhat more intricacies to
> worry about. But I think that this kind of a model is the kind we need
> to be headed for.
>
> A user should be able to have a million packages and not have to worry
> about the subsequent startup time. Heck, in my own Ruby installation I
> have 436 gems and I've never even thought about startup time till now.
>
> In any case, I think Stefan's ideas and proposed changes are a good idea
> and I am in much the same boat as John Wiegley in that I restart Emacs
> often enough that startup time gets on my nerves. So I hope that we'll
> have some real progress on this issue and make package.el more robust.
>
> Thanks,
> - George Plymale II
>

-- 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  3:47                                                 ` Stefan Monnier
@ 2018-01-31  5:17                                                   ` George Plymale II
  2018-01-31 20:49                                                     ` George Plymale II
  2018-02-01 19:47                                                     ` Stefan Monnier
  0 siblings, 2 replies; 838+ messages in thread
From: George Plymale II @ 2018-01-31  5:17 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> I think setting package--initialized to t is wrong, here (IIRC
> package--initialized means that we've filled the tables keeping track
> of which packages are available and such).  Not a problem when you're
> just trying to test the speed of my proof-of-concept patch, of course.

Ok, thank you for letting me know the implications of doing that. I had
to do it because I got some complaints from Emacs about my packages not
being initialized. I can post the exact errors if you'd like.

> Hmm... are you saying that my code ends up fetching code for
> slime-autoloads.elc instead of slime-autoloads.el?
> Or that slime-autoloads.el contains (pre)compiled code?

It looks like your code is fetching slime-autoloads.elc:

(let ((load-file-name "/Users/my_username/.emacs.d/elpa/slime-20180126.1033/slime-autoloads.elc"))
;; ... bunches of bytecode
)

> Also, I'm not 100% surprised that byte-compiling byte-compiled code would
> fail, but I can't see any immediate reason why it should fail, so it's
> quite possible to it'd be easy to make it work.

Not sure why it would fail either, but this is the error that I see for
that specific chunk of bytecode:

package-fastpath.el:899:1:Error: Wrong type argument: sequencep, 1004

I could attach the bytecode in another message if you'd like to see it,
but I'm not sure whether you do.

> Not quite sure what "my startup commented out" means.  I'll assume it
> means a more or less empty ~/.emacs, or maybe the use of -Q ?
> In any case I guess it means that 1.2s is the "speed of light", i.e. the
> holy grail of package.el on your machine.

I mean that I commented out my ~/.emacs file, which disables all
initialization code that I run, including in other files. It does _not_
mean using -Q, which brings my startup time to 0.5 seconds (FYI, I have
recently been using the Emacs Mac Port by Yamamoto Mitsuharu so my
startup is a bit slower than vanilla GNU Emacs). That therefore means
that 1.2s is how fast Emacs is with no customizations from myself in
effect. -Q and -q have other implications, which are detailed in the
Elisp manual under "38.1.1 Summary: Sequence of Actions at Startup"

I actually just realized those 1.2 seconds include running
`package-initialize', as per usual. In other words, it was not taking
advantage of package-fastpath.el. I just ran a modified version of my
~/.emacs file which comments out almost everything except:

(load-library "package") ;; I need this else Emacs says that
                         ;; `package-activated-list' is void
(setq package-enable-at-startup nil)
(load "~/.emacs.d/package-fastpath.el")
(setq package--initialized t)

And lo and behold, `emacs-init-time' yields 0.7 seconds. Which is just
0.2 seconds higher than what I get with -Q, which I believe is Emacs'
peak startup time. I also verified that I have access to all my packages
so it is using package-fastpath.el.

So that means your patch has actually increased startup time a lot more
than I initially thought and it's actually my own initialization code
which is bogging things down.

> If you subtract the 1.2s taken by "other things", it means that your
> config used to take 0.4-0.5s of startup time, and that the use of a big
> precomputed autoloads file reduced that to 0.1-0.2s, so sped it up by
> factor between 2.5 and 4, which I find a bit disappointing but still
> respectable (and it depends which proportion was taken by
> package-initialize vs which proportion was taken by your particular
> customizations).

Well, actually those figures are better than what you're saying as per
my information above. I guess that makes your patch even more
respectable for a first stab! :)

I guess since my startup time with my initialization code is 1.3
seconds, and running Emacs with package-fastpath.el is 0.7 seconds, my
own code is taking up about 0.5 to 0.6 seconds.

> As it stands, my patch only pre-sets package-activated-list, whereas
> package-installed-p requires other things set up by package-initialize.
> If you don't set package--initialized to t, you'll see that
> package-installed-p will rightfully complain that you haven't called
> package-initialize.

Ok, thank you for clarifying that issue. Although, as I mentioned above,
I had to set package--initialized to t, otherwise Emacs would halt
startup and complain about me not calling `package-initialize'.

> I guess my patch could also add a setting for `package-alist` to the
> package-fastpath.el, but I'm not sure I like the idea (it increases the
> consequences of having an out-of-date package-fastpath.el).

I'm not sure on that either. Although, we could make it so that
`package-fastpath-refresh' is run more often or in more places so as to
lessen that risk.

> Wouldn't it be better for your code to assume that if there's
> a package-fastpath.el, then those checks have already been performed
> (and to re-execute those checks in package-fastpath-refresh instead)?

Yes, it would likely be better for my code to do that instead.

> Or maybe package-installed-p should be changed such that when it's
> called with a symbol argument, it should first check if it's in
> package-activated-list, and if it's not, then it should call
> package-initialize before checking package-alist.

I can't give a strong opinion on that. Perhaps someone else who is
better-versed on package.el could shed some light here?

> Hmm... I thought this can't happen because the files are concatenated in
> the same order that they are normally loaded by `package-initialize`.
> I guess something doesn't work the way I thought it does.
> Can you investigate to see when or even why it happens?

It specifically happened with gh.el (https://github.com/sigma/gh.el),
which is dependent on marshal.el (https://github.com/sigma/marshal.el)

Apparently gh-autoloads.el uses a `gh-defclass' macro, which in turn
uses a `marshal-defclass' macro. There is definitely some strangeness
that could be going on here.

> The fact that it's a text editor shouldn't make any difference in this
> respect.  I'm not sure exactly what you mean by "the amount of packages
> that you have never hurts the startup of the main program", I guess you
> mean that program A is not slowed down when you install extra packages.

Yes, I mean that program A is not slowed down by extra packages.

> In Emacs the corresponding behavior happens if you install a package by
> hand and don't activate/use it.  `package.el` by default tries to
> auto-activate all your packages, so indeed it's slowed down by the mere
> presence of extra packages.

Right.

> I think a key element that lets Python and Ruby work that way is the
> namespacing and its tight binding to the filesystem.  Currently, while
> conventions are "similar" (e.g. function toto-titi is likely found in
> file toto*.el in package toto), they're just vague conventions.

Yes, Ruby and Python have a simpler "path" system for finding packages
than Emacs does currently.

> Making them more strict would indeed make it possible to change
> `require` so that a (require 'toto-tata) will automatically look for
> a file toto-tata.el in a package toto without having to "activate" that
> package beforehand and it would let us have a "missing function handler"
> which would automatically try to find the function toto-titi in one of
> the files of the titi package (e.g. by activating this package).

> This might make it possible to activate some packages lazily, but
> There'd still be aspects of auto-activation that would go missing, tho:
> e.g. registering jgraph-mode as a handler for *.jgr files.
> So some packages would still need some form of auto-activation.

Right, your last point is what I meant by "we have somewhat more
intricacies to worry about."

> The downside is that you have to explicitly `import` those gems when you
> need them.  In Emacs you could do the same: call (package-initialize t)
> in your ~/.emacs and then call `package-activate` when you need
> a particular package.

Yes, this is true. Still, I think we need some more simplicity in this
system of autoloads and so forth.

> IIUC there are 1.2s of your startup time which are spent without even
> running a single line of package.el code, so speeding up package.el
> might not be good enough (at least it seems to me that if 1.6s is too
> slow, then 1.2s is likely to also be too slow).

Well, those 1.2 seconds which I mentioned are just starting up Emacs
without any _initialization_ code. And that also means that
`package-initialize' is running and not taking advantage of
package-fastpath.el. Again, as I mentioned above, the startup time which
takes advantage of package-fastpath.el is ~0.7 seconds so we have
already sped up package.el by a lot and with noticeable effect.

> The usual answer in Emacs for those problem is "don't do that"
> (i.e. use emacsclient instead).  I understand it's not always an
> option.

Yes, I actually am an avid user of the Emacs client and server. I think
it's a great feature which helps me do a lot of useful
things. Unfortunately, it is not the panacea for startup time woes that
it is often touted as. I know it is that way for a lot of people, but I
unfortunately push Emacs too hard most of the time to be able to leave
it running for weeks or months. If that were the case, I wouldn't have
this itch to scratch.

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  3:51                                                 ` T.V Raman
@ 2018-01-31  5:18                                                   ` George Plymale II
  2018-01-31  6:56                                                     ` Tim Cross
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-01-31  5:18 UTC (permalink / raw)
  To: T.V Raman; +Cc: monnier, emacs-devel

> try let-binding file-name-handler-alist to nil -- in my case, that gave
> a  significant speed-up  a few months ago

I have done that. It did help my startup time as well, but I still have
the issues which I've described.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  5:18                                                   ` George Plymale II
@ 2018-01-31  6:56                                                     ` Tim Cross
  2018-01-31  7:07                                                       ` George Plymale II
  2018-01-31  8:05                                                       ` John Wiegley
  0 siblings, 2 replies; 838+ messages in thread
From: Tim Cross @ 2018-01-31  6:56 UTC (permalink / raw)
  To: George Plymale II; +Cc: Emacs developers, Stefan Monnier, T.V Raman

[-- Attachment #1: Type: text/plain, Size: 530 bytes --]

Can I ask what would be considered an acceptable startup time? Times under
2 seconds seem pretty good to me. I'm just curious to know what the general
expectation is?

Tim



On 31 January 2018 at 16:18, George Plymale II <georgedp@orbitalimpact.com>
wrote:

> > try let-binding file-name-handler-alist to nil -- in my case, that gave
> > a  significant speed-up  a few months ago
>
> I have done that. It did help my startup time as well, but I still have
> the issues which I've described.
>
>


-- 
regards,

Tim

--
Tim Cross

[-- Attachment #2: Type: text/html, Size: 1140 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  6:56                                                     ` Tim Cross
@ 2018-01-31  7:07                                                       ` George Plymale II
  2018-01-31  8:05                                                       ` John Wiegley
  1 sibling, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-01-31  7:07 UTC (permalink / raw)
  To: Tim Cross; +Cc: emacs-devel, monnier, raman

> Can I ask what would be considered an acceptable startup time? Times
> under 2 seconds seem pretty good to me. I'm just curious to know what
> the general expectation is?

I'm hoping to get my startup time at least under 1 second, say 0.7 or
0.8 seconds. I used to have it under half a second, but that doesn't
seem possible on the Emacs Mac Port given that `emacs -Q' is already 0.5
seconds. Of course, I would be most happy if I could somehow make that
happen.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  6:56                                                     ` Tim Cross
  2018-01-31  7:07                                                       ` George Plymale II
@ 2018-01-31  8:05                                                       ` John Wiegley
  2018-02-01  7:26                                                         ` Tim Cross
  1 sibling, 1 reply; 838+ messages in thread
From: John Wiegley @ 2018-01-31  8:05 UTC (permalink / raw)
  To: Tim Cross; +Cc: T.V Raman, George Plymale II, Stefan Monnier, Emacs developers

>>>>> "TC" == Tim Cross <theophilusx@gmail.com> writes:

TC> Can I ask what would be considered an acceptable startup time? Times under
TC> 2 seconds seem pretty good to me. I'm just curious to know what the
TC> general expectation is?

My ideal is .25 (I've gotten it as low as 0.14 on GNU/Linux).  I don't
complain if it's below 2.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  5:17                                                   ` George Plymale II
@ 2018-01-31 20:49                                                     ` George Plymale II
  2018-01-31 21:35                                                       ` Stefan Monnier
  2018-02-01 19:47                                                     ` Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-01-31 20:49 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

Stefan,

As an addition to my last message, I noticed another bug with your patch
that I did not notice yesterday. The info files for my packages from
ELPA are all missing in the info Directory node. When I use
`(package-initialize)' rather than package-fastpath.el, those info nodes
are all there. `(package-initialize t)' also did not bring those info
nodes back. Evidently it is the package activation which is significant
here. There is clearly a lot of work done regarding package activation
from `package-initialize' which we need to incorporate.

I would like to contribute some fixes to your code, but I am a bit
hesitant because of copyright. If I send improvements of your patch,
will it be able to get back into package.el? Because I will not sign any
papers which give my rights to the FSF nor will I license any code that
I write under the GPL. I am fine with licensing any code that I write
under a permissive or free license such as New BSD, MIT, or public
domain, but I will not put it under the GPL. I hate to bring up such a
sticky topic, but I would rather get it out of the way now, before I
write a bunch of code which could ultimately be useless because of
copyright disagreements.

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31 20:49                                                     ` George Plymale II
@ 2018-01-31 21:35                                                       ` Stefan Monnier
  2018-01-31 21:58                                                         ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-01-31 21:35 UTC (permalink / raw)
  To: George Plymale II; +Cc: emacs-devel

> I would like to contribute some fixes to your code, but I am a bit
> hesitant because of copyright. If I send improvements of your patch,
> will it be able to get back into package.el? Because I will not sign any
> papers which give my rights to the FSF nor will I license any code that
> I write under the GPL.

Unless your code is sufficiently trivial, we require a copyright
assignment to incorporate your code into Emacs.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31 21:35                                                       ` Stefan Monnier
@ 2018-01-31 21:58                                                         ` George Plymale II
  2018-01-31 22:06                                                           ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-01-31 21:58 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> Unless your code is sufficiently trivial, we require a copyright
> assignment to incorporate your code into Emacs.

Right, that's what I was afraid of. Unfortunately, my improvements to
your code would quite likely be greater than 15 lines so I doubt I'll be
able to help you aside from giving ideas and feedback.

It's a real shame that the FSF has put this policy in place, but I'll
stop myself there before this becomes a rant.

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31 21:58                                                         ` George Plymale II
@ 2018-01-31 22:06                                                           ` George Plymale II
  2018-02-01 14:48                                                             ` Stefan Monnier
  2018-02-01 19:24                                                             ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: George Plymale II @ 2018-01-31 22:06 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

Also, I am legally under-age to sign any such copyright waivers. So I
couldn't do it even if I wanted to. Another reason that this is a
fruitless policy.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-30 15:44                         ` Eli Zaretskii
@ 2018-02-01  3:12                           ` Mark Oteiza
  2018-02-01  4:22                             ` Radon Rosborough
  2018-02-08  5:54                           ` Radon Rosborough
  1 sibling, 1 reply; 838+ messages in thread
From: Mark Oteiza @ 2018-02-01  3:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Stefan Monnier <monnier@iro.umontreal.ca>
>> Date: Tue, 30 Jan 2018 10:02:53 -0500
>> 
>> > I've fixed all the problems noted by Stefan and Clément, and rebased
>> > onto the latest master. The revised patch is attached.
>> 
>> LGTM
>> Do you have write access or do you need someone to push this for you?
>> Eli&John, any objection to installing this into master?
>
> I didn't yet have time to read the patch, will do in the following
> days, and get back.  I don't expect to object, but I might have some
> comments.

ISTR there being no answer to the question posed here
https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00994.html
except for a workaround suggested by Stefan to set package-user-dir,
which implies that we have to run package-initialize twice.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-01  3:12                           ` Mark Oteiza
@ 2018-02-01  4:22                             ` Radon Rosborough
  2018-02-01 13:36                               ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2018-02-01  4:22 UTC (permalink / raw)
  To: Mark Oteiza; +Cc: Eli Zaretskii, Stefan Monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 920 bytes --]

> ISTR there being no answer to the question posed here
> https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00994.html
> except for a workaround suggested by Stefan to set package-user-dir,
> which implies that we have to run package-initialize twice.

Sorry, could you elaborate on what the problem is? As it is I don't see any
problem: most configurations will work with no changes, and advanced
configurations will require only trivial changes (namely moving a few 'setq'
forms from init.el into early-init.el). People whose configurations are
advanced enough to set `package-load-list' and `package-user-dir' will find
this change trivial to make.

There's certainly no running of `package-initialize' twice in the proposed
patch. `package-initialize' is run between early-init.el and init.el, just
once.
(But this can be suppressed by setting `package-enable-at-startup' to nil in
early-init.el.)

-- Radon

[-- Attachment #2: Type: text/html, Size: 2024 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  8:05                                                       ` John Wiegley
@ 2018-02-01  7:26                                                         ` Tim Cross
  2018-02-01 15:00                                                           ` Stefan Monnier
  2018-02-01 16:23                                                           ` T.V Raman
  0 siblings, 2 replies; 838+ messages in thread
From: Tim Cross @ 2018-02-01  7:26 UTC (permalink / raw)
  To: Tim Cross, George Plymale II, Emacs developers, Stefan Monnier,
	T.V Raman

[-- Attachment #1: Type: text/plain, Size: 1279 bytes --]

I dunno, perhaps I'm just slow, but I know my emacs startup is certainly
more than 2 seconds and the time has never bothered me. As I rarely hack on
elisp these days, I don't find it necessary to restart very often and I've
got everything integrated using emacsclient, so once I'm running, I forget
about startup time. However, I will put some timing code in just to see
(out of interest) what my startup is like.

For me, I'm more frustrated by modes like helm, which seem to offer
benefits, but I find such add-ons tend to slow down my use of emacs, which
I find more frustrating than startup times.

The slowest component in my setup is definitely me though!

Tim


On 31 January 2018 at 19:05, John Wiegley <johnw@gnu.org> wrote:

> >>>>> "TC" == Tim Cross <theophilusx@gmail.com> writes:
>
> TC> Can I ask what would be considered an acceptable startup time? Times
> under
> TC> 2 seconds seem pretty good to me. I'm just curious to know what the
> TC> general expectation is?
>
> My ideal is .25 (I've gotten it as low as 0.14 on GNU/Linux).  I don't
> complain if it's below 2.
>
> --
> John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
> http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2
>



-- 
regards,

Tim

--
Tim Cross

[-- Attachment #2: Type: text/html, Size: 2150 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-01  4:22                             ` Radon Rosborough
@ 2018-02-01 13:36                               ` Stefan Monnier
  2018-02-18  5:40                                 ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-02-01 13:36 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: Mark Oteiza, Eli Zaretskii, emacs-devel

> forms from init.el into early-init.el).  People whose configurations are
> advanced enough to set `package-load-list' and `package-user-dir' will find
> this change trivial to make.

FWIW, I do set package-user-dir in my config, and I resolve the problem
by moving my whole config from .emacs.d/init.el to
.emacs.d/early-init.el.

This comes with a few constraints, but these already existed for users
of --daemon.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31 22:06                                                           ` George Plymale II
@ 2018-02-01 14:48                                                             ` Stefan Monnier
  2018-02-01 17:47                                                               ` George Plymale II
  2018-02-02  2:13                                                               ` Loading a package applies automatically to future sessions? Richard Stallman
  2018-02-01 19:24                                                             ` Richard Stallman
  1 sibling, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-01 14:48 UTC (permalink / raw)
  To: George Plymale II; +Cc: emacs-devel

> Also, I am legally under-age to sign any such copyright waivers.

Since it's the second time this issue shows up, I finally asked the
copyright clerk at the FSF and he says that it works as follows:

    If the person is under 18 years old their parent needs to also sign
    the contract.  The biggest sticking point is that the assignment is
    only valid up until that person's 18th birthday.

> So I couldn't do it even if I wanted to.

Apparently you could, but it's kind of a pain, indeed.

> Another reason that this is a fruitless policy.

I also find it fruitless/useless/annoying, but for having tried to fight
it, I know that it's just as fruitless trying to change Richard's mind
about it.

And I find it very hard to imagine how signing such paperwork for one's
Emacs code could harm one, so I sometimes get stuck this way between
Richard who stubbornly wants copyright paperwork and the contributor who
stubbornly refuses to sign it.

Both positions are only "a matter of principle" and are fruitless.

Anyway, happy hacking to you,


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01  7:26                                                         ` Tim Cross
@ 2018-02-01 15:00                                                           ` Stefan Monnier
  2018-02-01 16:23                                                           ` T.V Raman
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-01 15:00 UTC (permalink / raw)
  To: emacs-devel

> I dunno, perhaps I'm just slow, but I know my emacs startup is certainly
> more than 2 seconds and the time has never bothered me.

It very much depends on your usage pattern.  My Emacs's startup time
doesn't bother me either, but I understand that it can be annoying for
other users.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01  7:26                                                         ` Tim Cross
  2018-02-01 15:00                                                           ` Stefan Monnier
@ 2018-02-01 16:23                                                           ` T.V Raman
  2018-02-03  0:39                                                             ` Tim Cross
  1 sibling, 1 reply; 838+ messages in thread
From: T.V Raman @ 2018-02-01 16:23 UTC (permalink / raw)
  To: Tim Cross; +Cc: George Plymale II, Stefan Monnier, Emacs developers

M-x emacs-init-time will show your startup time.

You can find some code for more fine-grained instrumentation in
tvr/emacs-startup.el in the emacspeak Github repo.
-- 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 14:48                                                             ` Stefan Monnier
@ 2018-02-01 17:47                                                               ` George Plymale II
  2018-02-01 19:11                                                                 ` Stefan Monnier
  2018-02-01 19:19                                                                 ` Stephen Berman
  2018-02-02  2:13                                                               ` Loading a package applies automatically to future sessions? Richard Stallman
  1 sibling, 2 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-01 17:47 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> > Also, I am legally under-age to sign any such copyright waivers.

> Since it's the second time this issue shows up, I finally asked the
> copyright clerk at the FSF and he says that it works as follows:

>     If the person is under 18 years old their parent needs to also sign
>     the contract.  The biggest sticking point is that the assignment is
>     only valid up until that person's 18th birthday.

> > So I couldn't do it even if I wanted to.

> Apparently you could, but it's kind of a pain, indeed.

Yes, that is certainly a pain to say the least. In some cases it makes
contribution an impossibility.

> I also find it fruitless/useless/annoying, but for having tried to fight
> it, I know that it's just as fruitless trying to change Richard's mind
> about it.

> And I find it very hard to imagine how signing such paperwork for one's
> Emacs code could harm one, so I sometimes get stuck this way between
> Richard who stubbornly wants copyright paperwork and the contributor who
> stubbornly refuses to sign it.

> Both positions are only "a matter of principle" and are fruitless.

I sympathize with your difficulties in this regard. Honestly, I wouldn't
have much of a problem contributing code which would be licensed under
the GPL if the paperwork were not involved. I still think the GPL is
too problematic and restrictive, but to each his own.

This paperwork is really just over-the-top and it's not right to force
someone to give you the rights to their code while in the same breath
talking about freedom. This kind of stuff doesn't encourage any openness
or "hacker culture." It just makes people shy away from the project. I
guess all of that is a matter of principle on my part, but aside from
that I also do not want to encourage the FSF's continuation of this
policy by signing the papers (which I still cannot anyway).

Anyhow, happy hacking to you as well.

I'd rather get back on the topic of your patch now that we've gotten
this issue out of the way. Do you need any more feedback or assistance
in solving the bugs that I mentioned?

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 17:47                                                               ` George Plymale II
@ 2018-02-01 19:11                                                                 ` Stefan Monnier
  2018-02-01 19:19                                                                 ` Stephen Berman
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-01 19:11 UTC (permalink / raw)
  To: George Plymale II; +Cc: emacs-devel

> I'd rather get back on the topic of your patch now that we've gotten
> this issue out of the way. Do you need any more feedback or assistance
> in solving the bugs that I mentioned?

Yes (but I haven't gotten to it yet, sorry),


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 17:47                                                               ` George Plymale II
  2018-02-01 19:11                                                                 ` Stefan Monnier
@ 2018-02-01 19:19                                                                 ` Stephen Berman
  2018-02-01 19:28                                                                   ` Stephen Berman
                                                                                     ` (2 more replies)
  1 sibling, 3 replies; 838+ messages in thread
From: Stephen Berman @ 2018-02-01 19:19 UTC (permalink / raw)
  To: George Plymale II; +Cc: Stefan Monnier, emacs-devel

On Thu, 01 Feb 2018 12:47:23 -0500 George Plymale II <georgedp@orbitalimpact.com> wrote:

> This paperwork is really just over-the-top and it's not right to force
> someone to give you the rights to their code while in the same breath
> talking about freedom. 

Assigning copyright to the FSF does not prevent the assignee from doing
anything with their code (except claiming copyright ownership of it), see
<https://www.fsf.org/bulletin/2014/spring/copyright-assignment-at-the-fsf>. in
particular:

   Sometimes contributors are concerned about giving up rights to their
   work. As the assignment is a gift to the free software community, they
   don't want it to come at the expense of having flexibility in the use of
   their own code. Thus, we grant back to contributors a license to use
   their work as they see fit. This means they are free to modify, share,
   and sublicense their own work under terms of their choice. This enables
   contributors to redistribute their work under another free software
   license. While this technically also permits distributing their work
   under a proprietary license, we hope they won't.

>                        This kind of stuff doesn't encourage any openness
> or "hacker culture." It just makes people shy away from the project. I
> guess all of that is a matter of principle on my part, but aside from
> that I also do not want to encourage the FSF's continuation of this
> policy by signing the papers (which I still cannot anyway).

Are you sure you understand the FSF policy?

Steve Berman



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31 22:06                                                           ` George Plymale II
  2018-02-01 14:48                                                             ` Stefan Monnier
@ 2018-02-01 19:24                                                             ` Richard Stallman
  2018-02-01 21:36                                                               ` George Plymale II
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-01 19:24 UTC (permalink / raw)
  To: George Plymale II; +Cc: emacs-devel, georgedp, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Also, I am legally under-age to sign any such copyright waivers. So I
  > couldn't do it even if I wanted to.  Another reason that this is a
  > fruitless policy.

This policy gives us (1) confidence we have the right to put the code
into Emacs, and (2) a firm basis for enforcing the GPL.
It is sometimes inconvenient, but it is hardly fruitless.
On the contrary, it is very important.

If you are too young to sign, you could ask your parents to sign on
your behalf.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 19:19                                                                 ` Stephen Berman
@ 2018-02-01 19:28                                                                   ` Stephen Berman
  2018-02-01 21:44                                                                   ` George Plymale II
  2018-02-02  2:12                                                                   ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Stephen Berman @ 2018-02-01 19:28 UTC (permalink / raw)
  To: George Plymale II; +Cc: Stefan Monnier, emacs-devel

On Thu, 01 Feb 2018 20:19:01 +0100 Stephen Berman <stephen.berman@gmx.net> wrote:

> On Thu, 01 Feb 2018 12:47:23 -0500 George Plymale II
> <georgedp@orbitalimpact.com> wrote:
>
>> This paperwork is really just over-the-top and it's not right to force
>> someone to give you the rights to their code while in the same breath
>> talking about freedom. 
>
> Assigning copyright to the FSF does not prevent the assignee from doing
                                                oops: assigner
> anything with their code (except claiming copyright ownership of it), see

Steve Berman



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-31  5:17                                                   ` George Plymale II
  2018-01-31 20:49                                                     ` George Plymale II
@ 2018-02-01 19:47                                                     ` Stefan Monnier
  2018-02-01 22:10                                                       ` George Plymale II
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-02-01 19:47 UTC (permalink / raw)
  To: George Plymale II; +Cc: emacs-devel

> It looks like your code is fetching slime-autoloads.elc:
> (let ((load-file-name "/Users/my_username/.emacs.d/elpa/slime-20180126.1033/slime-autoloads.elc"))
> ;; ... bunches of bytecode
> )

Hmm... good catch.  I just added a corresponding FIXME in the code
(hopefully M-x dwim will figure out how to fix it).

>> Also, I'm not 100% surprised that byte-compiling byte-compiled code would
>> fail, but I can't see any immediate reason why it should fail, so it's
>> quite possible to it'd be easy to make it work.
> Not sure why it would fail either, but this is the error that I see for
> that specific chunk of bytecode:
> package-fastpath.el:899:1:Error: Wrong type argument: sequencep, 1004

I'll see if I can reproduce it (it's probably better to try and use the
.el file instead, tho).

> And lo and behold, `emacs-init-time' yields 0.7 seconds. Which is just
> 0.2 seconds higher than what I get with -Q, which I believe is Emacs'
> peak startup time. I also verified that I have access to all my packages
> so it is using package-fastpath.el.

Good, thanks.  Now the numbers correspond better to my expectations.

> So that means your patch has actually increased startup time a lot more
                                        ^^^^^^^^^
                                        improved

> Well, actually those figures are better than what you're saying as per
> my information above. I guess that makes your patch even more
> respectable for a first stab! :)

FWIW "a first stab" often ends up being faster than the end product,
because the first stab was too optimistic.

>> Hmm... I thought this can't happen because the files are concatenated in
>> the same order that they are normally loaded by `package-initialize`.
>> I guess something doesn't work the way I thought it does.
>> Can you investigate to see when or even why it happens?
> It specifically happened with gh.el (https://github.com/sigma/gh.el),
> which is dependent on marshal.el (https://github.com/sigma/marshal.el)
>
> Apparently gh-autoloads.el uses a `gh-defclass' macro, which in turn
> uses a `marshal-defclass' macro. There is definitely some strangeness
> that could be going on here.

Could you try and give some more details about this problem?
E.g. check the fastpath file to see in which order the two packages's
autoloads are placed.  If gh-autoloads.el comes before
marshal-autoloads.el, could you try and figure out why (e.g. maybe
starting with `M-x trace-function RET package-activate RET`
and `M-x trace-function RET package-activate-1 RET`)?


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 19:24                                                             ` Richard Stallman
@ 2018-02-01 21:36                                                               ` George Plymale II
  2018-02-02  2:08                                                                 ` Tim Landscheidt
                                                                                   ` (5 more replies)
  0 siblings, 6 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-01 21:36 UTC (permalink / raw)
  To: rms; +Cc: monnier, emacs-devel

> This policy gives us (1) confidence we have the right to put the code
> into Emacs,

Is not a statement of my permission in an email enough? If an issue came
up in a court of law, couldn't you just subpoena the email message where
I (or whoever else) granted you permission to have my code? At least,
that would take away the hassle factor of paperwork.

Heck, in your FAQ about the GPL, you say:

"We [keep the copyright status of the program as simple as possible] by
asking each contributor to either assign the copyright on contributions
to the FSF, or disclaim copyright on contributions."

https://www.gnu.org/licenses/gpl-faq.en.html#AssignCopyright

As I told Stefan in my initial message about this, I would be fine with
releasing my contributions into the public domain. I think that makes a
lot of sense; I'm giving the code away so anyone can use it however they
like.

Of course, all of this would probably not be necessary were it not for
the controversial nature of the GPL which leads to lawsuits a lot more
than other open-source licenses.

> (2) a firm basis for enforcing the GPL.
> It is sometimes inconvenient, but it is hardly fruitless.
> On the contrary, it is very important.

All that you can do to enforce the GPL is sue people. Isn't there enough
litigiousness in the world today? Moreover, there is no other fruit
borne by these restrictions than that won in a court battle. You
certainly aren't recruiting more developers in any projects which are
subject to this policy. That is worrisome when you have core developers,
such as Eli, saying that the Emacs core is falling by the wayside
because there are too few newcomers who will delve into the guts of the
project. And there are few newcomers at all.

> If you are too young to sign, you could ask your parents to sign on
> your behalf.

What if they can't? What if I don't have parents? What if I live in
foster homes and my legal guardian is frequently changed? I don't see
how a policy which prevents such people from contributing to the project
is very helpful.

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 19:19                                                                 ` Stephen Berman
  2018-02-01 19:28                                                                   ` Stephen Berman
@ 2018-02-01 21:44                                                                   ` George Plymale II
  2018-02-01 22:16                                                                     ` Stephen Berman
                                                                                       ` (2 more replies)
  2018-02-02  2:12                                                                   ` Richard Stallman
  2 siblings, 3 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-01 21:44 UTC (permalink / raw)
  To: Stephen Berman; +Cc: monnier, emacs-devel


>    [...] Thus, we grant back to contributors a license to use
>    their work as they see fit. This means they are free to modify, share,
>    and sublicense their own work under terms of their choice. This enables
>    contributors to redistribute their work under another free software
>    license. While this technically also permits distributing their work
>    under a proprietary license, we hope they won't.
   
That sounds interesting, but I would like to know more of the specifics
about that. Is there a place where I can find very detailed information
about this specific "license" which is "granted back to contributors?"

> Are you sure you understand the FSF policy?

I'm not sure what you're implying.

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 19:47                                                     ` Stefan Monnier
@ 2018-02-01 22:10                                                       ` George Plymale II
  2018-02-01 22:44                                                         ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-01 22:10 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> Hmm... good catch.  I just added a corresponding FIXME in the code
> (hopefully M-x dwim will figure out how to fix it).

Sounds good.

> I'll see if I can reproduce it (it's probably better to try and use the
> .el file instead, tho).

Ok, let me know if you need help from my end.

> FWIW "a first stab" often ends up being faster than the end product,
> because the first stab was too optimistic.

Hopefully it won't come to that ;)

> Could you try and give some more details about this problem?
> E.g. check the fastpath file to see in which order the two packages's
> autoloads are placed.  If gh-autoloads.el comes before
> marshal-autoloads.el, could you try and figure out why (e.g. maybe
> starting with `M-x trace-function RET package-activate RET`
> and `M-x trace-function RET package-activate-1 RET`)?

gh-autoloads.el does indeed come before marshal-autoloads.el (although I
currently have them switched around to prevent init errors).

I did those `trace-function' invocations that you suggested, but I can't
quite make heads or tails out of them so I will just send you the
*trace-output* dumps to look at it yourself. I will send said dumps in a
private email since I don't want to post all of my installed packages
publicly.

Thanks,

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:44                                                                   ` George Plymale II
@ 2018-02-01 22:16                                                                     ` Stephen Berman
  2018-02-01 23:02                                                                       ` George Plymale II
  2018-02-02 22:53                                                                       ` Richard Stallman
  2018-02-02  2:14                                                                     ` Loading a package applies automatically to future sessions? Richard Stallman
  2018-02-02  8:39                                                                     ` Eli Zaretskii
  2 siblings, 2 replies; 838+ messages in thread
From: Stephen Berman @ 2018-02-01 22:16 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

On Thu, 01 Feb 2018 16:44:04 -0500 George Plymale II <georgedp@orbitalimpact.com> wrote:

>>    [...] Thus, we grant back to contributors a license to use
>>    their work as they see fit. This means they are free to modify, share,
>>    and sublicense their own work under terms of their choice. This enables
>>    contributors to redistribute their work under another free software
>>    license. While this technically also permits distributing their work
>>    under a proprietary license, we hope they won't.
>    
> That sounds interesting, but I would like to know more of the specifics
> about that. Is there a place where I can find very detailed information
> about this specific "license" which is "granted back to contributors?"

I don't know of an online resource with such details, but maybe it's
somewhere in the FSF website.  There is a statement to that effect in
the assignment agreement itself, at least in the paper version I
received when I made my assignment many years ago:

   FSF agrees to grant back to Developer, and does hereby grant,
   non-exclusive, royalty-free and non-cancellable rights to use the Works
   (i.e., Developer's changes and/or enhancements, not the Program that
   they enhance), as Developer sees fit [...]

>> Are you sure you understand the FSF policy?
>
> I'm not sure what you're implying.

Your wording ("it's not right to force someone to give you the rights to
their code while in the same breath talking about freedom", "This kind
of stuff doesn't encourage any openness or 'hacker culture.'") suggests
a different understanding of the FSF policy than what the FSF itself
expounds, as exemplified by the passage I quoted above.

Steve Berman



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 22:10                                                       ` George Plymale II
@ 2018-02-01 22:44                                                         ` George Plymale II
  2018-02-02  1:54                                                           ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-01 22:44 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

One more thing regarding my bug about info nodes from ELPA,

I noticed that all my info nodes were back after upgrading my packages
in `package-list-packages'. Do you have any idea about why that is,
Stefan?

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 22:16                                                                     ` Stephen Berman
@ 2018-02-01 23:02                                                                       ` George Plymale II
  2018-02-02  8:43                                                                         ` Eli Zaretskii
                                                                                           ` (3 more replies)
  2018-02-02 22:53                                                                       ` Richard Stallman
  1 sibling, 4 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-01 23:02 UTC (permalink / raw)
  To: Stephen Berman; +Cc: monnier, emacs-devel

> I don't know of an online resource with such details, but maybe it's
> somewhere in the FSF website.  There is a statement to that effect in
> the assignment agreement itself, at least in the paper version I
> received when I made my assignment many years ago:

>    FSF agrees to grant back to Developer, and does hereby grant,
>    non-exclusive, royalty-free and non-cancellable rights to use the Works
>    (i.e., Developer's changes and/or enhancements, not the Program that
>    they enhance), as Developer sees fit [...]

Huh, well I wasn't aware of that and it sounds fine to me. Are you sure
that there's no strings attached?

> Your wording ("it's not right to force someone to give you the rights to
> their code while in the same breath talking about freedom", "This kind
> of stuff doesn't encourage any openness or 'hacker culture.'") suggests
> a different understanding of the FSF policy than what the FSF itself
> expounds, as exemplified by the passage I quoted above.

Well, my understanding of the policy was that one's _contributions_ are
owned by the FSF. I.e., that you have to sign waivers which tell the
FSF, "Hey, I give up all rights to own any code that I give you guys in
these certain projects." To me, that seems hypocritical and it seemed
that indeed the actual FSF policy versus what the FSF itself expounds
were in disagreement. But, maybe I'm incorrect about that if that above
passage is really what it sounds like.

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 22:44                                                         ` George Plymale II
@ 2018-02-02  1:54                                                           ` Stefan Monnier
  2018-02-02 20:32                                                             ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-02-02  1:54 UTC (permalink / raw)
  To: emacs-devel

> One more thing regarding my bug about info nodes from ELPA,

Oh, I didn't respond to that part, but this is a "known issue" (the
patch I sent doesn't bother to keep track and reproduce changes to
Info-directory-list).

> I noticed that all my info nodes were back after upgrading my packages
> in `package-list-packages'.  Do you have any idea about why that is,
> Stefan?

Hmm... no I can't explain how/why the problem disappeared when you did that.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:36                                                               ` George Plymale II
@ 2018-02-02  2:08                                                                 ` Tim Landscheidt
  2018-02-02 22:53                                                                   ` Richard Stallman
  2018-02-02  2:17                                                                 ` Richard Stallman
                                                                                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 838+ messages in thread
From: Tim Landscheidt @ 2018-02-02  2:08 UTC (permalink / raw)
  To: emacs-devel

George Plymale II <georgedp@orbitalimpact.com> wrote:

> […]

>> If you are too young to sign, you could ask your parents to sign on
>> your behalf.

> What if they can't? What if I don't have parents? What if I live in
> foster homes and my legal guardian is frequently changed? I don't see
> how a policy which prevents such people from contributing to the project
> is very helpful.

I doubt that under those conditions someone could legally
release one's code under any licence or into the public do-
main; i. e. "a policy" means "every policy" in that context.

Tim




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 19:19                                                                 ` Stephen Berman
  2018-02-01 19:28                                                                   ` Stephen Berman
  2018-02-01 21:44                                                                   ` George Plymale II
@ 2018-02-02  2:12                                                                   ` Richard Stallman
  2018-02-02  6:15                                                                     ` George Plymale II
  2 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02  2:12 UTC (permalink / raw)
  To: georgedp; +Cc: Stephen Berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

>    This kind of stuff doesn't encourage any openness

Our goal is freedom for all users of software -- much more than
"openness".

We release programs under a copyleft license such as the GNU GPL in
order to defend freedom for all users.  We ask for copyright
assignments so we can enforce the GPL better in court.  It's all part
of a careful plan for achieving freedom.

See https://gnu.org/licenses/copyleft.html for more explanation,
and https://gnu.org/licenses/why-assign.html.

Our goal is not "openness" -- we don't use that word.  We campaign for
users' freedom, specifically to control the software they use.

See https://gnu.org/philosophy/open-source-misses-the-point.html
for more explanation of the difference between free software and open
source.  See also https://thebaffler.com/salvos/the-meme-hustler for
Evgeny Morozov's article on the same point.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 14:48                                                             ` Stefan Monnier
  2018-02-01 17:47                                                               ` George Plymale II
@ 2018-02-02  2:13                                                               ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-02  2:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: georgedp, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I also find it fruitless/useless/annoying,

When you say it is "annoying", that describes your feelings.  I can't
argue with your feelings, but to get annoyed by a little work that
one needs to do at most twice in a lifetime seems to me excessive.

On the other hand, saying it is "fruitless" and "useless" is simply
incorrect.  It helps us enforce the GNU GPL.

  > Both positions are only "a matter of principle"

Our policy of requiring copyright assignments is entirely a practical
matter -- to help us enforce the GPL.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-29  5:56                                   ` Radon Rosborough
@ 2018-02-02  2:14                                     ` Richard Stallman
  2018-02-02  3:05                                       ` Clément Pit-Claudel
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02  2:14 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I think things already work the way users expect. Let's look at
  > Python. When you install a package using 'pip', the package files are
  > placed on Python's search path. Thereafter, 'import <package>' works
  > without any further "activation" step. The package is automatically
  > made available in future sessions, although it is not loaded until
  > requested.

In Python, once a package is on the search path, the user needs to
give a specific command to make it callable from a given module.

I think Emacs should work the same way.

If I understood correctly, it is currently NOT the same, because in
Emacs the package doesn't require any command to make the package
callable.  Simply getting it from ELPA makes it callable _all the time_.

The change I have asked for would make Emacs do like Python.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:44                                                                   ` George Plymale II
  2018-02-01 22:16                                                                     ` Stephen Berman
@ 2018-02-02  2:14                                                                     ` Richard Stallman
  2018-02-02  7:25                                                                       ` George Plymale II
  2018-02-02  9:39                                                                       ` Eli Zaretskii
  2018-02-02  8:39                                                                     ` Eli Zaretskii
  2 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-02  2:14 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > That sounds interesting, but I would like to know more of the specifics
  > about that. Is there a place where I can find very detailed information
  > about this specific "license" which is "granted back to contributors?"

It is an unlimited nonexclusive license; it says you can use your own
code/text "as you see fit".  It may say you need to inform us the
first time you want to do this, and then you get the unlimited
nonexclusive license forever after.



-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:36                                                               ` George Plymale II
  2018-02-02  2:08                                                                 ` Tim Landscheidt
@ 2018-02-02  2:17                                                                 ` Richard Stallman
  2018-02-02  6:26                                                                   ` George Plymale II
  2018-02-02  9:26                                                                   ` Eli Zaretskii
  2018-02-02  2:17                                                                 ` Richard Stallman
                                                                                   ` (3 subsequent siblings)
  5 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-02  2:17 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > As I told Stefan in my initial message about this, I would be fine with
  > releasing my contributions into the public domain.

That would be sufficient for us to use the code.

We want to have something we can point at, to show a court that you
have did put it in the public domain.  You can do that by signing a
copyright disclaimer.  Please write to assign@gnu,org saying you'd
like to disclaim copyright on a contribution to Emacs, and they will
say how.

I think you'd still need your parent or guardian to sign it,
but it wouldn't assign the copyright.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:36                                                               ` George Plymale II
  2018-02-02  2:08                                                                 ` Tim Landscheidt
  2018-02-02  2:17                                                                 ` Richard Stallman
@ 2018-02-02  2:17                                                                 ` Richard Stallman
  2018-02-02  7:33                                                                   ` George Plymale II
  2018-02-02  2:17                                                                 ` Richard Stallman
                                                                                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02  2:17 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > What if they can't? What if I don't have parents? What if I live in
  > foster homes and my legal guardian is frequently changed?

If that happens, I will worry about what to do.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:36                                                               ` George Plymale II
                                                                                   ` (2 preceding siblings ...)
  2018-02-02  2:17                                                                 ` Richard Stallman
@ 2018-02-02  2:17                                                                 ` Richard Stallman
  2018-02-02  7:24                                                                   ` George Plymale II
  2018-02-02 13:37                                                                 ` Clément Pit-Claudel
  2018-02-05  4:51                                                                 ` Herring, Davis
  5 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02  2:17 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

I'm responding to the points you raised so as to educate you and
others about what we do and where we stand.  You don't have to agree,
but I want incorrect statements about us to be corrected.

  > All that you can do to enforce the GPL is sue people.

On the contrary, most of our enforcement actions don't go as far as a
court case.  But we need to have that option as a last resort
in order to win most of the time without suing.

							  Isn't there enough
  > litigiousness in the world today?

Yes, but that doesn't imply that any given lawsuit is wrong.

For instance, look at the ACLU's lawsuits.  The ACLU is constantly
suing to overturn unjust laws and protect human rights.  I support the
ACLU because I support those lawsuits.

The FSF's GPL enforcement is also a way of protecting human rights:
specifically, every user's right to change and redistribute certain
code.

				      Moreover, there is no other fruit
  > borne by these restrictions

No, it's the other way around.  We use the GNU GPL to STOP those who
redistribute our code from placing restrictions on subsequent users of
it.

				than that won in a court battle.

Usually we succeed without a court battle.  However, if do go to court
and win, that's still good -- it protects the users' freedom.

  > You
  > certainly aren't recruiting more developers in any projects which are
  > subject to this policy.

Yes we are.  There are several Emacs contributors that weren't
involved a few years ago.

However, Emacs would fail to give people freedom if we gave up on
defending it.

  > Of course, all of this would probably not be necessary were it not for
  > the controversial nature of the GPL which leads to lawsuits a lot more
  > than 

Our defense of freedom is controversial, but we don't mind.  The GPL
sometimes leads to lawsuits because it defends users' freedom.
If we gave up without a fight, we'd never have a fight, but that would
not be better.

	 other open-source licenses.

This is the free software movement.  We believe that nonfree software
is an injustice because it denies users freedom.  We don't just wish
everyone had software freedom; we work and campaign and when necessary
fight for it.

Open source is a different idea; the term was coined specifically to
reject our views.  They disagree with us, and we disagree with them.

See https://gnu.org/philosophy/open-source-misses-the-point.html
for more explanation of the difference between free software and open
source.  See also https://thebaffler.com/salvos/the-meme-hustler for
Evgeny Morozov's article on the same point.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:14                                     ` Richard Stallman
@ 2018-02-02  3:05                                       ` Clément Pit-Claudel
  2018-02-04  3:08                                         ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-02-02  3:05 UTC (permalink / raw)
  To: emacs-devel

On 2018-02-01 21:14, Richard Stallman wrote:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > I think things already work the way users expect. Let's look at
>   > Python. When you install a package using 'pip', the package files are
>   > placed on Python's search path. Thereafter, 'import <package>' works
>   > without any further "activation" step. The package is automatically
>   > made available in future sessions, although it is not loaded until
>   > requested.
> 
> In Python, once a package is on the search path, the user needs to
> give a specific command to make it callable from a given module.
> 
> I think Emacs should work the same way.

There may be a misunderstanding.  Emacs already works in (mostly) the same way: Emacs' `require' is very close to Python's `import'.

> If I understood correctly, it is currently NOT the same, because in
> Emacs the package doesn't require any command to make the package
> callable.  Simply getting it from ELPA makes it callable _all the time_.

No, this isn't quite right.  For example, if package foo has a function foo-x, you will need (in most cases) to (require 'foo) before you can call foo-x.

There are some differences, but they are small:

* `require' works globally in Emacs, so once package foo is `require'd in one file, all subsequently executed code can call foo-x, without calling (require 'foo) again.  This is why packages that are in loaded in temacs and dumped don't need to be `require'd.

* Emacs has autoloads, small pieces of code from packages that are run inconditionally.  Autoloads are what makes it possible to call certain functions without requiring the corresponding package first.  In spirit, this is very similar to Python's `pth' files.  Autoload files are a performance issue in some cases, because there are many of them (although each is fairly small). Stefan's patch makes them much faster.

Hope this helps,
Clément.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:12                                                                   ` Richard Stallman
@ 2018-02-02  6:15                                                                     ` George Plymale II
  2018-02-04  3:07                                                                       ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-02  6:15 UTC (permalink / raw)
  To: rms; +Cc: stephen.berman, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> Our goal is freedom for all users of software -- much more than
> "openness".
>
> We release programs under a copyleft license such as the GNU GPL in
> order to defend freedom for all users.  We ask for copyright
> assignments so we can enforce the GPL better in court.  It's all part
> of a careful plan for achieving freedom.
>
> See https://gnu.org/licenses/copyleft.html for more explanation,
> and https://gnu.org/licenses/why-assign.html.
>
> Our goal is not "openness" -- we don't use that word.  We campaign for
> users' freedom, specifically to control the software they use.
>
> See https://gnu.org/philosophy/open-source-misses-the-point.html
> for more explanation of the difference between free software and open
> source.  See also https://thebaffler.com/salvos/the-meme-hustler for
> Evgeny Morozov's article on the same point.

By using the word "openness," I wasn't specifically referring to the
open-source movement. I just meant that this policy decreases general
openness in the community since there is a certain gate, if you will,
which one must pass through in order to contribute to Emacs.

The other thing which I meant regarding "openness" is succinctly
expressed by Nikos Mavrogiannopoulos, one of the developers of GnuTLS:

"(b) The feeling of participation in the GNU project is very low, as even
expressing a different opinion in the internal mailing lists is hard if
not impossible.
(c) There is no process for decision making or transparency in GNU.
The only existing process I saw is "Stallman said so"
(this may not be bad, unless some threshold of disagreement has been
reached - but then it is fair to be able to disassociate myself from the
project)."

( from https://lwn.net/Articles/529565/ )

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:17                                                                 ` Richard Stallman
@ 2018-02-02  6:26                                                                   ` George Plymale II
  2018-02-02  9:26                                                                   ` Eli Zaretskii
  1 sibling, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02  6:26 UTC (permalink / raw)
  To: rms; +Cc: monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > As I told Stefan in my initial message about this, I would be fine with
>   > releasing my contributions into the public domain.
>
> That would be sufficient for us to use the code.
>
> We want to have something we can point at, to show a court that you
> have did put it in the public domain.  You can do that by signing a
> copyright disclaimer.  Please write to assign@gnu,org saying you'd
> like to disclaim copyright on a contribution to Emacs, and they will
> say how.
>
> I think you'd still need your parent or guardian to sign it,
> but it wouldn't assign the copyright.

That sounds like it is sufficient (or at least an improvement on what I
originally thought).

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:17                                                                 ` Richard Stallman
@ 2018-02-02  7:24                                                                   ` George Plymale II
  2018-02-02 22:28                                                                     ` Paul Eggert
  2018-02-04  3:09                                                                     ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02  7:24 UTC (permalink / raw)
  To: rms; +Cc: monnier, emacs-devel

> I'm responding to the points you raised so as to educate you and
> others about what we do and where we stand.  You don't have to agree,
> but I want incorrect statements about us to be corrected.

I don't agree on some of your points and I would like to respond to some
of those points to clarify to you where I stand and others who share
similar opinions. I don't want to respond to all of them since I do not
desire a flame war. But I will respond to some which I feel will not
incite ill feelings.

> Yes, but that doesn't imply that any given lawsuit is wrong.

You are correct. Yet I find that most lawsuits regarding software are
frivolous and ultimately a waste of time for everyone involved
(including society at large). There are much more serious crimes and
problems in the world today and wasting a court's time on stuff
involving electrical pulses in metal boxes just seems totally silly, at
best. No matter if it's about copyright or copyleft.

> No, it's the other way around.  We use the GNU GPL to STOP those who
> redistribute our code from placing restrictions on subsequent users of
> it.

I understand the enforcing nature of the GPL. What I meant is that there
is no fruit for the project in terms of new manpower or technical
improvement.

Honestly, though, the GPL is just a different set of restrictions. And,
contrary to popular belief, it restricts users as well as
developers. Users are restricted from sharing or modifying this program,
except under certain conditions, by the barrier of copyright
issues. These restrictions are supposed to prevent other restrictions,
but honestly you could say the same thing about some proprietary
software licenses.

> Yes we are.  There are several Emacs contributors that weren't
> involved a few years ago.

I would like to see Emacs get more recruitment which is more appreciable
in terms of numbers, though. The excitement around Emacs is surprisingly
growing. I believe it is in large part due to Spacemacs (
http://spacemacs.org/ ) and similar projects which appeal to those who
are used to modern text editors. I also believe that Emacs would see
significantly more contributors improving the project if they weren't
scared off by murmurs of copyright issues and philosophical
disagreements.

> However, Emacs would fail to give people freedom if we gave up on
> defending it.

Emacs has suffered from this defense, though. lldb still hasn't gotten
proper support in Emacs because of Apple's mere association with its
parent project. Eli went on their mailing list some months ago and tried
to resolve some technical disagreements with the project, but lldb
probably would have been supported in Emacs a long time ago were it not
for the political brouhaha surrounding it.

People have tried to make improvements to GCC to allow the creation of
development modes in Emacs which are now supported by Clang
instead. E.g. https://github.com/Sarcasm/irony-mode

Those improvements to GCC were denied also in the name of defending freedom.

Sometimes it seems that in the free software world, you have to fly the
GNU banner or else you're an enemy.

> Open source is a different idea; the term was coined specifically to
> reject our views.  They disagree with us, and we disagree with them.

This division is unproductive at best.

> See https://gnu.org/philosophy/open-source-misses-the-point.html
> for more explanation of the difference between free software and open
> source.  See also https://thebaffler.com/salvos/the-meme-hustler for
> Evgeny Morozov's article on the same point.

Thank you, I'm aware of the philosophy of the GNU project.

In any case, the copyright issues which I was worried about do not seem
as bad as they did to me initially. It seems that there is more
flexibility than I thought so that is good. I just hope that perhaps we
can get to a point someday where Emacs (and other GNU programs) will be
able to exist without the burdens of copyright worries. I know that
those worries seem helpful to some, but it's hard to believe that when
looking at things as a whole.

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:14                                                                     ` Loading a package applies automatically to future sessions? Richard Stallman
@ 2018-02-02  7:25                                                                       ` George Plymale II
  2018-02-02  9:39                                                                       ` Eli Zaretskii
  1 sibling, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02  7:25 UTC (permalink / raw)
  To: rms; +Cc: stephen.berman, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > That sounds interesting, but I would like to know more of the specifics
>   > about that. Is there a place where I can find very detailed information
>   > about this specific "license" which is "granted back to contributors?"
>
> It is an unlimited nonexclusive license; it says you can use your own
> code/text "as you see fit".  It may say you need to inform us the
> first time you want to do this, and then you get the unlimited
> nonexclusive license forever after.

Well that sounds much better than I originally thought. Thank you for
clarifying that.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:17                                                                 ` Richard Stallman
@ 2018-02-02  7:33                                                                   ` George Plymale II
  2018-02-02 18:38                                                                     ` Drew Adams
  2018-02-02 20:36                                                                     ` Loading a package applies automatically to future sessions? Phillip Lord
  0 siblings, 2 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02  7:33 UTC (permalink / raw)
  To: rms; +Cc: monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > What if they can't? What if I don't have parents? What if I live in
>   > foster homes and my legal guardian is frequently changed?
>
> If that happens, I will worry about what to do.

Well, I don't think I could convince any of my parents to sign copyright
waivers. And I don't want to subject them to such concerns. Moreover, it
is possible that there is further ambiguity because of things that I
cannot divulge publicly.

In any case, this policy is certainly a pain for minors.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:44                                                                   ` George Plymale II
  2018-02-01 22:16                                                                     ` Stephen Berman
  2018-02-02  2:14                                                                     ` Loading a package applies automatically to future sessions? Richard Stallman
@ 2018-02-02  8:39                                                                     ` Eli Zaretskii
  2018-02-02 17:21                                                                       ` George Plymale II
  2 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-02  8:39 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

> From: George Plymale II <georgedp@orbitalimpact.com>
> Date: Thu, 01 Feb 2018 16:44:04 -0500
> Cc: monnier@IRO.UMontreal.CA, emacs-devel@gnu.org
> 
> >    [...] Thus, we grant back to contributors a license to use
> >    their work as they see fit. This means they are free to modify, share,
> >    and sublicense their own work under terms of their choice. This enables
> >    contributors to redistribute their work under another free software
> >    license. While this technically also permits distributing their work
> >    under a proprietary license, we hope they won't.
>    
> That sounds interesting, but I would like to know more of the specifics
> about that. Is there a place where I can find very detailed information
> about this specific "license" which is "granted back to contributors?"

When you sign the copyright assignment, the text of that assignment
includes the above-mentioned permissions.  If you want, I can cite the
text as it appears in my assignment agreements, I don't believe that
text is any kind of secret.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 23:02                                                                       ` George Plymale II
@ 2018-02-02  8:43                                                                         ` Eli Zaretskii
  2018-02-02 17:19                                                                           ` George Plymale II
  2018-02-02 12:19                                                                         ` Phillip Lord
                                                                                           ` (2 subsequent siblings)
  3 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-02  8:43 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

> From: George Plymale II <georgedp@orbitalimpact.com>
> Date: Thu, 01 Feb 2018 18:02:12 -0500
> Cc: monnier@IRO.UMontreal.CA, emacs-devel@gnu.org
> 
> > I don't know of an online resource with such details, but maybe it's
> > somewhere in the FSF website.  There is a statement to that effect in
> > the assignment agreement itself, at least in the paper version I
> > received when I made my assignment many years ago:
> 
> >    FSF agrees to grant back to Developer, and does hereby grant,
> >    non-exclusive, royalty-free and non-cancellable rights to use the Works
> >    (i.e., Developer's changes and/or enhancements, not the Program that
> >    they enhance), as Developer sees fit [...]
> 
> Huh, well I wasn't aware of that and it sounds fine to me. Are you sure
> that there's no strings attached?

There's no other wording related to that, and the text is pretty
clear.  So I see no other strings that could be attached.  You, as the
author, retain full rights to do anything you like with the code.

> Well, my understanding of the policy was that one's _contributions_ are
> owned by the FSF. I.e., that you have to sign waivers which tell the
> FSF, "Hey, I give up all rights to own any code that I give you guys in
> these certain projects."

Given the above, I believe you now realize that this was a mistaken
interpretation.  You retain all the rights, you just give the FSF the
ability to enforce the copyright if needed.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:17                                                                 ` Richard Stallman
  2018-02-02  6:26                                                                   ` George Plymale II
@ 2018-02-02  9:26                                                                   ` Eli Zaretskii
  2018-02-02 17:14                                                                     ` George Plymale II
  2018-02-02 22:56                                                                     ` Richard Stallman
  1 sibling, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-02  9:26 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel, georgedp, monnier

> From: Richard Stallman <rms@gnu.org>
> Date: Thu, 01 Feb 2018 21:17:15 -0500
> Cc: monnier@IRO.UMontreal.CA, emacs-devel@gnu.org
> 
>   > As I told Stefan in my initial message about this, I would be fine with
>   > releasing my contributions into the public domain.
> 
> That would be sufficient for us to use the code.

However, AFAIU and AFAIR, this is impossible to do once and for all
the future contributions, as we do with copyright assignments.  Which
means that every single contribution will need a separate disclaimer.
People who choose that way should be aware of that caveat (assuming
I'm not confused about that, in which case apologies in advance).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:14                                                                     ` Loading a package applies automatically to future sessions? Richard Stallman
  2018-02-02  7:25                                                                       ` George Plymale II
@ 2018-02-02  9:39                                                                       ` Eli Zaretskii
  2018-02-02 17:07                                                                         ` George Plymale II
                                                                                           ` (3 more replies)
  1 sibling, 4 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-02  9:39 UTC (permalink / raw)
  To: rms; +Cc: stephen.berman, emacs-devel, georgedp, monnier

> From: Richard Stallman <rms@gnu.org>
> Date: Thu, 01 Feb 2018 21:14:53 -0500
> Cc: stephen.berman@gmx.net, monnier@IRO.UMontreal.CA, emacs-devel@gnu.org
> 
> It is an unlimited nonexclusive license; it says you can use your own
> code/text "as you see fit".  It may say you need to inform us the
> first time you want to do this, and then you get the unlimited
> nonexclusive license forever after.

In my assignments, both those from 20 years ago, and those from the
recent years, there's no such caveat as described in the last sentence
above.  I'm just given "nonexclusive, royalty-free, fully paid up and
non-cancellable worldwide rights to use [the code I developed], as
Developer sees fit."



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 23:02                                                                       ` George Plymale II
  2018-02-02  8:43                                                                         ` Eli Zaretskii
@ 2018-02-02 12:19                                                                         ` Phillip Lord
  2018-02-02 19:20                                                                           ` Radon Rosborough
  2018-02-02 22:53                                                                         ` Richard Stallman
  2018-02-06 15:06                                                                         ` Loading a package applies automatically to future sessions? Sam Steingold
  3 siblings, 1 reply; 838+ messages in thread
From: Phillip Lord @ 2018-02-02 12:19 UTC (permalink / raw)
  To: George Plymale II; +Cc: Stephen Berman, monnier, emacs-devel

George Plymale II <georgedp@orbitalimpact.com> writes:

>>    FSF agrees to grant back to Developer, and does hereby grant,
>>    non-exclusive, royalty-free and non-cancellable rights to use the Works
>>    (i.e., Developer's changes and/or enhancements, not the Program that
>>    they enhance), as Developer sees fit [...]
>
> Huh, well I wasn't aware of that and it sounds fine to me. Are you sure
> that there's no strings attached?

There are some strings -- for instance, you are guaranteeing that you
actually own the copyright in the first place. I didn't know about the
grant back, incidentally. For Emacs, it makes not practical
difference. As far as I can see, it's not possible to release Emacs code
that is not GPL or public domain anyway, since it automatically links
with Emacs.

>
>> Your wording ("it's not right to force someone to give you the rights to
>> their code while in the same breath talking about freedom", "This kind
>> of stuff doesn't encourage any openness or 'hacker culture.'") suggests
>> a different understanding of the FSF policy than what the FSF itself
>> expounds, as exemplified by the passage I quoted above.
>
> Well, my understanding of the policy was that one's _contributions_ are
> owned by the FSF. I.e., that you have to sign waivers which tell the
> FSF, "Hey, I give up all rights to own any code that I give you guys in
> these certain projects." To me, that seems hypocritical and it seemed
> that indeed the actual FSF policy versus what the FSF itself expounds
> were in disagreement. But, maybe I'm incorrect about that if that above
> passage is really what it sounds like.

It does require copyright assignment, yes. Whether that is hypocritical
or not is up to you. For Emacs, copyright assignment makes little or not
difference to what you can do with the code. So I don't think that's an
issue.

It is a significant practical issue for sure and involves a lot of
book-keeping for package maintainers.

Phil



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:36                                                               ` George Plymale II
                                                                                   ` (3 preceding siblings ...)
  2018-02-02  2:17                                                                 ` Richard Stallman
@ 2018-02-02 13:37                                                                 ` Clément Pit-Claudel
  2018-02-02 17:20                                                                   ` Drew Adams
  2018-02-05  4:51                                                                 ` Herring, Davis
  5 siblings, 1 reply; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-02-02 13:37 UTC (permalink / raw)
  To: emacs-devel

On 2018-02-01 16:36, George Plymale II wrote:
> What if they can't? What if I don't have parents? What if I live in
> foster homes and my legal guardian is frequently changed?

Note that (depending on where you live) you most likely need a parent's or guardian's approval to release your code into the public domain (or under any license that grants rights to others).  The GPL and Emacs' copyright policy are not different in that regard.

Please remember to change the title of the thread when you change the topic, too: it makes it easier for others to filter discussions by topic :)

Clément.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  9:39                                                                       ` Eli Zaretskii
@ 2018-02-02 17:07                                                                         ` George Plymale II
  2018-02-02 17:59                                                                         ` Stefan Monnier
                                                                                           ` (2 subsequent siblings)
  3 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02 17:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stephen.berman, emacs-devel, rms, monnier

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Richard Stallman <rms@gnu.org>
>> Date: Thu, 01 Feb 2018 21:14:53 -0500
>> Cc: stephen.berman@gmx.net, monnier@IRO.UMontreal.CA, emacs-devel@gnu.org
>> 
>> It is an unlimited nonexclusive license; it says you can use your own
>> code/text "as you see fit".  It may say you need to inform us the
>> first time you want to do this, and then you get the unlimited
>> nonexclusive license forever after.
>
> In my assignments, both those from 20 years ago, and those from the
> recent years, there's no such caveat as described in the last sentence
> above.  I'm just given "nonexclusive, royalty-free, fully paid up and
> non-cancellable worldwide rights to use [the code I developed], as
> Developer sees fit."


Thanks for expounding on Richard's last point with your
observations. I'll probably have to look at one of these assignments
myself so that I can know exactly what it stipulates.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  9:26                                                                   ` Eli Zaretskii
@ 2018-02-02 17:14                                                                     ` George Plymale II
  2018-02-02 22:56                                                                     ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02 17:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, rms, monnier

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Richard Stallman <rms@gnu.org>
>> Date: Thu, 01 Feb 2018 21:17:15 -0500
>> Cc: monnier@IRO.UMontreal.CA, emacs-devel@gnu.org
>> 
>>   > As I told Stefan in my initial message about this, I would be fine with
>>   > releasing my contributions into the public domain.
>> 
>> That would be sufficient for us to use the code.
>
> However, AFAIU and AFAIR, this is impossible to do once and for all
> the future contributions, as we do with copyright assignments.  Which
> means that every single contribution will need a separate disclaimer.
> People who choose that way should be aware of that caveat (assuming
> I'm not confused about that, in which case apologies in advance).


Ok. Thanks for clarifying that.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  8:43                                                                         ` Eli Zaretskii
@ 2018-02-02 17:19                                                                           ` George Plymale II
  2018-02-02 17:57                                                                             ` Stefan Monnier
  2018-02-02 18:06                                                                             ` Eli Zaretskii
  0 siblings, 2 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02 17:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stephen.berman, monnier, emacs-devel

> There's no other wording related to that, and the text is pretty
> clear.  So I see no other strings that could be attached.  You, as the
> author, retain full rights to do anything you like with the code.

Ok, that sounds good. I'd still like to take a look at this myself so
that I can verify for myself that there are no strings attached.

> Given the above, I believe you now realize that this was a mistaken
> interpretation.  You retain all the rights, you just give the FSF the
> ability to enforce the copyright if needed.

Which copyright does one give the FSF the ability to enforce? And what
does that entail?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Loading a package applies automatically to future sessions?
  2018-02-02 13:37                                                                 ` Clément Pit-Claudel
@ 2018-02-02 17:20                                                                   ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-02-02 17:20 UTC (permalink / raw)
  To: Clément Pit-Claudel, emacs-devel

> Please remember to change the title of the thread when you change the
> topic, too: it makes it easier for others to filter discussions by topic
> :)

+1



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  8:39                                                                     ` Eli Zaretskii
@ 2018-02-02 17:21                                                                       ` George Plymale II
  2018-02-02 18:08                                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-02 17:21 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stephen.berman, monnier, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: George Plymale II <georgedp@orbitalimpact.com>
>> Date: Thu, 01 Feb 2018 16:44:04 -0500
>> Cc: monnier@IRO.UMontreal.CA, emacs-devel@gnu.org
>> 
>> >    [...] Thus, we grant back to contributors a license to use
>> >    their work as they see fit. This means they are free to modify, share,
>> >    and sublicense their own work under terms of their choice. This enables
>> >    contributors to redistribute their work under another free software
>> >    license. While this technically also permits distributing their work
>> >    under a proprietary license, we hope they won't.
>>    
>> That sounds interesting, but I would like to know more of the specifics
>> about that. Is there a place where I can find very detailed information
>> about this specific "license" which is "granted back to contributors?"
>
> When you sign the copyright assignment, the text of that assignment
> includes the above-mentioned permissions.  If you want, I can cite the
> text as it appears in my assignment agreements, I don't believe that
> text is any kind of secret.

I would appreciate such a citation if you don't mind. You can also send
it to me privately, if you'd like.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 17:19                                                                           ` George Plymale II
@ 2018-02-02 17:57                                                                             ` Stefan Monnier
  2018-02-02 18:06                                                                             ` Eli Zaretskii
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-02 17:57 UTC (permalink / raw)
  To: George Plymale II; +Cc: Eli Zaretskii, stephen.berman, emacs-devel

>> Given the above, I believe you now realize that this was a mistaken
>> interpretation.  You retain all the rights, you just give the FSF the
>> ability to enforce the copyright if needed.
> Which copyright does one give the FSF the ability to enforce?

Only the copyright holder can sue someone for infringement.
AFAIK the things you lose when transferring your copyright to the FSF are:
- the ability to transfer your copyright to someone else (because only
  the copyright holder can transfer his copyright to someone else (note
  that the copyright holder cannot not "copy" his copyright he can only
  transfer it)).  This is not something the FSF really needs/wants which
  is why there is that clause that says that the FSF gives you the right
  to do anything you like with your work (i.e. to gives you back as
  much of the copyright holder's rights as it legally can).
- the ability to sue someone for infringement (because only the
  copyright holder can do that) which is one of the main reasons the FSF
  wants to have the copyright.
- the ability to prevent the FSF from licensing your work under some
  licence with which you happen to disagree (tho, IIRC, the paperwork
  you sign does include some clause promising that your work will stay
  under some kind of Free licence, tho, to try and make sure that
  there's not much point for <yourfavoriteevilcompany> to buy/infiltrate the
  FSF, since changing the licenses to be non-Free would break all those
  copyright assignments).


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  9:39                                                                       ` Eli Zaretskii
  2018-02-02 17:07                                                                         ` George Plymale II
@ 2018-02-02 17:59                                                                         ` Stefan Monnier
  2018-02-02 22:56                                                                         ` Richard Stallman
  2018-02-14 22:28                                                                         ` Richard Stallman
  3 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-02 17:59 UTC (permalink / raw)
  To: emacs-devel

> In my assignments, both those from 20 years ago, and those from the
> recent years, there's no such caveat as described in the last sentence
> above.

Can't remember what mine l;ooked like, but I've just found one (called
assign.ncurses) in fencepost which says:

       Upon thirty days' prior written notice(s), the Foundation agrees to
    grant to any one or more, or all, of us non-exclusive rights to use the
    Package as we see fit; (and the Foundation's rights shall otherwise
    continue unchanged).


-- Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 17:19                                                                           ` George Plymale II
  2018-02-02 17:57                                                                             ` Stefan Monnier
@ 2018-02-02 18:06                                                                             ` Eli Zaretskii
  1 sibling, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-02 18:06 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

> From: George Plymale II <georgedp@orbitalimpact.com>
> Cc: stephen.berman@gmx.net, monnier@IRO.UMontreal.CA,
> 	emacs-devel@gnu.org
> Date: Fri, 02 Feb 2018 12:19:25 -0500
> 
> > Given the above, I believe you now realize that this was a mistaken
> > interpretation.  You retain all the rights, you just give the FSF the
> > ability to enforce the copyright if needed.
> 
> Which copyright does one give the FSF the ability to enforce? And what
> does that entail?

By assigning the copyright to your code to the FSF, you give them the
ability to enforce adherence to the GPL for the package to which you
contributed.  That's because, since the FSF holds the copyright to
every line of code in the package, it can prosecute anyone who
violates the GPL for that package.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 17:21                                                                       ` George Plymale II
@ 2018-02-02 18:08                                                                         ` Eli Zaretskii
  0 siblings, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-02 18:08 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

> From: George Plymale II <georgedp@orbitalimpact.com>
> Cc: stephen.berman@gmx.net, monnier@IRO.UMontreal.CA,
> 	emacs-devel@gnu.org
> Date: Fri, 02 Feb 2018 12:21:33 -0500
> 
> >> That sounds interesting, but I would like to know more of the specifics
> >> about that. Is there a place where I can find very detailed information
> >> about this specific "license" which is "granted back to contributors?"
> >
> > When you sign the copyright assignment, the text of that assignment
> > includes the above-mentioned permissions.  If you want, I can cite the
> > text as it appears in my assignment agreements, I don't believe that
> > text is any kind of secret.
> 
> I would appreciate such a citation if you don't mind. You can also send
> it to me privately, if you'd like.

I meanwhile already cited that.  Here it is again:

> [...]  I'm just given "nonexclusive, royalty-free, fully paid up and
> non-cancellable worldwide rights to use [the code I developed], as
> Developer sees fit."



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Loading a package applies automatically to future sessions?
  2018-02-02  7:33                                                                   ` George Plymale II
@ 2018-02-02 18:38                                                                     ` Drew Adams
  2018-02-02 19:05                                                                       ` Generations (was: Loading a package applies automatically to future sessions?) Stefan Monnier
  2018-02-02 20:36                                                                     ` Loading a package applies automatically to future sessions? Phillip Lord
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2018-02-02 18:38 UTC (permalink / raw)
  To: George Plymale II, rms; +Cc: monnier, emacs-devel

> Well, I don't think I could convince any of my parents to sign copyright
> waivers. And I don't want to subject them to such concerns. Moreover, it
> is possible that there is further ambiguity because of things that I
> cannot divulge publicly.
> 
> In any case, this policy is certainly a pain for minors.

It's parents et al who are a pain for minors. ;-)
Only one (partial) cure for that.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Generations (was: Loading a package applies automatically to future sessions?)
  2018-02-02 18:38                                                                     ` Drew Adams
@ 2018-02-02 19:05                                                                       ` Stefan Monnier
  2018-02-02 21:40                                                                         ` Drew Adams
  2018-02-02 22:57                                                                         ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-02 19:05 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, George Plymale II, rms

> It's parents et al who are a pain for minors. ;-)

I think you have this backward!


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 12:19                                                                         ` Phillip Lord
@ 2018-02-02 19:20                                                                           ` Radon Rosborough
  0 siblings, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-02-02 19:20 UTC (permalink / raw)
  To: Phillip Lord
  Cc: Stephen Berman, emacs-devel, George Plymale II, Stefan Monnier

[-- Attachment #1: Type: text/plain, Size: 232 bytes --]

> As far as I can see, it's not possible to release Emacs code
> that is not GPL or public domain anyway, since it automatically links
> with Emacs.

That's a matter of opinion. My Emacs packages are released under the
MIT License.

[-- Attachment #2: Type: text/html, Size: 336 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  1:54                                                           ` Stefan Monnier
@ 2018-02-02 20:32                                                             ` George Plymale II
  0 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-02 20:32 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

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

>> One more thing regarding my bug about info nodes from ELPA,
>
> Oh, I didn't respond to that part, but this is a "known issue" (the
> patch I sent doesn't bother to keep track and reproduce changes to
> Info-directory-list).
>
>> I noticed that all my info nodes were back after upgrading my packages
>> in `package-list-packages'.  Do you have any idea about why that is,
>> Stefan?
>
> Hmm... no I can't explain how/why the problem disappeared when you did that.
>
>
>         Stefan

Ok, please consider fixing this even though it's a known issue.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  7:33                                                                   ` George Plymale II
  2018-02-02 18:38                                                                     ` Drew Adams
@ 2018-02-02 20:36                                                                     ` Phillip Lord
  1 sibling, 0 replies; 838+ messages in thread
From: Phillip Lord @ 2018-02-02 20:36 UTC (permalink / raw)
  To: George Plymale II; +Cc: emacs-devel, rms, monnier

George Plymale II <georgedp@orbitalimpact.com> writes:

> Richard Stallman <rms@gnu.org> writes:
>
>> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
>> [[[ whether defending the US Constitution against all enemies,     ]]]
>> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>>
>>   > What if they can't? What if I don't have parents? What if I live in
>>   > foster homes and my legal guardian is frequently changed?
>>
>> If that happens, I will worry about what to do.
>
> Well, I don't think I could convince any of my parents to sign copyright
> waivers. And I don't want to subject them to such concerns. Moreover, it
> is possible that there is further ambiguity because of things that I
> cannot divulge publicly.
>
> In any case, this policy is certainly a pain for minors.

Indeed. But, without the copyright policy, you should still be asking
your parents about your ability to licence your software under
GPL. Because who ever uses your software is, effectively, entering into
a contract with you, that gives them the right to use your softawre

Now the contractual terms of the GPL state that is irrevocable. I don't
know how it is in the US, but in the UK, my understanding anyway, is
that while as a minor you can make a contract, you can revoke that
contract before you reach 18 or shortly after. Even if that
disadvantages the other party.

So, I don't think the assignment policy is the issue here. The law is
with respect to minors is difficult; it's not meant to be a pain, it's
meant to be a protection. Either way, the complexities of being a minor
do apply to an assignment policy, but they also apply to licencing.

Usual "I am not a lawyer" restrictions apply to anything I say here.

Phil





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Generations (was: Loading a package applies automatically to future sessions?)
  2018-02-02 19:05                                                                       ` Generations (was: Loading a package applies automatically to future sessions?) Stefan Monnier
@ 2018-02-02 21:40                                                                         ` Drew Adams
  2018-02-02 22:57                                                                         ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-02-02 21:40 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, George Plymale II, rms

> > It's parents et al who are a pain for minors. ;-)
> 
> I think you have this backward!

Both are true.  Mine was a reply to a minor complaint. ;-)
Yours is a major complaint.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  7:24                                                                   ` George Plymale II
@ 2018-02-02 22:28                                                                     ` Paul Eggert
  2018-02-05  8:21                                                                       ` George Plymale II
  2018-02-04  3:09                                                                     ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Paul Eggert @ 2018-02-02 22:28 UTC (permalink / raw)
  To: George Plymale II, rms; +Cc: monnier, emacs-devel

On 02/01/2018 11:24 PM, George Plymale II wrote:
> most lawsuits regarding software are
> frivolous and ultimately a waste of time for everyone involved

Having been the target of a frivolous software lawsuit myself 
<https://www.eff.org/press/releases/eff-wins-protection-time-zone-database> 
I am sympathetic to this argument. However, such lawsuits don't mean we 
should give up on the legal system entirely; that would be throwing out 
the baby with the bathwater. Instead, we should use the legal system as 
best we can, and work to improve it where it has significant flaws. And 
this is what the Free Software Foundation is trying to do.

> In any case, the copyright issues which I was worried about do not seem
> as bad as they did to me initially.

Yes, that's often the case. A lot of FUD has been spread about the GPL 
and the GNU project.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  2:08                                                                 ` Tim Landscheidt
@ 2018-02-02 22:53                                                                   ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-02 22:53 UTC (permalink / raw)
  To: Tim Landscheidt; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > What if they can't? What if I don't have parents? What if I live in
  > > foster homes and my legal guardian is frequently changed? I don't see
  > > how a policy which prevents such people from contributing to the project
  > > is very helpful.

  > I doubt that under those conditions someone could legally
  > release one's code under any licence or into the public do-
  > main; i. e. "a policy" means "every policy" in that context.

I think you are right.  (Though I hesitate to say it is _impossible_;
there may be a legal avenue, but we'd need to ask a lawyer what it may
be.)

Our policy does not create the problem, but rather helps us avoid
being oblivious to it.)

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 23:02                                                                       ` George Plymale II
  2018-02-02  8:43                                                                         ` Eli Zaretskii
  2018-02-02 12:19                                                                         ` Phillip Lord
@ 2018-02-02 22:53                                                                         ` Richard Stallman
  2018-02-05  9:17                                                                           ` A response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
  2018-02-06 15:06                                                                         ` Loading a package applies automatically to future sessions? Sam Steingold
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02 22:53 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Well, my understanding of the policy was that one's _contributions_ are
  > owned by the FSF. I.e., that you have to sign waivers which tell the
  > FSF, "Hey, I give up all rights to own any code that I give you guys in
  > these certain projects." To me, that seems hypocritical and it seemed
  > that indeed the actual FSF policy versus what the FSF itself expounds
  > were in disagreement.

If you accuse us of hypocrisy, you should be prepared to present
particulars.  What is the principle that the FSF stands for, that
conflicts with our practices?

My hunch is that you've been misinformed about our principles.
If you say what you believe our principles to be, we can compare
them with our real principles.

Our main principle is: users should have control of the software
they use.  Therefore, a nonfree program is an injustice.

To eliminate that injustice, we release free software and encourage
others to do so.  We use copyleft to prevent our free software from
being perverted by middlemen into nonfree software and thus used to
subjugate others.

As for copyright, we do not consider that an issue of principle, not
directly.  We consider it a sort of weapon that can be used for good
or for bad.  When it is used to subjugate people, that is bad.  When
it is used, through copyleft, to protect people from subjugation, that
is good.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 22:16                                                                     ` Stephen Berman
  2018-02-01 23:02                                                                       ` George Plymale II
@ 2018-02-02 22:53                                                                       ` Richard Stallman
  2018-02-02 23:12                                                                         ` Stephen Berman
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02 22:53 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel, georgedp, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I don't know of an online resource with such details, but maybe it's
  > somewhere in the FSF website.

I think we should post an explanation of this.

It appears that we don't have one on gnu.org.  Would you like to check
fsf.org?

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  9:26                                                                   ` Eli Zaretskii
  2018-02-02 17:14                                                                     ` George Plymale II
@ 2018-02-02 22:56                                                                     ` Richard Stallman
  2018-02-05  9:19                                                                       ` George Plymale II
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02 22:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel, georgedp, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

We don't have a way to do a disclaimer for future changes.  We have
not had many contributors who wanted to disclaim instead of assigning,
so we haven't tried.  But it might be possible.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  9:39                                                                       ` Eli Zaretskii
  2018-02-02 17:07                                                                         ` George Plymale II
  2018-02-02 17:59                                                                         ` Stefan Monnier
@ 2018-02-02 22:56                                                                         ` Richard Stallman
  2018-02-14 22:28                                                                         ` Richard Stallman
  3 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-02 22:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stephen.berman, emacs-devel, georgedp, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > It is an unlimited nonexclusive license; it says you can use your own
  > > code/text "as you see fit".  It may say you need to inform us the
  > > first time you want to do this, and then you get the unlimited
  > > nonexclusive license forever after.

  > In my assignments, both those from 20 years ago, and those from the
  > recent years, there's no such caveat as described in the last sentence
  > above.  I'm just given "nonexclusive, royalty-free, fully paid up and
  > non-cancellable worldwide rights to use [the code I developed], as
  > Developer sees fit."

I recall that SOME of our assignments used to say the developer
had to ask for the nonexclusive license, and would then automatically
receive it.  But it has been many years since I signed the assignments
myself, and I don't know whether we ever use that wording nowadays.

It doesn't make a difference in practice.  With the other wording that
make sit an option to request the nonexclusive license, the
contributor can immediately exercise the option.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Generations (was: Loading a package applies automatically to future sessions?)
  2018-02-02 19:05                                                                       ` Generations (was: Loading a package applies automatically to future sessions?) Stefan Monnier
  2018-02-02 21:40                                                                         ` Drew Adams
@ 2018-02-02 22:57                                                                         ` Richard Stallman
  2018-02-02 23:03                                                                           ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-02 22:57 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: georgedp, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > It's parents et al who are a pain for minors. ;-)

  > I think you have this backward!

However, parents do have the ability to avoid having children.
Children don't have a way to avoid having parents.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Generations (was: Loading a package applies automatically to future sessions?)
  2018-02-02 22:57                                                                         ` Richard Stallman
@ 2018-02-02 23:03                                                                           ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-02-02 23:03 UTC (permalink / raw)
  To: rms, Stefan Monnier; +Cc: georgedp, emacs-devel

>   > > It's parents et al who are a pain for minors. ;-)
> 
>   > I think you have this backward!
> 
> However, parents do have the ability to avoid having
> children.  Children don't have a way to avoid having
> parents.

Interesting research project, no doubt.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 22:53                                                                       ` Richard Stallman
@ 2018-02-02 23:12                                                                         ` Stephen Berman
  2018-02-03 19:13                                                                           ` Richard Stallman
                                                                                             ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Stephen Berman @ 2018-02-02 23:12 UTC (permalink / raw)
  To: Richard Stallman; +Cc: emacs-devel, georgedp, monnier

On Fri, 02 Feb 2018 17:53:53 -0500 Richard Stallman <rms@gnu.org> wrote:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > I don't know of an online resource with such details, but maybe it's
>   > somewhere in the FSF website.
>
> I think we should post an explanation of this.
>
> It appears that we don't have one on gnu.org.  Would you like to check
> fsf.org?

I probably cannot make a systematic check any time soon, but if I do
find the time, or happen to notice a relevant page by chance, I'll be
sure to point it out.

Steve Berman



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 16:23                                                           ` T.V Raman
@ 2018-02-03  0:39                                                             ` Tim Cross
  2018-02-05  9:24                                                               ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: Tim Cross @ 2018-02-03  0:39 UTC (permalink / raw)
  To: T.V Raman; +Cc: George Plymale II, Stefan Monnier, Emacs developers

[-- Attachment #1: Type: text/plain, Size: 641 bytes --]

Thanks Raman, I was actually looking at that this morning.

The danger for me is that every time I look at my emacs init, I always find
things I can improve or cleanup. Not a complaint, but it is often a source
of procrastination. There are way too many weekends I've wasted tweaking my
emacs setup rather than getting on with my always large todo list!

Tim


On 2 February 2018 at 03:23, T.V Raman <raman@google.com> wrote:

> M-x emacs-init-time will show your startup time.
>
> You can find some code for more fine-grained instrumentation in
> tvr/emacs-startup.el in the emacspeak Github repo.
> --
>



-- 
regards,

Tim

--
Tim Cross

[-- Attachment #2: Type: text/html, Size: 1271 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 23:12                                                                         ` Stephen Berman
@ 2018-02-03 19:13                                                                           ` Richard Stallman
  2018-02-03 20:40                                                                           ` Stephen Berman
  2018-02-05  9:22                                                                           ` Finding an online resource for the agreement (was Loading a package applies automatically to future sessions?) George Plymale II
  2 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-03 19:13 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel, georgedp, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > >   > I don't know of an online resource with such details, but maybe it's
  > >   > somewhere in the FSF website.
  > >
  > > I think we should post an explanation of this.
  > >
  > > It appears that we don't have one on gnu.org.  Would you like to check
  > > fsf.org?

Can someone look for one now on fsf.org?  Because the first step
to posting one is finding out if we already have one.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 23:12                                                                         ` Stephen Berman
  2018-02-03 19:13                                                                           ` Richard Stallman
@ 2018-02-03 20:40                                                                           ` Stephen Berman
  2018-02-04  3:07                                                                             ` Richard Stallman
  2018-02-05  9:26                                                                             ` George Plymale II
  2018-02-05  9:22                                                                           ` Finding an online resource for the agreement (was Loading a package applies automatically to future sessions?) George Plymale II
  2 siblings, 2 replies; 838+ messages in thread
From: Stephen Berman @ 2018-02-03 20:40 UTC (permalink / raw)
  To: Richard Stallman; +Cc: emacs-devel, georgedp, monnier

On Sat, 03 Feb 2018 00:12:12 +0100 Stephen Berman <stephen.berman@gmx.net> wrote:

> On Fri, 02 Feb 2018 17:53:53 -0500 Richard Stallman <rms@gnu.org> wrote:
>
>> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
>> [[[ whether defending the US Constitution against all enemies,     ]]]
>> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>>
>>   > I don't know of an online resource with such details, but maybe it's
>>   > somewhere in the FSF website.
>>
>> I think we should post an explanation of this.
>>
>> It appears that we don't have one on gnu.org.  Would you like to check
>> fsf.org?
>
> I probably cannot make a systematic check any time soon, but if I do
> find the time, or happen to notice a relevant page by chance, I'll be
> sure to point it out.

I don't have the time to manually look through every page of the FSF
website but I did enter "assign" in the site's search form; it returned
55 hits, most of which are lists of new copyright assigners.  But the
following pages have some information about what copyright assignment
means:

https://www.fsf.org/licensing/index_html
 FSF Licensing & Compliance Team
 by Joshua Gay — published Mar 13, 2013 — last modified Aug 11, 2017 03:13 PM
 [...]
 Copyright & Compliance
 The Free Software Foundation holds the copyright to many GNU packages,
 such as GCC and EMACS. When hackers contribute to these projects, we
 ask that they assign their copyright to enable us to enforce the
 license. For questions about assigning to the FSF, please contact us at
 assign@gnu.org.

https://www.fsf.org/blogs/rms/assigning-copyright
 When a company asks for your copyright
 by Richard Stallman — published Sep 29, 2010 — last modified Nov 05, 2010 09:46 AM 
 [...]
 The company will probably invite you to assign or license your
 copyright to the company. That in itself is not inherently bad; for
 instance, many GNU software developers have assigned copyrights to the
 FSF. However, the FSF never sells exceptions, and its assignment
 contracts include a commitment to distribute the contributor's code
 only with source and only permitting redistribution.

https://www.fsf.org/licensing/assignunisrule.html
 Assignment University
 by jacobson — published Sep 19, 2006 — last modified Jul 29, 2013 02:55 PM 
 [...]
 Although the FSF does not require the assignment of copyright on new
 GNU project programs, on existing programs where it already holds
 copyright, the FSF does collect assignments and register copyrights.
 [...]
 some reasons why a university might like to assign copyright to the FSF:
 -> University assignment of code allows the university freedom from the
 burden of protecting the work created by the developers at the
 university. The FSF accepts copyright so that it can do its enforcement
 work.
 [...]

https://www.fsf.org/licensing/20050325novalis.html
 The Basics
 by novalis — published Mar 25, 2005 — last modified Mar 12, 2010 10:06 AM 
 [...]
 5. You can also assign your copyright. By way of analogy, licensing
 software to someone is like inviting them to visit your house;
 assigning copyright to someone is like selling them your house.
 a. You might want to assign your copyright to someone else if they
 promise to do the work of enforcing the license, or they otherwise
 won't take your patches.

Steve Berman



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-03 20:40                                                                           ` Stephen Berman
@ 2018-02-04  3:07                                                                             ` Richard Stallman
  2018-02-05  9:26                                                                             ` George Plymale II
  1 sibling, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-04  3:07 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel, georgedp, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

Thanks for the search results.  It looks like we don't have a FAQ
about the topic of copyright assignments, so we will work on one,
over time.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  6:15                                                                     ` George Plymale II
@ 2018-02-04  3:07                                                                       ` Richard Stallman
  2018-02-05  9:35                                                                         ` Another response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-04  3:07 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > By using the word "openness," I wasn't specifically referring to the
  > open-source movement. I just meant that this policy decreases general
  > openness in the community since there is a certain gate, if you will,
  > which one must pass through in order to contribute to Emacs.

Freedom sometimes requires a sacrifice, and this is one example.
"Openness" is not a priority for us -- freedom is our goal.

  > (c) There is no process for decision making or transparency in GNU.

Do you mean, that the contributors can't change the goals and the
philosophy of the project.  That's true, and it has to be that way.

Most free software projects don't have a commitment to any particular
political goal or philosophy.  Those questions are simply up to the
main developers of the project.  They can change goals as thery see
fit.

GNU is different.  It has a commitment to a particular political
philosophy, and that never changes.

People who expect the other way may be surprised when they see GNU is
different.  They expect to be able to argue about the basic goal
and get it changed.  However, the goal of GNU came before GNU,
so they cannot change it.

You have a right to criticize various aspects of GNU, but please don't
use this list for that; that is off-topic here.  This list is for
developing Emacs.  Explaining our assignment policies was just barely
on-topic, but this is not.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  3:05                                       ` Clément Pit-Claudel
@ 2018-02-04  3:08                                         ` Richard Stallman
  2018-02-04 15:21                                           ` Clément Pit-Claudel
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-04  3:08 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > There may be a misunderstanding.  Emacs already works in (mostly) the same way: Emacs' `require' is very close to Python's `import'.

That's the behavior I'd expect a feature like this to have.

  > * Emacs has autoloads, small pieces of code from packages that are run inconditionally.

I do know about autoloads; I implemented them.
The questions are (1) do a lot of these packages have autoloads, or just
a few, and (2) when do the autoloads get installed into Emacs.

If adding a package to the list for loading has the effect of installing
its autploads in all future sessions, that results in behavior very
different from the 'require' behavior, and behavior that doesn't match
what I'd expect such a feature to have.

Does Python have autoloads?  I would expect not.

  > * `require' works globally in Emacs, so once package foo is
  > * `require'd in one file, all subsequently executed code can call
  > * foo-x, without calling (require 'foo) again.

That is true.  With dynamic scoping that was basically inevitable.

However, when lexical scoping becomes the default, it might be
possible to arrange that a Lisp library is in scope only in files that
require it.  That would clean up a lot of things.  For instance,
it would not matter whether you compile A before B or after B.

Since the effect of calling an autoload function is to call 'require',
it could be that lexical handling of 'require' will automatically
clean up the way these autoloads are handled.


-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  7:24                                                                   ` George Plymale II
  2018-02-02 22:28                                                                     ` Paul Eggert
@ 2018-02-04  3:09                                                                     ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-04  3:09 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Honestly, though, the GPL is just a different set of restrictions. And,
  > contrary to popular belief, it restricts users as well as
  > developers. Users are restricted from sharing or modifying this program,
  > except under certain conditions, by the barrier of copyright
  > issues.

It's just the opposite: the GNU GPL _prevents_ restrictions.
It assures that all users can freely redistribute the program,
by stopping middlemen from putting on restrictions.

You look at freedom as a word game, so you say, "Hay, if I can't put
on restrictions, that's a restriction on me."  That paradox doesn't
bother us because we understand freedom as a matter of substance, not
a matter of form.  We judge by the substantive question: are users
free to do the things that give them control over the program?

You don't have to agree with us, but arguing against our philosophy is
outside the purpose of this list.  This list is for Emacs development.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-04  3:08                                         ` Richard Stallman
@ 2018-02-04 15:21                                           ` Clément Pit-Claudel
  2018-02-04 21:27                                             ` Tim Cross
  2018-02-05  1:08                                             ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-02-04 15:21 UTC (permalink / raw)
  Cc: emacs-devel

>   > There may be a misunderstanding.  Emacs already works in (mostly) the same way: Emacs' `require' is very close to Python's `import'.
> 
> That's the behavior I'd expect a feature like this to have.
> 
>   > * Emacs has autoloads, small pieces of code from packages that are run inconditionally.
> 
> I do know about autoloads; I implemented them.

I know that; but I'm writing to the entire list, and there may be other readers who are less familiar with autoloads :)

> The questions are (1) do a lot of these packages have autoloads, or just
> a few, and (2) when do the autoloads get installed into Emacs.

Most packages, AFAICT, make their main interactive entry points autoloads.  I think that is the right behavior.

> If adding a package to the list for loading has the effect of installing
> its autploads in all future sessions, that results in behavior very
> different from the 'require' behavior, and behavior that doesn't match
> what I'd expect such a feature to have.
> 
> Does Python have autoloads?  I would expect not.

Yes, in two senses:

* Installing a package with 'pip' commonly installs small binaries in your path, so you can call the program from the command line.
* Python has .pth files that work essentially like Emacs autoloads.  These aren't used very commonly.

> Since the effect of calling an autoload function is to call 'require',
> it could be that lexical handling of 'require' will automatically
> clean up the way these autoloads are handled.

The thing is, I don't a the problem with the way autoloads are currently handled.  seeWe just need to find a way to make processing autoloads faster, and in fact Stefan has a solution for that, IIUC.

The fact that installing a package installs its autoloads is desirable; just like the fact that running 'apt-get install emacs' puts the emacs binary on your path.

I think lexical vs dynamic 'require' is a different issue.

Clément.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-04 15:21                                           ` Clément Pit-Claudel
@ 2018-02-04 21:27                                             ` Tim Cross
  2018-02-05 10:07                                               ` George Plymale II
  2018-02-05  1:08                                             ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Tim Cross @ 2018-02-04 21:27 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: Emacs developers

[-- Attachment #1: Type: text/plain, Size: 4222 bytes --]

While I think I can see what RMS is concerned about, I am not necessarily
convinced the concern is significant enough to warrant implementation of
additional user action that would be required in order to activate packages
in future sessions. One of the great benefits of the ELPA system has been
how much easier it has made it to add useful extensions and keep those
extensions up-to-date without requiring the user to write any ELISP. While
I personally don't find writing ELISP a challenge, many do - or at least
shy away from it initially.

Bottom line is that when you install most ELPA packages, the package will
often install basic autoloads. This means that should you do something or
execute one of the autoload commands, the package will load and run in
future sessions. So, in effect, the answer to the original question is yes,
packages are available and will be automatically loaded in future sessions
if the user executes one of those autloaded functions. However, I'm not
aware of any packages which setup hooks or add themselves to hooks so that
the package is loaded without specific user action in future sessions (I
have not tried all packages and it would certainly be possible for a
package to do this, though it might be tricky to implement unless you edit
the user's init file, which I don't think is normal for an elpa package).

I feel the basic mechanism to prevent packages from being available in
future sessions is to simply remove them. I actually think this is a good
practice as it prevents people from building up large numbers of
unused/unnecessary packages  that only slow down updates. It also reduces
the likelihood of unused packages conflicting with used packages and works
towards a cleaner environment.  Given that re-installing is also trivial, I
don't think this is too much of a burden should there be a package you only
need very rarely.  Anyone who wants something more complex is of course
free to implement such functionality themselves.

Tim





On 5 February 2018 at 02:21, Clément Pit-Claudel <cpitclaudel@gmail.com>
wrote:

> >   > There may be a misunderstanding.  Emacs already works in (mostly)
> the same way: Emacs' `require' is very close to Python's `import'.
> >
> > That's the behavior I'd expect a feature like this to have.
> >
> >   > * Emacs has autoloads, small pieces of code from packages that are
> run inconditionally.
> >
> > I do know about autoloads; I implemented them.
>
> I know that; but I'm writing to the entire list, and there may be other
> readers who are less familiar with autoloads :)
>
> > The questions are (1) do a lot of these packages have autoloads, or just
> > a few, and (2) when do the autoloads get installed into Emacs.
>
> Most packages, AFAICT, make their main interactive entry points
> autoloads.  I think that is the right behavior.
>
> > If adding a package to the list for loading has the effect of installing
> > its autploads in all future sessions, that results in behavior very
> > different from the 'require' behavior, and behavior that doesn't match
> > what I'd expect such a feature to have.
> >
> > Does Python have autoloads?  I would expect not.
>
> Yes, in two senses:
>
> * Installing a package with 'pip' commonly installs small binaries in your
> path, so you can call the program from the command line.
> * Python has .pth files that work essentially like Emacs autoloads.  These
> aren't used very commonly.
>
> > Since the effect of calling an autoload function is to call 'require',
> > it could be that lexical handling of 'require' will automatically
> > clean up the way these autoloads are handled.
>
> The thing is, I don't a the problem with the way autoloads are currently
> handled.  seeWe just need to find a way to make processing autoloads
> faster, and in fact Stefan has a solution for that, IIUC.
>
> The fact that installing a package installs its autoloads is desirable;
> just like the fact that running 'apt-get install emacs' puts the emacs
> binary on your path.
>
> I think lexical vs dynamic 'require' is a different issue.
>
> Clément.
>
>


-- 
regards,

Tim

--
Tim Cross

[-- Attachment #2: Type: text/html, Size: 5186 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-04 15:21                                           ` Clément Pit-Claudel
  2018-02-04 21:27                                             ` Tim Cross
@ 2018-02-05  1:08                                             ` Richard Stallman
  2018-02-05  4:15                                               ` Clément Pit-Claudel
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-05  1:08 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Does Python have autoloads?  I would expect not.

  > Yes, in two senses:

  > * Installing a package with 'pip' commonly installs small binaries in your path, so you can call the program from the command line.
  > * Python has .pth files that work essentially like Emacs autoloads.  These aren't used very commonly.

How do these autoload-like constructs in Python interact with
the usual need to 'import' a package to make its entry points accessible?

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-05  1:08                                             ` Richard Stallman
@ 2018-02-05  4:15                                               ` Clément Pit-Claudel
  2018-02-05 20:36                                                 ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-02-05  4:15 UTC (permalink / raw)
  Cc: emacs-devel

On 2018-02-04 20:08, Richard Stallman wrote:
>   > > Does Python have autoloads?  I would expect not.
> 
>   > Yes, in two senses:
> 
>   > * Installing a package with 'pip' commonly installs small binaries in your path, so you can call the program from the command line.
>   > * Python has .pth files that work essentially like Emacs autoloads.  These aren't used very commonly.
> 
> How do these autoload-like constructs in Python interact with
> the usual need to 'import' a package to make its entry points accessible?

They're the first thing the interpreter runs when it starts.  You can write 'import foo' on a separate line, and then python imports 'foo' before running your actual program.  The code in 'foo' can then introduce new global names by modifying the builtins dictionary (this isn't a very common practice)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 21:36                                                               ` George Plymale II
                                                                                   ` (4 preceding siblings ...)
  2018-02-02 13:37                                                                 ` Clément Pit-Claudel
@ 2018-02-05  4:51                                                                 ` Herring, Davis
  5 siblings, 0 replies; 838+ messages in thread
From: Herring, Davis @ 2018-02-05  4:51 UTC (permalink / raw)
  To: George Plymale II, rms@gnu.org
  Cc: monnier@IRO.UMontreal.CA, emacs-devel@gnu.org

> Of course, all of this would probably not be necessary were it not for
> the controversial nature of the GPL which leads to lawsuits a lot more
> than other open-source licenses.

While we're about clarifying these issues: the reason that fewer lawsuits are pursued over software subject to permissive licenses is of course their lack of provisions which anyone would expect to profit by violating.  (Innocent mistakes are made, of course, but they are not litigated.)  The controversy over the GPL of course also results from its provisions, but that makes it a sister effect to the lawsuits, not a cause of them.

Davis


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 22:28                                                                     ` Paul Eggert
@ 2018-02-05  8:21                                                                       ` George Plymale II
  2018-02-05 20:36                                                                         ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-05  8:21 UTC (permalink / raw)
  To: Paul Eggert; +Cc: emacs-devel, rms, monnier

> Having been the target of a frivolous software lawsuit myself 
> <https://www.eff.org/press/releases/eff-wins-protection-time-zone-database> 
> I am sympathetic to this argument. However, such lawsuits don't mean we 
> should give up on the legal system entirely; that would be throwing out 
> the baby with the bathwater. Instead, we should use the legal system as 
> best we can, and work to improve it where it has significant flaws.

Totally in agreement with you. I just dislike myself (or others) having
to worry about these kinds of things at all. But I guess that's just the
world we live in today.

> Yes, that's often the case. A lot of FUD has been spread about the GPL 
> and the GNU project.

Well, I actually distilled this opinion from information that I got from
the FSF's website and gnu.org. So I doubt I was reading any GPL FUD from
them ;)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-02 22:53                                                                         ` Richard Stallman
@ 2018-02-05  9:17                                                                           ` George Plymale II
  2018-02-05 12:55                                                                             ` Clément Pit-Claudel
                                                                                               ` (3 more replies)
  0 siblings, 4 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-05  9:17 UTC (permalink / raw)
  To: rms; +Cc: stephen.berman, monnier, emacs-devel

>   > Well, my understanding of the policy was that one's _contributions_ are
>   > owned by the FSF. I.e., that you have to sign waivers which tell the
>   > FSF, "Hey, I give up all rights to own any code that I give you guys in
>   > these certain projects." To me, that seems hypocritical and it seemed
>   > that indeed the actual FSF policy versus what the FSF itself expounds
>   > were in disagreement.

> If you accuse us of hypocrisy, you should be prepared to present
> particulars.  What is the principle that the FSF stands for, that
> conflicts with our practices?

Well, one of the principles which I believed you to be in contradiction
of was this:

"You should also have the freedom to make modifications and use them
privately in your own work or play, without even mentioning that they
exist. If you do publish your changes, you should not be required to
notify anyone in particular, or in any particular way."

( from https://www.gnu.org/philosophy/free-sw.html )

According to my understanding of the FSF's copyright policy, I have to
notify the FSF when I want to distribute my changes because they're no
longer mine; they're theirs.

Moreover, I believed you to be in contradiction of this principle as
well:

"I cannot in good conscience sign a nondisclosure agreement or a
software license agreement."

( from https://www.gnu.org/gnu/manifesto.en.html )

To me, the signing of a waiver feels like it's in much the same vein as
either of those. If not a bit worse in some ways. In light of the new
information that I received from others on this mailing list, it may not
be as bad as I thought.

Regardless, that is what I meant by "hypocrisy" and it is not a word
that I use lightly nor without cause.

> My hunch is that you've been misinformed about our principles.

Your hunch is incorrect. I ascertained my opinions on the GNU project
and the FSF mainly via objective analysis of their own documents and
manifestos. It was also coupled with some examination of how their
values worked out in reality, along with comparisons to other
philosophies and facts. My conclusion of these analyses was mostly what
I have already related in previous messages.

> Our main principle is: users should have control of the software
> they use.  Therefore, a nonfree program is an injustice.

> To eliminate that injustice, we release free software and encourage
> others to do so.  We use copyleft to prevent our free software from
> being perverted by middlemen into nonfree software and thus used to
> subjugate others.

> As for copyright, we do not consider that an issue of principle, not
> directly.  We consider it a sort of weapon that can be used for good
> or for bad.  When it is used to subjugate people, that is bad.  When
> it is used, through copyleft, to protect people from subjugation, that
> is good.

All users have control over the software that they use. Oftentimes, even
hardware cannot stop one from modifying the software which runs atop
it. Enough ingenuity and craftiness trumps even the likes of
Tivo. Whether or not this is legal is an entirely different question and
forms the basis of the GNU campaign.

I know that many will read my statement and scoff. Ask yourself, though:
what stops a user from modifying the bits that run on their computer?
Not the law. It is knowledge. Knowledge of how a computer works and how
well its machine code can be understood. Indeed, the GNU project's
efforts and funds would be far better spent creating tools that would
allow users to universally understand machine code that would truly
allow them to control any software that they have, regardless of its
underlying machinery. This would enable freedom of software in a much
more tangible and truer sense than anything that anyone has done. Ever.

But instead the whole affair has become an argument of copyright or
copyleft. The ability to own capital and sell it or to have that capital
controlled and dolled out by one big entity (or maybe a few) who claim
to be in the interests of the people. Or we may call those people
"users."

Sound familiar? If not, I would highly suggest reading John Wiegley's
poignant and cogent letter to the FSF:
http://newartisans.com/2011/04/letter-to-the-fsf/

I didn't even want to write all of this until you stipulated that my
opinions are based on misinformation and smear campaigns done by others
to the GNU project. Such a presumption insults the intellect of very
intelligent people who I know that share my opinion and who formed the
same opinion based on rational, moral, and objective analysis.

In any case, I no longer desire to discuss these things. My opinion and
your opinion have both been stated. I doubt that either of us will
change them based on the words of the other. I am no longer as
dissatisfied or upset with the FSF's policy as I was, although I will
still need to investigate the agreement for myself to determine whether
it is indeed a fair agreement. That does not, however, convince me of
the merits of copyleft nor the philosophies which I have already
expressed disagreement with.

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02 22:56                                                                     ` Richard Stallman
@ 2018-02-05  9:19                                                                       ` George Plymale II
  2018-02-05 20:36                                                                         ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-05  9:19 UTC (permalink / raw)
  To: rms; +Cc: eliz, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
> We don't have a way to do a disclaimer for future changes.  We have
> not had many contributors who wanted to disclaim instead of assigning,
> so we haven't tried.  But it might be possible.

That sounds like a great idea. It's definitely something to be looked into.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Finding an online resource for the agreement (was Loading a package applies automatically to future sessions?)
  2018-02-02 23:12                                                                         ` Stephen Berman
  2018-02-03 19:13                                                                           ` Richard Stallman
  2018-02-03 20:40                                                                           ` Stephen Berman
@ 2018-02-05  9:22                                                                           ` George Plymale II
  2 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-05  9:22 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel, rms, monnier

Stephen Berman <stephen.berman@gmx.net> writes:

> On Fri, 02 Feb 2018 17:53:53 -0500 Richard Stallman <rms@gnu.org> wrote:
>
>> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
>> [[[ whether defending the US Constitution against all enemies,     ]]]
>> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>>
>>   > I don't know of an online resource with such details, but maybe it's
>>   > somewhere in the FSF website.
>>
>> I think we should post an explanation of this.
>>
>> It appears that we don't have one on gnu.org.  Would you like to check
>> fsf.org?
>
> I probably cannot make a systematic check any time soon, but if I do
> find the time, or happen to notice a relevant page by chance, I'll be
> sure to point it out.
>
> Steve Berman

Yes, I would appreciate knowing about this as well.

Thanks,
- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-03  0:39                                                             ` Tim Cross
@ 2018-02-05  9:24                                                               ` George Plymale II
  0 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-05  9:24 UTC (permalink / raw)
  To: Tim Cross; +Cc: emacs-devel, monnier, raman

> The danger for me is that every time I look at my emacs init, I always find things I can improve or cleanup. Not a complaint, but it is often a source of procrastination.
> There are way too many weekends I've wasted tweaking my emacs setup rather than getting on with my always large todo list!

Ah, I know the feeling all too well. Hence my initial involvement in
this thread :)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-03 20:40                                                                           ` Stephen Berman
  2018-02-04  3:07                                                                             ` Richard Stallman
@ 2018-02-05  9:26                                                                             ` George Plymale II
  1 sibling, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-05  9:26 UTC (permalink / raw)
  To: Stephen Berman; +Cc: emacs-devel, rms, monnier

Oops, I didn't see this message before sending my other message to you
which read:

> Yes, I would appreciate knowing about this as well.

Apologies!

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Another response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-04  3:07                                                                       ` Richard Stallman
@ 2018-02-05  9:35                                                                         ` George Plymale II
  2018-02-05 20:37                                                                           ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-05  9:35 UTC (permalink / raw)
  To: rms; +Cc: stephen.berman, monnier, emacs-devel

> Freedom sometimes requires a sacrifice, and this is one example.
> "Openness" is not a priority for us -- freedom is our goal.

Ok. I am of the opinion that these virtues go hand in hand.

> Most free software projects don't have a commitment to any particular
> political goal or philosophy.  Those questions are simply up to the
> main developers of the project.  They can change goals as thery see
> fit.

> GNU is different.  It has a commitment to a particular political
> philosophy, and that never changes.

> People who expect the other way may be surprised when they see GNU is
> different.  They expect to be able to argue about the basic goal
> and get it changed.  However, the goal of GNU came before GNU,
> so they cannot change it.

Ok, I understand and respect that.

> You have a right to criticize various aspects of GNU, but please don't
> use this list for that; that is off-topic here.  This list is for
> developing Emacs.  Explaining our assignment policies was just barely
> on-topic, but this is not.

I apologize, I only brought this up as a genuine concern for improving
some code which was relevant. My subsequent messages about this were
responses to others who in turn messaged me about this issue (including
you). If you want, I will stop discussing all such issues regarding this
on this list from henceforth.

If that is the case, where may relevantly I take such concerns should
they arise again?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-04 21:27                                             ` Tim Cross
@ 2018-02-05 10:07                                               ` George Plymale II
  2018-02-05 21:27                                                 ` Tim Cross
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-05 10:07 UTC (permalink / raw)
  To: Tim Cross; +Cc: cpitclaudel, emacs-devel

> Given that re-installing is also trivial

This is not always true, esp. given a large number of packages.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05  9:17                                                                           ` A response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
@ 2018-02-05 12:55                                                                             ` Clément Pit-Claudel
  2018-02-06 23:34                                                                               ` George Plymale II
  2018-02-05 20:36                                                                             ` Richard Stallman
                                                                                               ` (2 subsequent siblings)
  3 siblings, 1 reply; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-02-05 12:55 UTC (permalink / raw)
  To: emacs-devel

On 2018-02-05 04:17, George Plymale II wrote:
> According to my understanding of the FSF's copyright policy, I have
> to notify the FSF when I want to distribute my changes because
> they're no longer mine; they're theirs.

I think you misunderstood.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-05  4:15                                               ` Clément Pit-Claudel
@ 2018-02-05 20:36                                                 ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-05 20:36 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

I retract my concerns about this feature.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-05  8:21                                                                       ` George Plymale II
@ 2018-02-05 20:36                                                                         ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-05 20:36 UTC (permalink / raw)
  To: George Plymale II; +Cc: eggert, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Well, I actually distilled this opinion from information that I got from
  > the FSF's website and gnu.org. So I doubt I was reading any GPL FUD from
  > them ;)

I would guess that you reacted to what you read there based on ideas
you have heard others express.  "Don't you dare restrict me from
putting restrictions on others" is an idea that I've seen for 20
years, from those opposed to copyleft.  I wrote this haiku back then
to show why it is misguided.

   Using GPL
   Is encroaching on our rights
   To encroach on yours


-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05  9:17                                                                           ` A response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
  2018-02-05 12:55                                                                             ` Clément Pit-Claudel
@ 2018-02-05 20:36                                                                             ` Richard Stallman
  2018-02-06 23:42                                                                               ` George Plymale II
  2018-02-05 20:36                                                                             ` Richard Stallman
  2018-02-05 20:36                                                                             ` Richard Stallman
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-05 20:36 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > "You should also have the freedom to make modifications and use them
  > privately in your own work or play, without even mentioning that they
  > exist. If you do publish your changes, you should not be required to
  > notify anyone in particular, or in any particular way."

  > ( from https://www.gnu.org/philosophy/free-sw.html )

All our software releaes give you this; they give this
to the public at large.

  > According to my understanding of the FSF's copyright policy, I have to
  > notify the FSF when I want to distribute my changes because they're no
  > longer mine; they're theirs.

You don't have to notify the FSF to redistribute our software releases
under the GPL.

The unlimited nonexclusive license in the assignment contracts
concerns using that code in other ways, not necessarily in accord with
the GPL.

Some of our assignment contracts say that the author has to explicitly
activate the nonexclusive license.  Others say that the nonexclusive
license starts right away.  If the author prefers the latter form, we
always use it.

You seem to be bending over backwards to put us in the wrong.


-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05  9:17                                                                           ` A response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
  2018-02-05 12:55                                                                             ` Clément Pit-Claudel
  2018-02-05 20:36                                                                             ` Richard Stallman
@ 2018-02-05 20:36                                                                             ` Richard Stallman
  2018-02-05 20:36                                                                             ` Richard Stallman
  3 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-05 20:36 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Ask yourself, though:
  > what stops a user from modifying the bits that run on their computer?
  > Not the law. It is knowledge. Knowledge of how a computer works and how
  > well its machine code can be understood.

With all due respect, you're mistaken about the reasons for this.

Common obstacles include

  the user has no access to the source code.
  the system or the hardware is designed to refuse to run modified versions.

But the most common reason is,

  the user is not a programmer, and can't ask the development
  community for help because the proprietary nature of a program prevents
  the existence of one.

Changing a large program at the machine code level, without the
comments that help programmes understand the code, is too hard to be
feasible -- except for quite small changes, which are merely a great
pain in the neck.

  > Indeed, the GNU project's
  > efforts and funds would be far better spent creating tools that would
  > allow users to universally understand machine code that would truly
  > allow them to control any software that they have, regardless of its
  > underlying machinery.

That would be a superhuman AI.  If you succeed at this, I agree it
would be a great advance.  I'd rather spend our funds on areas where I
expect that effort can result in progress.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05  9:17                                                                           ` A response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
                                                                                               ` (2 preceding siblings ...)
  2018-02-05 20:36                                                                             ` Richard Stallman
@ 2018-02-05 20:36                                                                             ` Richard Stallman
  3 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-05 20:36 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I didn't even want to write all of this until you stipulated that my
  > opinions are based on misinformation and smear campaigns done by others
  > to the GNU project. Such a presumption insults the intellect of very
  > intelligent people who I know that share my opinion and who formed the
  > same opinion based on rational, moral, and objective analysis.

If they share your opinion and your reasoning,
they are mistaken for the same reasons.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-05  9:19                                                                       ` George Plymale II
@ 2018-02-05 20:36                                                                         ` Richard Stallman
  2018-02-06 23:44                                                                           ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-05 20:36 UTC (permalink / raw)
  To: George Plymale II; +Cc: eliz, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > We don't have a way to do a disclaimer for future changes.  We have
  > > not had many contributors who wanted to disclaim instead of assigning,
  > > so we haven't tried.  But it might be possible.

  > That sounds like a great idea. It's definitely something to be looked into.

I will ask a lawyer whether in principle this should be possible.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Another response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05  9:35                                                                         ` Another response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
@ 2018-02-05 20:37                                                                           ` Richard Stallman
  2018-02-06 23:47                                                                             ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-05 20:37 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > If that is the case, where may relevantly I take such concerns should
  > they arise again?

We have a mailing list for the purpose, gnu-misc-discuss@gnu.org.
Nowadays it is not used much.  I gather that people mostly discuss
their agreement or disagreement with the free software movement in
various large forum sites which I don't use at all.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-05 10:07                                               ` George Plymale II
@ 2018-02-05 21:27                                                 ` Tim Cross
  0 siblings, 0 replies; 838+ messages in thread
From: Tim Cross @ 2018-02-05 21:27 UTC (permalink / raw)
  To: George Plymale II; +Cc: Clément Pit-Claudel, Emacs developers

[-- Attachment #1: Type: text/plain, Size: 1342 bytes --]

I was referring to re-installation of individual packages i.e. you install
a package, find you don't really need it at this time and so remove it and
then find later you do need it as opposed to removing ALL packages and then
re-installing.

However, having said that, I have done this many times in the past and
never run into any problems. It can take a bit of time if you have a large
number of packages, but I've never found any need to take additional action
with only 1 exception and that is with respect to org mode.

The only package which has ever given me any problems has been org mode and
that was partly my fault (I was loading org functionality and then trying
to install a later version from the org repo).

Of course, if your using unofficial elpa repositories, all bets are off as
there is no curation of the content in these repositories. I have certainly
found crappy packages in some of these repos. However, that is not
something Emacs has control of and if as a user you decide to install
packages from such repos, then you need to be willing to deal with the
issues which arise.

Tim

On 5 February 2018 at 21:07, George Plymale II <georgedp@orbitalimpact.com>
wrote:

> > Given that re-installing is also trivial
>
> This is not always true, esp. given a large number of packages.
>



-- 
regards,

Tim

--
Tim Cross

[-- Attachment #2: Type: text/html, Size: 1999 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-01 23:02                                                                       ` George Plymale II
                                                                                           ` (2 preceding siblings ...)
  2018-02-02 22:53                                                                         ` Richard Stallman
@ 2018-02-06 15:06                                                                         ` Sam Steingold
  3 siblings, 0 replies; 838+ messages in thread
From: Sam Steingold @ 2018-02-06 15:06 UTC (permalink / raw)
  To: emacs-devel

> * George Plymale II <trbetrqc@beovgnyvzcnpg.pbz> [2018-02-01 18:02:12 -0500]:
>
> Well, my understanding of the policy was that one's _contributions_
> are owned by the FSF. I.e., that you have to sign waivers which tell
> the FSF, "Hey, I give up all rights to own any code that I give you
> guys in these certain projects." To me, that seems hypocritical and it
> seemed that indeed the actual FSF policy versus what the FSF itself
> expounds were in disagreement. But, maybe I'm incorrect about that if
> that above passage is really what it sounds like.

This is a very common misunderstanding.

You _can_ distribute GNU software with your own changes under the GNU
GPL - this is called "forking", and has been done many times. The most
notable example is Lucid/X Emacs.

However, if you want the FSF to accept your changes into their source
code repository, you will have to assign them the copyright so that you
(or your heirs) will not be able to sabotage the FSF software
development by revoking your license to use your changes. This also
happened before (Gosling Emacs), and the FSF is now understandably
paranoid.

So, to repeat: you _can_ distribute your changes yourself.
If you want _the FSF_ to do that, you have to sign the papers.

HTH.

-- 
Sam Steingold (http://sds.podval.org/) on darwin Ns 10.3.1561
http://steingoldpsychology.com http://www.childpsy.net http://iris.org.il
http://mideasttruth.com http://honestreporting.com https://jihadwatch.org
Complete tolerance is impossible: it is insulting to bigots.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05 12:55                                                                             ` Clément Pit-Claudel
@ 2018-02-06 23:34                                                                               ` George Plymale II
  0 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-06 23:34 UTC (permalink / raw)
  To: Clément Pit-Claudel; +Cc: emacs-devel

Clément Pit-Claudel <cpitclaudel@gmail.com> writes:

> On 2018-02-05 04:17, George Plymale II wrote:
>> According to my understanding of the FSF's copyright policy, I have
>> to notify the FSF when I want to distribute my changes because
>> they're no longer mine; they're theirs.
>
> I think you misunderstood.

Sorry, I meant to write that sentence in the past tense. I incorrectly
wrote it in the present tense, as that statement _was_ my understanding,
but it is no longer. It was clarified to me by other messages on this
thread that this is not part of the policy. Hence, I wrote the word
"hypocritical" at the time when I did not have that clarified to me.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05 20:36                                                                             ` Richard Stallman
@ 2018-02-06 23:42                                                                               ` George Plymale II
  2018-02-07 20:45                                                                                 ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-06 23:42 UTC (permalink / raw)
  To: rms; +Cc: stephen.berman, monnier, emacs-devel

> All our software releaes give you this; they give this
> to the public at large.

>   > According to my understanding of the FSF's copyright policy, I have to
>   > notify the FSF when I want to distribute my changes because they're no
>   > longer mine; they're theirs.

Sorry, as I said to Clement Pit-Claudel, I should have (and intended to)
write this sentence in the past tense. I mistakenly wrote it in the
present tense. It was clarified to me by other messages on this thread
that this is not part of the FSF's policy. When I wrote the word
"hypocritical," that was not clarified to me.

> You don't have to notify the FSF to redistribute our software releases
> under the GPL.

> The unlimited nonexclusive license in the assignment contracts
> concerns using that code in other ways, not necessarily in accord with
> the GPL.

> Some of our assignment contracts say that the author has to explicitly
> activate the nonexclusive license.  Others say that the nonexclusive
> license starts right away.  If the author prefers the latter form, we
> always use it.

Right, this is what I was not aware of in my original message where I
used the word "hypocritical."

> You seem to be bending over backwards to put us in the wrong.

I am not trying to put anyone "in the wrong." If I were, this would be a
rather different (uglier) debate.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-05 20:36                                                                         ` Richard Stallman
@ 2018-02-06 23:44                                                                           ` George Plymale II
  0 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-06 23:44 UTC (permalink / raw)
  To: rms; +Cc: eliz, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > > We don't have a way to do a disclaimer for future changes.  We have
>   > > not had many contributors who wanted to disclaim instead of assigning,
>   > > so we haven't tried.  But it might be possible.
>
>   > That sounds like a great idea. It's definitely something to be looked into.
>
> I will ask a lawyer whether in principle this should be possible.

Thanks. Please let me know if it is.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Another response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-05 20:37                                                                           ` Richard Stallman
@ 2018-02-06 23:47                                                                             ` George Plymale II
  0 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-06 23:47 UTC (permalink / raw)
  To: rms; +Cc: stephen.berman, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > If that is the case, where may relevantly I take such concerns should
>   > they arise again?
>
> We have a mailing list for the purpose, gnu-misc-discuss@gnu.org.
> Nowadays it is not used much.  I gather that people mostly discuss
> their agreement or disagreement with the free software movement in
> various large forum sites which I don't use at all.

Thanks for the info. I apologize again for cluttering up this mailing
list with this sort of discussion.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: A response to RMS (was Loading a package applies automatically to future sessions?)
  2018-02-06 23:42                                                                               ` George Plymale II
@ 2018-02-07 20:45                                                                                 ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2018-02-07 20:45 UTC (permalink / raw)
  To: George Plymale II; +Cc: stephen.berman, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > It was clarified to me by other messages on this thread
  > that this is not part of the FSF's policy. When I wrote the word
  > "hypocritical," that was not clarified to me.

I'm glad that is cleared up.  I won't hold criticism against you,
now that you no longer believe that.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-30 15:44                         ` Eli Zaretskii
  2018-02-01  3:12                           ` Mark Oteiza
@ 2018-02-08  5:54                           ` Radon Rosborough
  2018-02-08 15:27                             ` Eli Zaretskii
  1 sibling, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2018-02-08  5:54 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Stefan Monnier, emacs-devel

> I didn't yet have time to read the patch, will do in the following
> days, and get back.  I don't expect to object, but I might have some
> comments.

Have you had the chance to take a look yet?

Thanks,
-- Radon



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-08  5:54                           ` Radon Rosborough
@ 2018-02-08 15:27                             ` Eli Zaretskii
  0 siblings, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-08 15:27 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: monnier, emacs-devel

> From: Radon Rosborough <radon.neon@gmail.com>
> Date: Wed, 7 Feb 2018 21:54:54 -0800
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, emacs-devel <emacs-devel@gnu.org>
> 
> > I didn't yet have time to read the patch, will do in the following
> > days, and get back.  I don't expect to object, but I might have some
> > comments.
> 
> Have you had the chance to take a look yet?

Not yet, sorry.  I hope to find time for that during the next few
days.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-01-28 19:42                     ` Radon Rosborough
  2018-01-30 15:02                       ` Stefan Monnier
@ 2018-02-10 11:56                       ` Eli Zaretskii
  2018-02-10 23:37                         ` Stefan Monnier
  2018-02-15  4:38                         ` Radon Rosborough
  1 sibling, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-10 11:56 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: cpitclaudel, monnier, emacs-devel

> From: Radon Rosborough <radon.neon@gmail.com>
> Date: Sun, 28 Jan 2018 11:42:53 -0800
> Cc: emacs-devel <emacs-devel@gnu.org>
> 
> I've fixed all the problems noted by Stefan and Clément, and rebased
> onto the latest master. The revised patch is attached.

Thanks, I have a few minor comments below about the documentation
parts.

> --- a/doc/emacs/package.texi
> +++ b/doc/emacs/package.texi
> @@ -250,31 +250,18 @@ Package Installation
>  wide-ranging effects on the Emacs session.  For such information,
>  consult the package's help buffer.
>  
> -  By default, Emacs also automatically loads all installed packages in
> -subsequent Emacs sessions.  This happens at startup, after processing
> -the init file (@pxref{Init File}).  As an exception, Emacs does not
> -load packages at startup if invoked with the @samp{-q} or
> -@samp{--no-init-file} options (@pxref{Initial Options}).
> +  After a package is installed, it is automatically loaded by Emacs in
> +all subsequent sessions.

Is "automatically loaded" here accurate?  Wouldn't it be better to say
"it is available in all subsequent sessions, in that its functions and
variables will be automatically loaded when needed"?

> +the init file but after processing the early init file (@pxref{Early
> +Init File,,, elisp, The Emacs Lisp Reference Manual}).  As an

We cannot document the early init file, which is a user-level feature,
only in the ELisp manual.  it should be documented in the Emacs user
manual, where the "regular" init file is described.

> -@findex package-initialize

It looks like we are removing the index entry for package-initialize,
although it is a command?

> +@code{package-enable-at-startup} to @code{nil}.  You must do this in
> +the early init file, as the variable is read before loading the
> +regular init file.

There should be a cross-reference here to where the early init file is
described.

> +@cindex early init file
> +  Emacs also attempts to load a second init file, called the
> +  @dfn{early init file}, if it exists.  This is a file named

There's indentation here which is contrary to how we write stuff in
the manual sources.

> +  @file{early-init.el} in a subdirectory named @file{.emacs.d} in your
> +  home directory.

It's better and shorter to say

  @file{early-init.el} in your @file{~/.emacs.d} directory

Btw, is it only looked up in .emacs.d, or also in the directory where
.emacs is searched (which could be just the home directory)?

>                        The difference is that the early init file is
                         ^^^^^^^^^^^^^^^^^
Difference between what and what?

> +after loading the early init file, but before loading the regular init
> +file and abbrev file (if any) and before running
                                ^
You need a comma here.

> +In most cases, you should not need to call @code{package-initialize},
> +as this is done automatically during startup.  Simply make sure to put
> +any code that should run before @code{package-initialize} in the early
> +init file, and any code that should run after it in the primary init
> +file (@xref{Init File,,, emacs, The GNU Emacs Manual}).

This is for users, so it should be in the user manual, not in ELisp
manual.

> --- a/doc/misc/org.texi
> +++ b/doc/misc/org.texi
> @@ -890,9 +890,7 @@ Installation
>  been visited, i.e., where no Org built-in function have been loaded.
>  Otherwise autoload Org functions will mess up the installation.
>  
> -Then, to make sure your Org configuration is taken into account, initialize
> -the package system with @code{(package-initialize)} in your Emacs init file
> -before setting any Org option.  If you want to use Org's package repository,
> +If you want to use Org's package repository,
>  check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.

Why was this hunk necessary?

> +** Emacs can now be configured using an early init file.
> +The file is called 'early-init.el', in 'user-emacs-directory'.  It is
> +loaded very early in the startup process: before graphical elements
> +such as the tool bar are initialized, and before the package manager
> +is initialized.

Please add here a sentence regarding the purpose of this file (to
configure package.el initialization).

> +** Emacs now calls 'package-initialize' before loading the init file.
> +This is part of a change intended to eliminate the behavior of
> +package.el inserting a call to 'package-initialize' into the init
> +file, which was previously done when Emacs was started.  You only need
> +to make changes to your configuration if some of it needs to be run
> +before 'package-initialize' is called (for example, if you set
> +'package-load-list' or 'package-user-dir').  In that case, place the
> +configuration that needs to be run before 'package-initialize' into
> +the early init file.  Note that variables like 'package-archives' can
> +be set after 'package-initialize', so they can still be customized in
> +the regular init file.

The part starting with "You only need to make changes" sounds
unrelated to what precedes it.  You should probably insert there
something which explains that calling package-initialize before
loading the init file eliminates the need for such changes in most
cases?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-01-28 18:20                               ` Radon Rosborough
  2018-01-29  1:52                                 ` Richard Stallman
@ 2018-02-10 12:00                                 ` Eli Zaretskii
  2018-02-11  1:23                                   ` George Plymale II
  2018-02-15  4:40                                   ` Loading a package applies automatically to future sessions? Radon Rosborough
  1 sibling, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-10 12:00 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: rms, emacs-devel

> From: Radon Rosborough <radon.neon@gmail.com>
> Date: Sun, 28 Jan 2018 10:20:49 -0800
> Cc: rms@gnu.org, emacs-devel <emacs-devel@gnu.org>
> 
> > Please point out the places in the manual where we use "load" in the
> > former sense.  I think those places need to be fixed, because that's
> > not what "load" means in the Emacs context.
> 
> The crux of the problem is here in emacs/package.texi:
> 
> "Once a package is downloaded and installed, it is @dfn{loaded} into
> the current Emacs session. Loading a package is not quite the same as
> loading a Lisp library (@pxref{Lisp Libraries}); loading a package
> adds its directory to @code{load-path} and loads its autoloads."
> 
> Frankly the name of `package-load-list' is misleading if we're going
> to change this terminology. It implies you are setting which packages
> are going to be loaded.
> 
> We also have usage of this terminology in emacs/package.texi:
> 
> "After a package is installed, it is automatically loaded by Emacs in
> all subsequent sessions."
> 
> "As an exception, Emacs does not load packages at startup if invoked
> with the @samp{-q} or @samp{--no-init-file} options (@xref{Initial
> Options})."
> 
> "To disable automatic package loading, change the variable
> @code{package-enable-at-startup} to @code{nil}. You must do this in
> the early init file, as the variable is read before loading the
> regular init file."
> 
> "For finer control over package loading, you can use the variable
> @code{package-load-list}."
> 
> "A list element of the form @code{(@var{name} @var{version})} tells
> Emacs to load version @var{version} of the package named @var{name}.
> Here, @var{version} should be a version string (corresponding to a
> specific version of the package), or @code{t} (which means to load any
> installed version), or @code{nil} (which means no version; this
> disables the package, preventing it from being loaded). A list element
> can also be the symbol @code{all}, which means to load the latest
> installed version of any package not named by the other list
> elements."
> 
> "For example, if you set @code{package-load-list} to @code{'((muse
> "3.20") all)}, then Emacs only loads version 3.20 of the @samp{muse}
> package, plus any installed version of packages other than
> @samp{muse}."
> 
> In lispref/package.texi:
> 
> "Whenever Emacs starts up, it automatically calls the function
> @code{package-initialize} to load installed packages."
> 
> "Automatic package loading is disabled if the user option
> @code{package-enable-at-startup} is set to @code{nil} in the early
> init file."
> 
> "This function initializes Emacs' internal record of which packages
> are installed, and loads them. The user option
> @code{package-load-list} specifies which packages to load; by default,
> all installed packages are loaded. If called during startup, this
> function also sets @code{package-enable-at-startup} to @code{nil}, to
> avoid accidentally loading the packages twice."
> 
> "The optional argument @var{no-activate}, if non-@code{nil}, causes
> Emacs to update its record of installed packages without actually
> loading them; it is for internal use only."
> 
> In lispref/os.texi:
> 
> "For example, you can customize the process of loading installed
> packages, by setting variables such as @var{package-load-list} or
> @var{package-enable-at-startup}. @xref{Package Installation,,,
> emacs,The GNU Emacs Manual}."

Thanks.  It looks like all of those places are related to package.el,
so could you please take care of clarifying the issue as part of your
patch?  Most of those places are touched by your patch anyway.

I think the fix should be not to use "load" in this sense, but instead
tell we just make the package available by loading its autoloads.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-10 11:56                       ` Eli Zaretskii
@ 2018-02-10 23:37                         ` Stefan Monnier
  2018-02-11  3:26                           ` Radon Rosborough
  2018-02-11 13:31                           ` Basil L. Contovounesios
  2018-02-15  4:38                         ` Radon Rosborough
  1 sibling, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-10 23:37 UTC (permalink / raw)
  To: emacs-devel

>> +  After a package is installed, it is automatically loaded by Emacs in
>> +all subsequent sessions.
> Is "automatically loaded" here accurate?

Indeed not.

> Wouldn't it be better to say "it is available in all subsequent
> sessions, in that its functions and variables will be automatically
> loaded when needed"?

I use the term "activated" to describe this (what activation does
depends on the package).  Whether we stick to this word or pick another,
I think it's important we pick a word for that and define it in
the manual.

>> -@findex package-initialize
> It looks like we are removing the index entry for package-initialize,
> although it is a command?

[ ...looking up package-initialize... ] OMG, you're right
it's interactive.  Does it make sense to use it interactively, really?


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-10 12:00                                 ` Eli Zaretskii
@ 2018-02-11  1:23                                   ` George Plymale II
  2018-02-13 21:14                                     ` Stefan's patch to improve package loading (was Loading a package applies automatically to future sessions?) George Plymale II
  2018-02-15  4:40                                   ` Loading a package applies automatically to future sessions? Radon Rosborough
  1 sibling, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-11  1:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: radon.neon, monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2205 bytes --]

Hi,

Sorry, I don't mean to hijack the conversation, but speaking of patches,
Stefan gave me an updated version of his patch recently. This one allows
byte-compilation of his ~/.emacs.d/package-fastpath.el file. I asked him
in private if he needs any further feedback several days ago, but I did
not receive a reply from him so I'll assume that it's okay to re-post
his patch here on the list.

I have attached two patches. One is the patch that he originally made
which applies to the Emacs trunk, and the other is for Emacs 25.3. Which
is my current working Emacs version. If anyone could provide further
feedback to Stefan to help him improve this patch, I'm sure he would
appreciate it and I would as well.

So far, I haven't noticed any significant performance improvements from
his patch. Although, with the byte-compilation in place (along with some
other optimizations to my startup code) my init time has gone down to
1.1 seconds. It was 1.4 seconds last time I reported about it on this
thread, I think.

Also, I have noticed (and I forgot to tell Stefan about this in our
private thread) that the bug which I noticed regarding info files from
ELPA is gone. I.e., this bug (which I reported on Jan 31):

"The info files for my packages from ELPA are all missing in the info
Directory node."

is no longer happening, so I guess Stefan has fixed it in this most
recent patch. Yay!

Unfortunately, I had more problems with byte-compilation when I had the
gh.el package installed. package-fastpath.el would refuse to
byte-compile. I have since uninstalled this package since I only had one
other package which was dependent on it and I haven't used it
recently. Stefan's patch probably needs some work in order to properly
deal with strange autoload files. However, the developer of gh.el is
currently trying to make its autoload file a bit lighter so this may not
be a concern much longer.

In any case, I think that Stefan's patch here is still the best solution
to the original problem posed by RMS at the inception of this thread. It
just needs some work. It is also improving startup time quite noticeably
for myself and I am sure that it will for others as well.

Thanks,
- George Plymale II


[-- Attachment #2: Stefan's 2nd patch for package.el (trunk version) --]
[-- Type: text/x-patch, Size: 4048 bytes --]

diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 71d1c41ec3..b918eb5dfe 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -676,6 +676,8 @@ package--activate-autoloads-and-load-path
 (defvar Info-directory-list)
 (declare-function info-initialize "info" ())
 
+(defvar package--fastpath-pkgs t)
+
 (defun package--load-files-for-activation (pkg-desc reload)
   "Load files for activating a package given by PKG-DESC.
 Load the autoloads file, and ensure `load-path' is setup.  If
@@ -718,7 +720,10 @@ package-activate-1
             (message "Unable to activate package `%s'.\nRequired package `%s-%s' is unavailable"
                      name (car req) (package-version-join (cadr req)))
             (throw 'exit nil))))
-      (package--load-files-for-activation pkg-desc reload)
+      (if (listp package--fastpath-pkgs)
+          ;; We're only collecting the set of packages to activate!
+          (push pkg-desc package--fastpath-pkgs)
+        (package--load-files-for-activation pkg-desc reload))
       ;; Add info node.
       (when (file-exists-p (expand-file-name "dir" pkg-dir))
         ;; FIXME: not the friendliest, but simple.
@@ -3468,6 +3473,67 @@ package-list-packages-no-fetch
   (interactive)
   (list-packages t))
 
+;;;; Fast-path for activation!
+
+(defcustom package-fastpath-file (locate-user-emacs-file "package-fastpath.el")
+  "Location of the file used to speed up activation of packages at startup."
+  :type 'file)
+
+(defun package-fastpath-refresh ()
+  "(Re)Generate the `package-fastpath-file'."
+  (interactive)
+  (package-initialize 'no-activate)
+  (require 'info)
+  (let ((package--fastpath-pkgs ())
+        ;; Pretend we haven't activated anything yet!
+        (package-activated-list ())
+        (Info-directory-list '("")))
+    (dolist (elt package-alist)
+      (condition-case err
+          (package-activate (car elt))
+        ;; Don't let failure of activation of a package arbitrarily stop
+        ;; activation of further packages.
+        (error (message "%s" (error-message-string err)))))
+    (setq package--fastpath-pkgs (nreverse package--fastpath-pkgs))
+    (with-temp-file package-fastpath-file
+      (emacs-lisp-mode)
+      (insert ";;; FastPath file to speed up package activation at startup  -*- lexical-binding:t -*-\n")
+      (insert ";; ¡¡ This file is autogenerated, DO NOT EDIT !!\n\n")
+      (dolist (pkg package--fastpath-pkgs)
+        (let* ((file
+                ;; Prefer uncompiled files (and don't accept .so files).
+                (let ((load-suffixes '(".el" ".elc")))
+                  (locate-library (package--autoloads-file-name pkg))))
+               (pfile (prin1-to-string file)))
+          (insert "(let ((load-file-name " pfile "))\n")
+          (insert-file-contents file)
+          ;; FIXME: We also need to setup the Info-directory-list!
+          (while (search-forward "#$" nil 'move)
+            (unless (nth 8 (syntax-ppss))
+              (replace-match pfile t t)))
+          (unless (bolp) (insert "\n"))
+          (insert ")\n")))
+      (pp `(setq package-activated-list
+                 (append ',(mapcar #'package-desc-name package--fastpath-pkgs)
+                         package-activated-list))
+          (current-buffer))
+      (let ((info-dirs (butlast Info-directory-list)))
+        (when info-dirs
+          (pp `(progn (require 'info)
+                      (info-initialize)
+                      (setq Info-directory-list
+                            (append ',info-dirs Info-directory-list)))
+              (current-buffer))))
+      ;; Use `\s' instead of a space character, so this code chunk is not
+      ;; mistaken for an actual file-local section of package.el.
+      (insert "\f
+;; Local\sVariables:
+;; version-control: never
+;; no-byte-compile: nil
+;; no-update-autoloads: t
+;; End:
+"))))
+
 (provide 'package)
 
 ;;; package.el ends here

[-- Attachment #3: Stefan's 2nd patch for package.el (25.3 stable version) --]
[-- Type: text/x-patch, Size: 4097 bytes --]

diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 32200227de..cbb326f26e 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -656,6 +656,8 @@ PKG-DESC is a `package-desc' object."
 (defvar Info-directory-list)
 (declare-function info-initialize "info" ())
 
+(defvar package--fastpath-pkgs t)
+
 (defun package--load-files-for-activation (pkg-desc reload)
   "Load files for activating a package given by PKG-DESC.
 Load the autoloads file, and ensure `load-path' is setup.  If
@@ -696,7 +698,10 @@ correspond to previously loaded files (those returned by
         (unless (package-activate (car req))
           (error "Unable to activate package `%s'.\nRequired package `%s-%s' is unavailable"
                  name (car req) (package-version-join (cadr req))))))
-    (package--load-files-for-activation pkg-desc reload)
+    (if (listp package--fastpath-pkgs)
+        ;; We're only collecting the set of packages to activate!
+        (push pkg-desc package--fastpath-pkgs)
+      (package--load-files-for-activation pkg-desc reload))
     ;; Add info node.
     (when (file-exists-p (expand-file-name "dir" pkg-dir))
       ;; FIXME: not the friendliest, but simple.
@@ -3437,6 +3442,67 @@ The list is displayed in a buffer named `*Packages*'."
   (interactive)
   (list-packages t))
 
+;;;; Fast-path for activation!
+
+(defcustom package-fastpath-file (locate-user-emacs-file "package-fastpath.el")
+  "Location of the file used to speed up activation of packages at startup."
+  :type 'file)
+
+(defun package-fastpath-refresh ()
+  "(Re)Generate the `package-fastpath-file'."
+  (interactive)
+  (package-initialize 'no-activate)
+  (require 'info)
+  (let ((package--fastpath-pkgs ())
+        ;; Pretend we haven't activated anything yet!
+        (package-activated-list ())
+        (Info-directory-list '("")))
+    (dolist (elt package-alist)
+      (condition-case err
+          (package-activate (car elt))
+        ;; Don't let failure of activation of a package arbitrarily stop
+        ;; activation of further packages.
+        (error (message "%s" (error-message-string err)))))
+    (setq package--fastpath-pkgs (nreverse package--fastpath-pkgs))
+    (with-temp-file package-fastpath-file
+      (emacs-lisp-mode)
+      (insert ";;; FastPath file to speed up package activation at startup  -*- lexical-binding:t -*-\n")
+      (insert ";; ¡¡ This file is autogenerated, DO NOT EDIT !!\n\n")
+      (dolist (pkg package--fastpath-pkgs)
+        (let* ((file
+                ;; Prefer uncompiled files (and don't accept .so files).
+                (let ((load-suffixes '(".el" ".elc")))
+                  (locate-library (package--autoloads-file-name pkg))))
+               (pfile (prin1-to-string file)))
+          (insert "(let ((load-file-name " pfile "))\n")
+          (insert-file-contents file)
+          ;; FIXME: We also need to setup the Info-directory-list!
+          (while (search-forward "#$" nil 'move)
+            (unless (nth 8 (syntax-ppss))
+              (replace-match pfile t t)))
+          (unless (bolp) (insert "\n"))
+          (insert ")\n")))
+      (pp `(setq package-activated-list
+                 (append ',(mapcar #'package-desc-name package--fastpath-pkgs)
+                         package-activated-list))
+          (current-buffer))
+      (let ((info-dirs (butlast Info-directory-list)))
+        (when info-dirs
+          (pp `(progn (require 'info)
+                      (info-initialize)
+                      (setq Info-directory-list
+                            (append ',info-dirs Info-directory-list)))
+              (current-buffer))))
+      ;; Use `\s' instead of a space character, so this code chunk is not
+      ;; mistaken for an actual file-local section of package.el.
+      (insert "\f
+;; Local\sVariables:
+;; version-control: never
+;; no-byte-compile: nil
+;; no-update-autoloads: t
+;; End:
+"))))
+
 (provide 'package)
 
 ;;; package.el ends here

^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-10 23:37                         ` Stefan Monnier
@ 2018-02-11  3:26                           ` Radon Rosborough
  2018-02-11 14:45                             ` Stefan Monnier
  2018-02-11 13:31                           ` Basil L. Contovounesios
  1 sibling, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2018-02-11  3:26 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> [ ...looking up package-initialize... ] OMG, you're right
> it's interactive.  Does it make sense to use it interactively, really?

Yes, I've done so dozens of times when I'm testing package.el. The
purpose of the command is to activate all installed packages, without
doing anything else. And that's what I use it for (as someone who
disables `package-enable-at-startup').



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-10 23:37                         ` Stefan Monnier
  2018-02-11  3:26                           ` Radon Rosborough
@ 2018-02-11 13:31                           ` Basil L. Contovounesios
  1 sibling, 0 replies; 838+ messages in thread
From: Basil L. Contovounesios @ 2018-02-11 13:31 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

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

> [ ...looking up package-initialize... ] OMG, you're right
> it's interactive.  Does it make sense to use it interactively, really?

Judging from personal experience, I would guess the main users of its
interactivity are those working on or debugging packages following an
emacs -Q, which in some work sessions can happen multiple times (until
they cop on and try to automate this, that is :).

Apart from backward compatibility and M-x p-ini RET being slightly
faster than M-: M-( p-ini RET in these cases, I don't think there is
much else to be said for it.

-- 
Basil



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-11  3:26                           ` Radon Rosborough
@ 2018-02-11 14:45                             ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-11 14:45 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: emacs-devel

>> [ ...looking up package-initialize... ] OMG, you're right
>> it's interactive.  Does it make sense to use it interactively, really?
> Yes, I've done so dozens of times when I'm testing package.el.

I consider that for such purposes `M-: (package-initialize) RET` (or the
same done from IELM) is quite sufficient.

"Use it interactively" here is meant for "normal users", not for someone
hacking on package.el.

> The purpose of the command is to activate all installed packages,
> without doing anything else.

Actually, it has 2 purposes.  Activating the packages is only one of
the two: in order to speed up startup by caching the autoloads like
I do in my package-fastpath patch, we will need to separate those
two purposes.


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Stefan's patch to improve package loading (was Loading a package applies automatically to future sessions?)
  2018-02-11  1:23                                   ` George Plymale II
@ 2018-02-13 21:14                                     ` George Plymale II
  2018-02-14  2:56                                       ` John Wiegley
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-13 21:14 UTC (permalink / raw)
  To: George Plymale II; +Cc: eliz, radon.neon, monnier, emacs-devel

Hi again,

Does anyone mind if I start a new thread with a new subject line? I
would like to continue discussion of Stefan's patch and improving the
loading of packages in Emacs on this list, but since the thread entitled
"Loading a package applies automatically to future sessions?" diverged
into copyright debates, I thought perhaps we should make a new thread
that specifically discusses Stefan's patches mentioned previously. It
should make things more organized and more easily searchable. Is anyone
opposed to this?

- George Plymale II



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Stefan's patch to improve package loading (was Loading a package applies automatically to future sessions?)
  2018-02-13 21:14                                     ` Stefan's patch to improve package loading (was Loading a package applies automatically to future sessions?) George Plymale II
@ 2018-02-14  2:56                                       ` John Wiegley
  2018-02-14 23:32                                         ` George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: John Wiegley @ 2018-02-14  2:56 UTC (permalink / raw)
  To: George Plymale II; +Cc: eliz, radon.neon, monnier, emacs-devel

>>>>> "GP" == George Plymale <georgedp@orbitalimpact.com> writes:

GP> Does anyone mind if I start a new thread with a new subject line? I would
GP> like to continue discussion of Stefan's patch and improving the loading of
GP> packages in Emacs on this list, but since the thread entitled "Loading a
GP> package applies automatically to future sessions?" diverged into copyright
GP> debates, I thought perhaps we should make a new thread that specifically
GP> discusses Stefan's patches mentioned previously. It should make things
GP> more organized and more easily searchable. Is anyone opposed to this?

This is actually standard practice nowadays. Just create a new thread exactly
as you've done, and propose the new discussion topic.

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-02  9:39                                                                       ` Eli Zaretskii
                                                                                           ` (2 preceding siblings ...)
  2018-02-02 22:56                                                                         ` Richard Stallman
@ 2018-02-14 22:28                                                                         ` Richard Stallman
  2018-02-14 23:18                                                                           ` George Plymale II
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2018-02-14 22:28 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: stephen.berman, emacs-devel, georgedp, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

The FSF staff checked.  We have not included that 30-day notice
provision in our copyright assignments since some time before 2000.
(They didn't check further back than that.)  The assignments since
then give the contributor unlimited nonexclusive rights starting
immediately.

-- 
Dr Richard Stallman
President, Free Software Foundation (https://gnu.org, https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)
Skype: No way! See https://stallman.org/skype.html.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-14 22:28                                                                         ` Richard Stallman
@ 2018-02-14 23:18                                                                           ` George Plymale II
  0 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-02-14 23:18 UTC (permalink / raw)
  To: rms; +Cc: eliz, stephen.berman, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> The FSF staff checked.  We have not included that 30-day notice
> provision in our copyright assignments since some time before 2000.
> (They didn't check further back than that.)  The assignments since
> then give the contributor unlimited nonexclusive rights starting
> immediately.

Ok, thank you very much for providing that information.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Stefan's patch to improve package loading (was Loading a package applies automatically to future sessions?)
  2018-02-14  2:56                                       ` John Wiegley
@ 2018-02-14 23:32                                         ` George Plymale II
  2018-03-09  2:54                                           ` Stefan's patch to improve package loading George Plymale II
  0 siblings, 1 reply; 838+ messages in thread
From: George Plymale II @ 2018-02-14 23:32 UTC (permalink / raw)
  To: John Wiegley; +Cc: eliz, radon.neon, monnier, emacs-devel

"John Wiegley" <johnw@gnu.org> writes:

> This is actually standard practice nowadays. Just create a new thread exactly
> as you've done, and propose the new discussion topic.

Ok, great. Thanks for letting me know.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-10 11:56                       ` Eli Zaretskii
  2018-02-10 23:37                         ` Stefan Monnier
@ 2018-02-15  4:38                         ` Radon Rosborough
  2018-02-15 15:54                           ` Drew Adams
  2018-02-17 11:38                           ` Eli Zaretskii
  1 sibling, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-02-15  4:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Clément Pit-Claudel, Stefan Monnier, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 1444 bytes --]

Unless otherwise noted, I have integrated your comments, Eli. Let
me know if more changes are needed before merging.

I also noticed that the startup summary was not updated to reflect
the early init file and new timing of `package-initialize'. That's fixed
now.

> Btw, is it only looked up in .emacs.d, or also in the directory where
> .emacs is searched (which could be just the home directory)?

No, since .emacs is deprecated in favor of ~/.emacs.d/init.el.

> This is for users, so it should be in the user manual, not in ELisp
> manual.

While re-adding the index entry for `package-initialize', I also partially
re-added the paragraph on `package-initialize' in the user manual. The
user manual now documents `package-initialize' as only something
that is useful to call if you set `package-enable-at-startup' to nil, so
this
paragraph is not really needed in the user manual. I think it is still
useful to have it in the Elisp manual, since unlike the user manual, the
Elisp manual actually does document `package-initialize' in some
detail, so users might be misled into thinking that it is a useful function
when in fact they probably should not be using it.

> Why was this hunk necessary?

Because the description was wrong and needed to be removed. It
advised that users call `package-initialize' in their init file, which is
wrong advice if `package-initialize' is called automatically before
loading the init file.

Best,
Radon

[-- Attachment #1.2: Type: text/html, Size: 3279 bytes --]

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 38832 bytes --]

From aaf0192d3da753df1f5e0dab1907affc719e191c Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Dec 2017 17:31:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* lisp/startup.el (early-init-file): New variable.
(load-user-init-file): New function.
(command-line): Load the early init file using `load-user-init-file'.
Move the check for an invalid username to just before that, and move
the initialization of the package system to just after.  Load the
regular init file using `load-user-init-file'.

* src/lread.c (Vuser_init_file): Note change in semantics due to its
usage while loading the early init file.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove
definition, usage, and documentation.
(package--init-file-ensured): Remove definition and usage.

* doc/emacs/custom.texi: Document early init file.

* doc/lispref/os.texi: Document early init file.  Update startup
summary.

* doc/lispref/package.texi: Document changes to when
package-initialize is called, and advise against calling it in the
init file.  Change terminology for package 'loading'.

* doc/emacs/package.texi: Document changes to when package-initialize
is called.  Change terminology for package 'loading'.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
init file.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00599.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00332.html
---
 doc/emacs/custom.texi      |  17 ++
 doc/emacs/package.texi     |  78 +++++-----
 doc/lispref/os.texi        |  38 +++--
 doc/lispref/package.texi   |  30 ++--
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  19 +++
 lisp/emacs-lisp/package.el |  71 +--------
 lisp/startup.el            | 379 ++++++++++++++++++++++++---------------------
 src/lread.c                |   2 +-
 9 files changed, 331 insertions(+), 307 deletions(-)

diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index e27760b379..263dff7cb0 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -2575,3 +2575,20 @@ Init Non-ASCII
 coding system, for your init file as well as the files you edit.  For
 example, don't mix the @samp{latin-1} and @samp{latin-9} coding
 systems.
+
+@node Early Init File
+@subsection The Early Init File
+@cindex early init file
+
+  Most customizations for Emacs can be put in the normal init file,
+@file{.emacs} or @file{~/.emacs.d/init.el}.  However, it is sometimes
+desirable to have customizations that take effect during Emacs startup
+earlier than the normal init file is processed.  Such customizations
+can be put in the early init file, @file{~/.emacs.d/early-init.el}.
+This file is loaded before the package system is initialized, so in it
+you can customize variables that affect the initialization process,
+such as @code{package-enable-at-startup} and @code{package-load-list}.
+@xref{Package Installation}.
+
+  For more information on the early init file, @pxref{Early Init
+File,,, elisp, The Emacs Lisp Reference Manual}.
diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index bc6afb7966..d5339e9124 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -241,57 +241,55 @@ Package Installation
 package is available from a higher-priority archive.  (This is
 controlled by the value of @code{package-menu-hide-low-priority}.)
 
-  Once a package is downloaded and installed, it is @dfn{loaded} into
-the current Emacs session.  Loading a package is not quite the same as
-loading a Lisp library (@pxref{Lisp Libraries}); loading a package
-adds its directory to @code{load-path} and loads its autoloads.  The
-effect of a package's autoloads varies from package to package.  Most
-packages just make some new commands available, while others have more
+  Once a package is downloaded and installed, it is made available to
+the current Emacs session.  Making a package available adds its
+directory to @code{load-path} and loads its autoloads.  The effect of
+a package's autoloads varies from package to package.  Most packages
+just make some new commands available, while others have more
 wide-ranging effects on the Emacs session.  For such information,
 consult the package's help buffer.
 
-  By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+  After a package is installed, it is automatically made available by
+Emacs in all subsequent sessions.  This happens at startup, before
+processing the init file but after processing the early init file
+(@pxref{Early Init File,,, elisp, The Emacs Lisp Reference Manual}).
+As an exception, Emacs does not make packages available at startup if
+invoked with the @samp{-q} or @samp{--no-init-file} options
+(@xref{Initial Options}).
 
 @vindex package-enable-at-startup
-  To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
+  To keep Emacs from automatically making packages available at
+startup, change the variable @code{package-enable-at-startup} to
+@code{nil}.  You must do this in the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}), as the variable
+is read before loading the regular init file.  Currently this variable
+cannot be set via Customize.
 
 @findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+  If you have set @code{package-enable-at-startup} to @code{nil}, you
+can still make packages available either during or after startup.  To
+make installed packages available during startup, call the function
+@code{package-initialize} in your init file.  To make installed
+packages available after startup, invoke the command @kbd{M-x
+package-initialize}.
 
 @vindex package-load-list
-  For finer control over package loading, you can use the variable
-@code{package-load-list}.  Its value should be a list.  A list element
-of the form @code{(@var{name} @var{version})} tells Emacs to load
-version @var{version} of the package named @var{name}.  Here,
-@var{version} should be a version string (corresponding to a specific
-version of the package), or @code{t} (which means to load any
-installed version), or @code{nil} (which means no version; this
-disables the package, preventing it from being loaded).  A list
-element can also be the symbol @code{all}, which means to load the
-latest installed version of any package not named by the other list
-elements.  The default value is just @code{'(all)}.
+  For finer control over which packages are made available at startup,
+you can use the variable @code{package-load-list}.  Its value should
+be a list.  A list element of the form @code{(@var{name}
+@var{version})} tells Emacs to make available version @var{version} of
+the package named @var{name}.  Here, @var{version} should be a version
+string (corresponding to a specific version of the package), or
+@code{t} (which means to make available any installed version), or
+@code{nil} (which means no version; this disables the package,
+preventing it from being made available).  A list element can also be
+the symbol @code{all}, which means to make available the latest
+installed version of any package not named by the other list elements.
+The default value is just @code{'(all)}.
 
   For example, if you set @code{package-load-list} to @code{'((muse
-"3.20") all)}, then Emacs only loads version 3.20 of the @samp{muse}
-package, plus any installed version of packages other than
+"3.20") all)}, then Emacs only makes available version 3.20 of the
+@samp{muse} package, plus any installed version of packages other than
 @samp{muse}.  Any other version of @samp{muse} that happens to be
 installed will be ignored.  The @samp{muse} package will be listed in
 the package menu with the @samp{held} status.
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 42be60449d..cac5bfa067 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -95,6 +95,21 @@ Startup Summary
 @item
 It does some basic parsing of the command-line arguments.
 
+@item
+It loads your early init file (@pxref{Early Init File}).  This is not
+done if the options @samp{-q}, @samp{-Q}, or @samp{--batch} were
+specified.  If the @samp{-u} option was specified, Emacs looks for the
+init file in that user's home directory instead.
+
+@item
+It calls the function @code{package-initialize} to activate any
+optional Emacs Lisp package that has been installed.  @xref{Packaging
+Basics}.  However, Emacs doesn't initialize packages when
+@code{package-enable-at-startup} is @code{nil} or when it's started
+with one of the options @samp{-q}, @samp{-Q}, or @samp{--batch}.  To
+initialize packages in the latter case, @code{package-initialize}
+should be called explicitly (e.g., via the @samp{--funcall} option).
+
 @vindex initial-window-system@r{, and startup}
 @vindex window-system-initialization-alist
 @item
@@ -154,15 +169,6 @@ Startup Summary
 (@pxref{Abbrev Files, abbrev-file-name}).  This is not done if the
 option @samp{--batch} was specified.
 
-@item
-It calls the function @code{package-initialize} to activate any
-optional Emacs Lisp package that has been installed.  @xref{Packaging
-Basics}.  However, Emacs doesn't initialize packages when
-@code{package-enable-at-startup} is @code{nil} or when it's started
-with one of the options @samp{-q}, @samp{-Q}, or @samp{--batch}.  To
-initialize packages in the latter case, @code{package-initialize}
-should be called explicitly (e.g., via the @samp{--funcall} option).
-
 @vindex after-init-time
 @item
 It sets the variable @code{after-init-time} to the value of
@@ -361,6 +367,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +391,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+@dfn{early init file}, if it exists.  This is a file named
+@file{early-init.el} in your @file{~/.emacs.d} directory.  The
+difference between the early init file and the regular init file is
+that the early init file is loaded much earlier during the startup
+process, so you can use it to customize some things that are
+initialized before loading the regular init file.  For example, you
+can customize the process of initializing the package system, by
+setting variables such as @var{package-load-list} or
+@var{package-enable-at-startup}. @xref{Package Installation,,,
+emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 21dfe1c271..877aaf89a3 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -105,24 +105,32 @@ Packaging Basics
 evaluates the autoload definitions in @file{@var{name}-autoloads.el}.
 
   Whenever Emacs starts up, it automatically calls the function
-@code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+@code{package-initialize} to make installed packages available to the
+current session.  This is done after loading the early init file, but
+before loading the regular init file (@pxref{Startup Summary}).
+Packages are not automatically made available if the user option
+@code{package-enable-at-startup} is set to @code{nil} in the early
+init file.
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
-installed, and loads them.  The user option @code{package-load-list}
-specifies which packages to load; by default, all installed packages
-are loaded.  If called during startup, this function also sets
+installed, and makes the packages available to the current session.
+The user option @code{package-load-list} specifies which packages to
+make available; by default, all installed packages are made available.
+If called during startup, this function also sets
 @code{package-enable-at-startup} to @code{nil}, to avoid accidentally
-loading the packages twice.  @xref{Package Installation,,, emacs, The
-GNU Emacs Manual}.
+evaluating package autoloads more than once.  @xref{Package
+Installation,,, emacs, The GNU Emacs Manual}.
 
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
-loading them; it is for internal use only.
+making them available; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after it in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index aa3b029ab7..68aa01ca18 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -890,9 +890,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index 71569c95ad..b6b884b816 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -49,6 +49,25 @@ to reduce differences between developer and production builds.
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called 'early-init.el', in 'user-emacs-directory'.  It is
+loaded very early in the startup process: before graphical elements
+such as the tool bar are initialized, and before the package manager
+is initialized.  The primary purpose is to allow customizing how the
+package system is initialized given that initialization now happens
+before loading the regular init file (see below).
+
++++
+** Emacs now calls 'package-initialize' before loading the init file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to 'package-initialize' into the init
+file, which was previously done when Emacs was started.  As a result
+of this change, it is no longer necessary to call 'package-initialize'
+in your init file.  However, if your init file changes the values of
+'package-load-list' or 'package-user-dir', then that code needs to be
+moved to the early init file (see above).
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 71d1c41ec3..ab02d4255b 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1431,16 +1431,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1449,13 +1444,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1872,64 +1861,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 8c36c19e82..69bc8fa781 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -312,6 +312,12 @@ inhibit-startup-hooks
 Currently this applies to: `emacs-startup-hook', `term-setup-hook',
 and `window-setup-hook'.")
 
+(defvar early-init-file nil
+  "File name, including directory, of user's early init file.
+See `user-init-file'.  The only difference is that
+`early-init-file' is not set during the course of evaluating the
+early init file.")
+
 (defvar keyboard-type nil
   "The brand of keyboard you are using.
 This variable is used to define the proper function and keypad
@@ -870,6 +876,103 @@ startup--setup-quote-display
           (when standard-display-table
             (aset standard-display-table char nil)))))))
 
+(defun load-user-init-file
+    (filename-function &optional alternate-filename-function load-defaults)
+  "Load a user init-file.
+FILENAME-FUNCTION is called with no arguments and should return
+the name of the init-file to load.  If this file cannot be
+loaded, and ALTERNATE-FILENAME-FUNCTION is non-nil, then it is
+called with no arguments and should return the name of an
+alternate init-file to load.  If LOAD-DEFAULTS is non-nil, then
+load default.el after the init-file.
+
+This function sets `user-init-file' to the name of the loaded
+init-file, or to a default value if loading is not possible."
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial
+         (if (eq init-file-debug t)
+             'startup
+           init-file-debug)))
+    (let ((debug-on-error debug-on-error-initial)
+          ;; We create an anonymous function here so that we can call
+          ;; it in different contexts depending on the value of
+          ;; `debug-on-error'.
+          (read-init-file
+           (lambda ()
+             (when init-file-user
+               (let ((init-file-name (funcall filename-function)))
+
+                 ;; If `user-init-file' is t, then `load' will store
+                 ;; the name of the file that it loads into
+                 ;; `user-init-file'.
+                 (setq user-init-file t)
+                 (load init-file-name 'noerror 'nomessage)
+
+                 (when (and (eq user-init-file t) alternate-filename-function)
+                   (load (funcall alternate-filename-function)
+                         'noerror 'nomessage))
+
+                 ;; If we did not find the user's init file, set
+                 ;; user-init-file conclusively.  Don't let it be
+                 ;; set from default.el.
+                 (when (eq user-init-file t)
+                   (setq user-init-file init-file-name)))
+
+               ;; If we loaded a compiled file, set `user-init-file' to
+               ;; the source version if that exists.
+               (when (equal (file-name-extension user-init-file)
+                            "elc")
+                 (let* ((source (file-name-sans-extension user-init-file))
+                        (alt (concat source ".el")))
+                   (setq source (cond ((file-exists-p alt) alt)
+                                      ((file-exists-p source) source)
+                                      (t nil)))
+                   (when source
+                     (when (file-newer-than-file-p source user-init-file)
+                       (message "Warning: %s is newer than %s"
+                                source user-init-file)
+                       (sit-for 1))
+                     (setq user-init-file source))))
+
+               (when load-defaults
+
+                 ;; Prevent default.el from changing the value of
+                 ;; `inhibit-startup-screen'.
+                 (let ((inhibit-startup-screen nil))
+                   (load "default" 'noerror 'nomessage)))))))
+      ;; Now call our anonymous function.
+      (if init-file-debug
+          ;; Do this without a `condition-case' if the user wants to
+          ;; debug.
+          (funcall read-init-file)
+        (condition-case error
+            (funcall read-init-file)
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+
+      ;; If we can tell that the init file altered debug-on-error,
+      ;; arrange to preserve the value that it set up.
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+
+    (when debug-on-error-should-be-set
+      (setq debug-on-error debug-on-error-from-init-file))))
+
 (defun command-line ()
   "A subroutine of `normal-top-level'.
 Amongst another things, it parses the command-line arguments."
@@ -1021,6 +1124,69 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (load-user-init-file
+   (lambda ()
+     (expand-file-name
+      "early-init"
+      (file-name-as-directory
+       (concat "~" init-file-user "/.emacs.d")))))
+  (setq early-init-file user-init-file)
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1128,153 +1294,47 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
-    (let (debug-on-error-from-init-file
-	  debug-on-error-should-be-set
-	  (debug-on-error-initial
-	   (if (eq init-file-debug t) 'startup init-file-debug)))
-      (let ((debug-on-error debug-on-error-initial)
-	    ;; This function actually reads the init files.
-	    (inner
-	     (function
-	      (lambda ()
-		(if init-file-user
-		    (let ((user-init-file-1
-			   (cond
-			     ((eq system-type 'ms-dos)
-			      (concat "~" init-file-user "/_emacs"))
-			     ((not (eq system-type 'windows-nt))
-			      (concat "~" init-file-user "/.emacs"))
-			     ;; Else deal with the Windows situation
-			     ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
-			      ;; Prefer .emacs on Windows.
-			      "~/.emacs")
-			     ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
-			      ;; Also support _emacs for compatibility, but warn about it.
-			      (push `(initialization
-				      ,(format-message
-					"`_emacs' init file is deprecated, please use `.emacs'"))
-				    delayed-warnings-list)
-			      "~/_emacs")
-			     (t ;; But default to .emacs if _emacs does not exist.
-			      "~/.emacs"))))
-		      ;; This tells `load' to store the file name found
-		      ;; into user-init-file.
-		      (setq user-init-file t)
-		      (load user-init-file-1 t t)
-
-		      (when (eq user-init-file t)
-			;; If we did not find ~/.emacs, try
-			;; ~/.emacs.d/init.el.
-			(let ((otherfile
-			       (expand-file-name
-				"init"
-				(file-name-as-directory
-				 (concat "~" init-file-user "/.emacs.d")))))
-			  (load otherfile t t)
-
-			  ;; If we did not find the user's init file,
-			  ;; set user-init-file conclusively.
-			  ;; Don't let it be set from default.el.
-			  (when (eq user-init-file t)
-			    (setq user-init-file user-init-file-1))))
-
-		      ;; If we loaded a compiled file, set
-		      ;; `user-init-file' to the source version if that
-		      ;; exists.
-		      (when (and user-init-file
-				 (equal (file-name-extension user-init-file)
-					"elc"))
-			(let* ((source (file-name-sans-extension user-init-file))
-			       (alt (concat source ".el")))
-			  (setq source (cond ((file-exists-p alt) alt)
-					     ((file-exists-p source) source)
-					     (t nil)))
-			  (when source
-			    (when (file-newer-than-file-p source user-init-file)
-			      (message "Warning: %s is newer than %s"
-				       source user-init-file)
-			      (sit-for 1))
-			    (setq user-init-file source))))
-
-		      (unless inhibit-default-init
-                        (let ((inhibit-startup-screen nil))
-                          ;; Users are supposed to be told their rights.
-                          ;; (Plus how to get help and how to undo.)
-                          ;; Don't you dare turn this off for anyone
-                          ;; except yourself.
-                          (load "default" t t)))))))))
-	(if init-file-debug
-	    ;; Do this without a condition-case if the user wants to debug.
-	    (funcall inner)
-	  (condition-case error
-	      (progn
-		(funcall inner)
-		(setq init-file-had-error nil))
-	    (error
-	     (display-warning
-	      'initialization
-	      (format-message "\
-An error occurred while loading `%s':\n\n%s%s%s\n\n\
-To ensure normal operation, you should investigate and remove the
-cause of the error in your initialization file.  Start Emacs with
-the `--debug-init' option to view a complete error backtrace."
-		      user-init-file
-		      (get (car error) 'error-message)
-		      (if (cdr error) ": " "")
-		      (mapconcat (lambda (s) (prin1-to-string s t))
-				 (cdr error) ", "))
-	      :warning)
-	     (setq init-file-had-error t))))
-
-      (if (and deactivate-mark transient-mark-mode)
-	    (with-current-buffer (window-buffer)
-	      (deactivate-mark)))
-
-	;; If the user has a file of abbrevs, read it (unless -batch).
-	(when (and (not noninteractive)
-		   (file-exists-p abbrev-file-name)
-		   (file-readable-p abbrev-file-name))
-	    (quietly-read-abbrev-file abbrev-file-name))
-
-	;; If the abbrevs came entirely from the init file or the
-	;; abbrevs file, they do not need saving.
-	(setq abbrevs-changed nil)
-
-	;; If we can tell that the init file altered debug-on-error,
-	;; arrange to preserve the value that it set up.
-	(or (eq debug-on-error debug-on-error-initial)
-	    (setq debug-on-error-should-be-set t
-		  debug-on-error-from-init-file debug-on-error)))
-      (if debug-on-error-should-be-set
-	  (setq debug-on-error debug-on-error-from-init-file)))
+    (load-user-init-file
+     (lambda ()
+       (cond
+        ((eq system-type 'ms-dos)
+         (concat "~" init-file-user "/_emacs"))
+        ((not (eq system-type 'windows-nt))
+         (concat "~" init-file-user "/.emacs"))
+        ;; Else deal with the Windows situation.
+        ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
+         ;; Prefer .emacs on Windows.
+         "~/.emacs")
+        ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
+         ;; Also support _emacs for compatibility, but warn about it.
+         (push `(initialization
+                 ,(format-message
+                   "`_emacs' init file is deprecated, please use `.emacs'"))
+               delayed-warnings-list)
+         "~/_emacs")
+        (t ;; But default to .emacs if _emacs does not exist.
+         "~/.emacs")))
+     (lambda ()
+       (expand-file-name
+        "init"
+        (file-name-as-directory
+         (concat "~" init-file-user "/.emacs.d"))))
+     (not inhibit-default-init))
+
+    (when (and deactivate-mark transient-mark-mode)
+      (with-current-buffer (window-buffer)
+        (deactivate-mark)))
+
+    ;; If the user has a file of abbrevs, read it (unless -batch).
+    (when (and (not noninteractive)
+               (file-exists-p abbrev-file-name)
+               (file-readable-p abbrev-file-name))
+      (quietly-read-abbrev-file abbrev-file-name))
+
+    ;; If the abbrevs came entirely from the init file or the
+    ;; abbrevs file, they do not need saving.
+    (setq abbrevs-changed nil)
 
     ;; Do this here in case the init file sets mail-host-address.
     (and mail-host-address
@@ -1296,33 +1356,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
diff --git a/src/lread.c b/src/lread.c
index 7cacd47d51..d009bd0cd2 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4922,7 +4922,7 @@ directory.  These file names are converted to absolute at startup.  */);
 If the file loaded had extension `.elc', and the corresponding source file
 exists, this variable contains the name of source file, suitable for use
 by functions like `custom-save-all' which edit the init file.
-While Emacs loads and evaluates the init file, value is the real name
+While Emacs loads and evaluates any init file, value is the real name
 of the file, regardless of whether or not it has the `.elc' extension.  */);
   Vuser_init_file = Qnil;
 
-- 
2.16.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Loading a package applies automatically to future sessions?
  2018-02-10 12:00                                 ` Eli Zaretskii
  2018-02-11  1:23                                   ` George Plymale II
@ 2018-02-15  4:40                                   ` Radon Rosborough
  1 sibling, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-02-15  4:40 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: rms, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 328 bytes --]

> Thanks.  It looks like all of those places are related to package.el,
> so could you please take care of clarifying the issue as part of your
> patch?  Most of those places are touched by your patch anyway.

I have done this; the patch and my comments are in the main thread.
For convenience, the patch is also attached here.

[-- Attachment #1.2: Type: text/html, Size: 596 bytes --]

[-- Attachment #2: 0001-Add-early-init-file-stop-package-initialize-insertio.patch --]
[-- Type: application/octet-stream, Size: 38832 bytes --]

From aaf0192d3da753df1f5e0dab1907affc719e191c Mon Sep 17 00:00:00 2001
From: Radon Rosborough <radon.neon@gmail.com>
Date: Sun, 17 Dec 2017 17:31:17 -0700
Subject: [PATCH] Add early init file, stop package-initialize insertion

* lisp/startup.el (early-init-file): New variable.
(load-user-init-file): New function.
(command-line): Load the early init file using `load-user-init-file'.
Move the check for an invalid username to just before that, and move
the initialization of the package system to just after.  Load the
regular init file using `load-user-init-file'.

* src/lread.c (Vuser_init_file): Note change in semantics due to its
usage while loading the early init file.

* lisp/emacs-lisp/package.el (package--ensure-init-file): Remove
definition, usage, and documentation.
(package--init-file-ensured): Remove definition and usage.

* doc/emacs/custom.texi: Document early init file.

* doc/lispref/os.texi: Document early init file.  Update startup
summary.

* doc/lispref/package.texi: Document changes to when
package-initialize is called, and advise against calling it in the
init file.  Change terminology for package 'loading'.

* doc/emacs/package.texi: Document changes to when package-initialize
is called.  Change terminology for package 'loading'.

* doc/misc/org.texi: Don't recommend to call package-initialize in the
init file.

Discussion on emacs-devel leading up to this change (approximately 150
messages):

- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00154.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-08/msg00433.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00023.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-09/msg00599.html
- https://lists.gnu.org/archive/html/emacs-devel/2017-10/msg00332.html
---
 doc/emacs/custom.texi      |  17 ++
 doc/emacs/package.texi     |  78 +++++-----
 doc/lispref/os.texi        |  38 +++--
 doc/lispref/package.texi   |  30 ++--
 doc/misc/org.texi          |   4 +-
 etc/NEWS                   |  19 +++
 lisp/emacs-lisp/package.el |  71 +--------
 lisp/startup.el            | 379 ++++++++++++++++++++++++---------------------
 src/lread.c                |   2 +-
 9 files changed, 331 insertions(+), 307 deletions(-)

diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index e27760b379..263dff7cb0 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -2575,3 +2575,20 @@ Init Non-ASCII
 coding system, for your init file as well as the files you edit.  For
 example, don't mix the @samp{latin-1} and @samp{latin-9} coding
 systems.
+
+@node Early Init File
+@subsection The Early Init File
+@cindex early init file
+
+  Most customizations for Emacs can be put in the normal init file,
+@file{.emacs} or @file{~/.emacs.d/init.el}.  However, it is sometimes
+desirable to have customizations that take effect during Emacs startup
+earlier than the normal init file is processed.  Such customizations
+can be put in the early init file, @file{~/.emacs.d/early-init.el}.
+This file is loaded before the package system is initialized, so in it
+you can customize variables that affect the initialization process,
+such as @code{package-enable-at-startup} and @code{package-load-list}.
+@xref{Package Installation}.
+
+  For more information on the early init file, @pxref{Early Init
+File,,, elisp, The Emacs Lisp Reference Manual}.
diff --git a/doc/emacs/package.texi b/doc/emacs/package.texi
index bc6afb7966..d5339e9124 100644
--- a/doc/emacs/package.texi
+++ b/doc/emacs/package.texi
@@ -241,57 +241,55 @@ Package Installation
 package is available from a higher-priority archive.  (This is
 controlled by the value of @code{package-menu-hide-low-priority}.)
 
-  Once a package is downloaded and installed, it is @dfn{loaded} into
-the current Emacs session.  Loading a package is not quite the same as
-loading a Lisp library (@pxref{Lisp Libraries}); loading a package
-adds its directory to @code{load-path} and loads its autoloads.  The
-effect of a package's autoloads varies from package to package.  Most
-packages just make some new commands available, while others have more
+  Once a package is downloaded and installed, it is made available to
+the current Emacs session.  Making a package available adds its
+directory to @code{load-path} and loads its autoloads.  The effect of
+a package's autoloads varies from package to package.  Most packages
+just make some new commands available, while others have more
 wide-ranging effects on the Emacs session.  For such information,
 consult the package's help buffer.
 
-  By default, Emacs also automatically loads all installed packages in
-subsequent Emacs sessions.  This happens at startup, after processing
-the init file (@pxref{Init File}).  As an exception, Emacs does not
-load packages at startup if invoked with the @samp{-q} or
-@samp{--no-init-file} options (@pxref{Initial Options}).
+  After a package is installed, it is automatically made available by
+Emacs in all subsequent sessions.  This happens at startup, before
+processing the init file but after processing the early init file
+(@pxref{Early Init File,,, elisp, The Emacs Lisp Reference Manual}).
+As an exception, Emacs does not make packages available at startup if
+invoked with the @samp{-q} or @samp{--no-init-file} options
+(@xref{Initial Options}).
 
 @vindex package-enable-at-startup
-  To disable automatic package loading, change the variable
-@code{package-enable-at-startup} to @code{nil}.
+  To keep Emacs from automatically making packages available at
+startup, change the variable @code{package-enable-at-startup} to
+@code{nil}.  You must do this in the early init file (@pxref{Early
+Init File,,, elisp, The Emacs Lisp Reference Manual}), as the variable
+is read before loading the regular init file.  Currently this variable
+cannot be set via Customize.
 
 @findex package-initialize
-  The reason automatic package loading occurs after loading the init
-file is that user options only receive their customized values after
-loading the init file, including user options which affect the
-packaging system.  In some circumstances, you may want to load
-packages explicitly in your init file (usually because some other code
-in your init file depends on a package).  In that case, your init file
-should call the function @code{package-initialize}.  It is up to you
-to ensure that relevant user options, such as @code{package-load-list}
-(see below), are set up prior to the @code{package-initialize} call.
-This will automatically set @code{package-enable-at-startup} to @code{nil}, to
-avoid loading the packages again after processing the init file.
-Alternatively, you may choose to completely inhibit package loading at
-startup, and invoke the command @kbd{M-x package-initialize} to load
-your packages manually.
+  If you have set @code{package-enable-at-startup} to @code{nil}, you
+can still make packages available either during or after startup.  To
+make installed packages available during startup, call the function
+@code{package-initialize} in your init file.  To make installed
+packages available after startup, invoke the command @kbd{M-x
+package-initialize}.
 
 @vindex package-load-list
-  For finer control over package loading, you can use the variable
-@code{package-load-list}.  Its value should be a list.  A list element
-of the form @code{(@var{name} @var{version})} tells Emacs to load
-version @var{version} of the package named @var{name}.  Here,
-@var{version} should be a version string (corresponding to a specific
-version of the package), or @code{t} (which means to load any
-installed version), or @code{nil} (which means no version; this
-disables the package, preventing it from being loaded).  A list
-element can also be the symbol @code{all}, which means to load the
-latest installed version of any package not named by the other list
-elements.  The default value is just @code{'(all)}.
+  For finer control over which packages are made available at startup,
+you can use the variable @code{package-load-list}.  Its value should
+be a list.  A list element of the form @code{(@var{name}
+@var{version})} tells Emacs to make available version @var{version} of
+the package named @var{name}.  Here, @var{version} should be a version
+string (corresponding to a specific version of the package), or
+@code{t} (which means to make available any installed version), or
+@code{nil} (which means no version; this disables the package,
+preventing it from being made available).  A list element can also be
+the symbol @code{all}, which means to make available the latest
+installed version of any package not named by the other list elements.
+The default value is just @code{'(all)}.
 
   For example, if you set @code{package-load-list} to @code{'((muse
-"3.20") all)}, then Emacs only loads version 3.20 of the @samp{muse}
-package, plus any installed version of packages other than
+"3.20") all)}, then Emacs only makes available version 3.20 of the
+@samp{muse} package, plus any installed version of packages other than
 @samp{muse}.  Any other version of @samp{muse} that happens to be
 installed will be ignored.  The @samp{muse} package will be listed in
 the package menu with the @samp{held} status.
diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi
index 42be60449d..cac5bfa067 100644
--- a/doc/lispref/os.texi
+++ b/doc/lispref/os.texi
@@ -95,6 +95,21 @@ Startup Summary
 @item
 It does some basic parsing of the command-line arguments.
 
+@item
+It loads your early init file (@pxref{Early Init File}).  This is not
+done if the options @samp{-q}, @samp{-Q}, or @samp{--batch} were
+specified.  If the @samp{-u} option was specified, Emacs looks for the
+init file in that user's home directory instead.
+
+@item
+It calls the function @code{package-initialize} to activate any
+optional Emacs Lisp package that has been installed.  @xref{Packaging
+Basics}.  However, Emacs doesn't initialize packages when
+@code{package-enable-at-startup} is @code{nil} or when it's started
+with one of the options @samp{-q}, @samp{-Q}, or @samp{--batch}.  To
+initialize packages in the latter case, @code{package-initialize}
+should be called explicitly (e.g., via the @samp{--funcall} option).
+
 @vindex initial-window-system@r{, and startup}
 @vindex window-system-initialization-alist
 @item
@@ -154,15 +169,6 @@ Startup Summary
 (@pxref{Abbrev Files, abbrev-file-name}).  This is not done if the
 option @samp{--batch} was specified.
 
-@item
-It calls the function @code{package-initialize} to activate any
-optional Emacs Lisp package that has been installed.  @xref{Packaging
-Basics}.  However, Emacs doesn't initialize packages when
-@code{package-enable-at-startup} is @code{nil} or when it's started
-with one of the options @samp{-q}, @samp{-Q}, or @samp{--batch}.  To
-initialize packages in the latter case, @code{package-initialize}
-should be called explicitly (e.g., via the @samp{--funcall} option).
-
 @vindex after-init-time
 @item
 It sets the variable @code{after-init-time} to the value of
@@ -361,6 +367,7 @@ Init File
 @cindex init file
 @cindex @file{.emacs}
 @cindex @file{init.el}
+@cindex @file{early-init.el}
 
   When you start Emacs, it normally attempts to load your @dfn{init
 file}.  This is either a file named @file{.emacs} or @file{.emacs.el}
@@ -384,6 +391,19 @@ Init File
 file.  If those environment variables are absent, though, Emacs uses
 your user-id to find your home directory.
 
+@cindex early init file
+  Emacs also attempts to load a second init file, called the
+@dfn{early init file}, if it exists.  This is a file named
+@file{early-init.el} in your @file{~/.emacs.d} directory.  The
+difference between the early init file and the regular init file is
+that the early init file is loaded much earlier during the startup
+process, so you can use it to customize some things that are
+initialized before loading the regular init file.  For example, you
+can customize the process of initializing the package system, by
+setting variables such as @var{package-load-list} or
+@var{package-enable-at-startup}. @xref{Package Installation,,,
+emacs,The GNU Emacs Manual}.
+
 @cindex default init file
   An Emacs installation may have a @dfn{default init file}, which is a
 Lisp library named @file{default.el}.  Emacs finds this file through
diff --git a/doc/lispref/package.texi b/doc/lispref/package.texi
index 21dfe1c271..877aaf89a3 100644
--- a/doc/lispref/package.texi
+++ b/doc/lispref/package.texi
@@ -105,24 +105,32 @@ Packaging Basics
 evaluates the autoload definitions in @file{@var{name}-autoloads.el}.
 
   Whenever Emacs starts up, it automatically calls the function
-@code{package-initialize} to load installed packages.  This is done
-after loading the init file and abbrev file (if any) and before
-running @code{after-init-hook} (@pxref{Startup Summary}).  Automatic
-package loading is disabled if the user option
-@code{package-enable-at-startup} is @code{nil}.
+@code{package-initialize} to make installed packages available to the
+current session.  This is done after loading the early init file, but
+before loading the regular init file (@pxref{Startup Summary}).
+Packages are not automatically made available if the user option
+@code{package-enable-at-startup} is set to @code{nil} in the early
+init file.
 
 @deffn Command package-initialize &optional no-activate
 This function initializes Emacs' internal record of which packages are
-installed, and loads them.  The user option @code{package-load-list}
-specifies which packages to load; by default, all installed packages
-are loaded.  If called during startup, this function also sets
+installed, and makes the packages available to the current session.
+The user option @code{package-load-list} specifies which packages to
+make available; by default, all installed packages are made available.
+If called during startup, this function also sets
 @code{package-enable-at-startup} to @code{nil}, to avoid accidentally
-loading the packages twice.  @xref{Package Installation,,, emacs, The
-GNU Emacs Manual}.
+evaluating package autoloads more than once.  @xref{Package
+Installation,,, emacs, The GNU Emacs Manual}.
 
 The optional argument @var{no-activate}, if non-@code{nil}, causes
 Emacs to update its record of installed packages without actually
-loading them; it is for internal use only.
+making them available; it is for internal use only.
+
+In most cases, you should not need to call @code{package-initialize},
+as this is done automatically during startup.  Simply make sure to put
+any code that should run before @code{package-initialize} in the early
+init file, and any code that should run after it in the primary init
+file (@xref{Init File,,, emacs, The GNU Emacs Manual}).
 @end deffn
 
 @node Simple Packages
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index aa3b029ab7..68aa01ca18 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -890,9 +890,7 @@ Installation
 been visited, i.e., where no Org built-in function have been loaded.
 Otherwise autoload Org functions will mess up the installation.
 
-Then, to make sure your Org configuration is taken into account, initialize
-the package system with @code{(package-initialize)} in your Emacs init file
-before setting any Org option.  If you want to use Org's package repository,
+If you want to use Org's package repository,
 check out the @uref{http://orgmode.org/elpa.html, Org ELPA page}.
 
 @subsubheading Downloading Org as an archive
diff --git a/etc/NEWS b/etc/NEWS
index 71569c95ad..b6b884b816 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -49,6 +49,25 @@ to reduce differences between developer and production builds.
 \f
 * Startup Changes in Emacs 27.1
 
++++
+** Emacs can now be configured using an early init file.
+The file is called 'early-init.el', in 'user-emacs-directory'.  It is
+loaded very early in the startup process: before graphical elements
+such as the tool bar are initialized, and before the package manager
+is initialized.  The primary purpose is to allow customizing how the
+package system is initialized given that initialization now happens
+before loading the regular init file (see below).
+
++++
+** Emacs now calls 'package-initialize' before loading the init file.
+This is part of a change intended to eliminate the behavior of
+package.el inserting a call to 'package-initialize' into the init
+file, which was previously done when Emacs was started.  As a result
+of this change, it is no longer necessary to call 'package-initialize'
+in your init file.  However, if your init file changes the values of
+'package-load-list' or 'package-user-dir', then that code needs to be
+moved to the early init file (see above).
+
 \f
 * Changes in Emacs 27.1
 
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 71d1c41ec3..ab02d4255b 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -1431,16 +1431,11 @@ package-read-all-archive-contents
 ;; available on disk.
 (defvar package--initialized nil)
 
-(defvar package--init-file-ensured nil
-  "Whether we know the init file has package-initialize.")
-
 ;;;###autoload
 (defun package-initialize (&optional no-activate)
   "Load Emacs Lisp packages, and activate them.
 The variable `package-load-list' controls which packages to load.
 If optional arg NO-ACTIVATE is non-nil, don't activate packages.
-If `user-init-file' does not mention `(package-initialize)', add
-it to the file.
 If called as part of loading `user-init-file', set
 `package-enable-at-startup' to nil, to prevent accidentally
 loading packages twice.
@@ -1449,13 +1444,7 @@ package-initialize
 taken care of by `package-initialize'."
   (interactive)
   (setq package-alist nil)
-  (if after-init-time
-      (package--ensure-init-file)
-    ;; If `package-initialize' is before we finished loading the init
-    ;; file, it's obvious we don't need to ensure-init.
-    (setq package--init-file-ensured t
-          ;; And likely we don't need to run it again after init.
-          package-enable-at-startup nil))
+  (setq package-enable-at-startup nil)
   (package-load-all-descriptors)
   (package-read-all-archive-contents)
   (unless no-activate
@@ -1872,64 +1861,6 @@ package-download-transaction
 using `package-compute-transaction'."
   (mapc #'package-install-from-archive packages))
 
-(defun package--ensure-init-file ()
-  "Ensure that the user's init file has `package-initialize'.
-`package-initialize' doesn't have to be called, as long as it is
-present somewhere in the file, even as a comment.  If it is not,
-add a call to it along with some explanatory comments."
-  ;; Don't mess with the init-file from "emacs -Q".
-  (when (and (stringp user-init-file)
-             (not package--init-file-ensured)
-             (file-readable-p user-init-file)
-             (file-writable-p user-init-file))
-    (let* ((buffer (find-buffer-visiting user-init-file))
-           buffer-name
-           (contains-init
-            (if buffer
-                (with-current-buffer buffer
-                  (save-excursion
-                    (save-restriction
-                      (widen)
-                      (goto-char (point-min))
-                      (re-search-forward "(package-initialize\\_>" nil 'noerror))))
-              ;; Don't visit the file if we don't have to.
-              (with-temp-buffer
-                (insert-file-contents user-init-file)
-                (goto-char (point-min))
-                (re-search-forward "(package-initialize\\_>" nil 'noerror)))))
-      (unless contains-init
-        (with-current-buffer (or buffer
-                                 (let ((delay-mode-hooks t)
-                                       (find-file-visit-truename t))
-                                   (find-file-noselect user-init-file)))
-          (when buffer
-            (setq buffer-name (buffer-file-name))
-            (set-visited-file-name (file-chase-links user-init-file)))
-          (save-excursion
-            (save-restriction
-              (widen)
-              (goto-char (point-min))
-              (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
-                          (not (eobp)))
-                (forward-line 1))
-              (insert
-               "\n"
-               ";; Added by Package.el.  This must come before configurations of\n"
-               ";; installed packages.  Don't delete this line.  If you don't want it,\n"
-               ";; just comment it out by adding a semicolon to the start of the line.\n"
-               ";; You may delete these explanatory comments.\n"
-               "(package-initialize)\n")
-              (unless (looking-at-p "$")
-                (insert "\n"))
-              (let ((file-precious-flag t))
-                (save-buffer))
-              (if buffer
-                  (progn
-                    (set-visited-file-name buffer-name)
-                    (set-buffer-modified-p nil))
-                (kill-buffer (current-buffer)))))))))
-  (setq package--init-file-ensured t))
-
 ;;;###autoload
 (defun package-install (pkg &optional dont-select)
   "Install the package PKG.
diff --git a/lisp/startup.el b/lisp/startup.el
index 8c36c19e82..69bc8fa781 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -312,6 +312,12 @@ inhibit-startup-hooks
 Currently this applies to: `emacs-startup-hook', `term-setup-hook',
 and `window-setup-hook'.")
 
+(defvar early-init-file nil
+  "File name, including directory, of user's early init file.
+See `user-init-file'.  The only difference is that
+`early-init-file' is not set during the course of evaluating the
+early init file.")
+
 (defvar keyboard-type nil
   "The brand of keyboard you are using.
 This variable is used to define the proper function and keypad
@@ -870,6 +876,103 @@ startup--setup-quote-display
           (when standard-display-table
             (aset standard-display-table char nil)))))))
 
+(defun load-user-init-file
+    (filename-function &optional alternate-filename-function load-defaults)
+  "Load a user init-file.
+FILENAME-FUNCTION is called with no arguments and should return
+the name of the init-file to load.  If this file cannot be
+loaded, and ALTERNATE-FILENAME-FUNCTION is non-nil, then it is
+called with no arguments and should return the name of an
+alternate init-file to load.  If LOAD-DEFAULTS is non-nil, then
+load default.el after the init-file.
+
+This function sets `user-init-file' to the name of the loaded
+init-file, or to a default value if loading is not possible."
+  (let ((debug-on-error-from-init-file nil)
+        (debug-on-error-should-be-set nil)
+        (debug-on-error-initial
+         (if (eq init-file-debug t)
+             'startup
+           init-file-debug)))
+    (let ((debug-on-error debug-on-error-initial)
+          ;; We create an anonymous function here so that we can call
+          ;; it in different contexts depending on the value of
+          ;; `debug-on-error'.
+          (read-init-file
+           (lambda ()
+             (when init-file-user
+               (let ((init-file-name (funcall filename-function)))
+
+                 ;; If `user-init-file' is t, then `load' will store
+                 ;; the name of the file that it loads into
+                 ;; `user-init-file'.
+                 (setq user-init-file t)
+                 (load init-file-name 'noerror 'nomessage)
+
+                 (when (and (eq user-init-file t) alternate-filename-function)
+                   (load (funcall alternate-filename-function)
+                         'noerror 'nomessage))
+
+                 ;; If we did not find the user's init file, set
+                 ;; user-init-file conclusively.  Don't let it be
+                 ;; set from default.el.
+                 (when (eq user-init-file t)
+                   (setq user-init-file init-file-name)))
+
+               ;; If we loaded a compiled file, set `user-init-file' to
+               ;; the source version if that exists.
+               (when (equal (file-name-extension user-init-file)
+                            "elc")
+                 (let* ((source (file-name-sans-extension user-init-file))
+                        (alt (concat source ".el")))
+                   (setq source (cond ((file-exists-p alt) alt)
+                                      ((file-exists-p source) source)
+                                      (t nil)))
+                   (when source
+                     (when (file-newer-than-file-p source user-init-file)
+                       (message "Warning: %s is newer than %s"
+                                source user-init-file)
+                       (sit-for 1))
+                     (setq user-init-file source))))
+
+               (when load-defaults
+
+                 ;; Prevent default.el from changing the value of
+                 ;; `inhibit-startup-screen'.
+                 (let ((inhibit-startup-screen nil))
+                   (load "default" 'noerror 'nomessage)))))))
+      ;; Now call our anonymous function.
+      (if init-file-debug
+          ;; Do this without a `condition-case' if the user wants to
+          ;; debug.
+          (funcall read-init-file)
+        (condition-case error
+            (funcall read-init-file)
+          (error
+           (display-warning
+            'initialization
+            (format-message "\
+An error occurred while loading `%s':\n\n%s%s%s\n\n\
+To ensure normal operation, you should investigate and remove the
+cause of the error in your initialization file.  Start Emacs with
+the `--debug-init' option to view a complete error backtrace."
+                            user-init-file
+                            (get (car error) 'error-message)
+                            (if (cdr error) ": " "")
+                            (mapconcat (lambda (s) (prin1-to-string s t))
+                                       (cdr error) ", "))
+            :warning)
+           (setq init-file-had-error t))))
+
+      ;; If we can tell that the init file altered debug-on-error,
+      ;; arrange to preserve the value that it set up.
+      (or (eq debug-on-error debug-on-error-initial)
+          (setq debug-on-error-should-be-set t
+                debug-on-error-from-init-file debug-on-error)))
+
+    (when debug-on-error-should-be-set
+      (setq debug-on-error debug-on-error-from-init-file))))
+
 (defun command-line ()
   "A subroutine of `normal-top-level'.
 Amongst another things, it parses the command-line arguments."
@@ -1021,6 +1124,69 @@ command-line
     (and command-line-args
          (setcdr command-line-args args)))
 
+  ;; Warn for invalid user name.
+  (when init-file-user
+    (if (string-match "[~/:\n]" init-file-user)
+        (display-warning 'initialization
+                         (format "Invalid user name %s"
+                                 init-file-user)
+                         :error)
+      (if (file-directory-p (expand-file-name
+                             ;; We don't support ~USER on MS-Windows
+                             ;; and MS-DOS except for the current
+                             ;; user, and always load .emacs from
+                             ;; the current user's home directory
+                             ;; (see below).  So always check "~",
+                             ;; even if invoked with "-u USER", or
+                             ;; if $USER or $LOGNAME are set to
+                             ;; something different.
+                             (if (memq system-type '(windows-nt ms-dos))
+                                 "~"
+                               (concat "~" init-file-user))))
+          nil
+        (display-warning 'initialization
+                         (format "User %s has no home directory"
+                                 (if (equal init-file-user "")
+                                     (user-real-login-name)
+                                   init-file-user))
+                         :error))))
+
+  ;; Load the early init file, if found.
+  (load-user-init-file
+   (lambda ()
+     (expand-file-name
+      "early-init"
+      (file-name-as-directory
+       (concat "~" init-file-user "/.emacs.d")))))
+  (setq early-init-file user-init-file)
+
+  ;; If any package directory exists, initialize the package system.
+  (and user-init-file
+       package-enable-at-startup
+       (catch 'package-dir-found
+	 (let (dirs)
+	   (if (boundp 'package-directory-list)
+	       (setq dirs package-directory-list)
+	     (dolist (f load-path)
+	       (and (stringp f)
+		    (equal (file-name-nondirectory f) "site-lisp")
+		    (push (expand-file-name "elpa" f) dirs))))
+	   (push (if (boundp 'package-user-dir)
+		     package-user-dir
+		   (locate-user-emacs-file "elpa"))
+		 dirs)
+	   (dolist (dir dirs)
+	     (when (file-directory-p dir)
+	       (dolist (subdir (directory-files dir))
+		 (when (let ((subdir (expand-file-name subdir dir)))
+                         (and (file-directory-p subdir)
+                              (file-exists-p
+                               (expand-file-name
+                                (package--description-file subdir)
+                                subdir))))
+		   (throw 'package-dir-found t)))))))
+       (package-initialize))
+
   ;; Make sure window system's init file was loaded in loadup.el if
   ;; using a window system.
   ;; Initialize the window-system only after processing the command-line
@@ -1128,153 +1294,47 @@ command-line
     ;; the startup screen.
     (setq inhibit-startup-screen nil)
 
-    ;; Warn for invalid user name.
-    (when init-file-user
-      (if (string-match "[~/:\n]" init-file-user)
-	  (display-warning 'initialization
-			   (format "Invalid user name %s"
-				   init-file-user)
-			   :error)
-	(if (file-directory-p (expand-file-name
-			       ;; We don't support ~USER on MS-Windows
-			       ;; and MS-DOS except for the current
-			       ;; user, and always load .emacs from
-			       ;; the current user's home directory
-			       ;; (see below).  So always check "~",
-			       ;; even if invoked with "-u USER", or
-			       ;; if $USER or $LOGNAME are set to
-			       ;; something different.
-			       (if (memq system-type '(windows-nt ms-dos))
-				   "~"
-				 (concat "~" init-file-user))))
-	    nil
-	  (display-warning 'initialization
-			   (format "User %s has no home directory"
-				   (if (equal init-file-user "")
-				       (user-real-login-name)
-				     init-file-user))
-			   :error))))
-
     ;; Load that user's init file, or the default one, or none.
-    (let (debug-on-error-from-init-file
-	  debug-on-error-should-be-set
-	  (debug-on-error-initial
-	   (if (eq init-file-debug t) 'startup init-file-debug)))
-      (let ((debug-on-error debug-on-error-initial)
-	    ;; This function actually reads the init files.
-	    (inner
-	     (function
-	      (lambda ()
-		(if init-file-user
-		    (let ((user-init-file-1
-			   (cond
-			     ((eq system-type 'ms-dos)
-			      (concat "~" init-file-user "/_emacs"))
-			     ((not (eq system-type 'windows-nt))
-			      (concat "~" init-file-user "/.emacs"))
-			     ;; Else deal with the Windows situation
-			     ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
-			      ;; Prefer .emacs on Windows.
-			      "~/.emacs")
-			     ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
-			      ;; Also support _emacs for compatibility, but warn about it.
-			      (push `(initialization
-				      ,(format-message
-					"`_emacs' init file is deprecated, please use `.emacs'"))
-				    delayed-warnings-list)
-			      "~/_emacs")
-			     (t ;; But default to .emacs if _emacs does not exist.
-			      "~/.emacs"))))
-		      ;; This tells `load' to store the file name found
-		      ;; into user-init-file.
-		      (setq user-init-file t)
-		      (load user-init-file-1 t t)
-
-		      (when (eq user-init-file t)
-			;; If we did not find ~/.emacs, try
-			;; ~/.emacs.d/init.el.
-			(let ((otherfile
-			       (expand-file-name
-				"init"
-				(file-name-as-directory
-				 (concat "~" init-file-user "/.emacs.d")))))
-			  (load otherfile t t)
-
-			  ;; If we did not find the user's init file,
-			  ;; set user-init-file conclusively.
-			  ;; Don't let it be set from default.el.
-			  (when (eq user-init-file t)
-			    (setq user-init-file user-init-file-1))))
-
-		      ;; If we loaded a compiled file, set
-		      ;; `user-init-file' to the source version if that
-		      ;; exists.
-		      (when (and user-init-file
-				 (equal (file-name-extension user-init-file)
-					"elc"))
-			(let* ((source (file-name-sans-extension user-init-file))
-			       (alt (concat source ".el")))
-			  (setq source (cond ((file-exists-p alt) alt)
-					     ((file-exists-p source) source)
-					     (t nil)))
-			  (when source
-			    (when (file-newer-than-file-p source user-init-file)
-			      (message "Warning: %s is newer than %s"
-				       source user-init-file)
-			      (sit-for 1))
-			    (setq user-init-file source))))
-
-		      (unless inhibit-default-init
-                        (let ((inhibit-startup-screen nil))
-                          ;; Users are supposed to be told their rights.
-                          ;; (Plus how to get help and how to undo.)
-                          ;; Don't you dare turn this off for anyone
-                          ;; except yourself.
-                          (load "default" t t)))))))))
-	(if init-file-debug
-	    ;; Do this without a condition-case if the user wants to debug.
-	    (funcall inner)
-	  (condition-case error
-	      (progn
-		(funcall inner)
-		(setq init-file-had-error nil))
-	    (error
-	     (display-warning
-	      'initialization
-	      (format-message "\
-An error occurred while loading `%s':\n\n%s%s%s\n\n\
-To ensure normal operation, you should investigate and remove the
-cause of the error in your initialization file.  Start Emacs with
-the `--debug-init' option to view a complete error backtrace."
-		      user-init-file
-		      (get (car error) 'error-message)
-		      (if (cdr error) ": " "")
-		      (mapconcat (lambda (s) (prin1-to-string s t))
-				 (cdr error) ", "))
-	      :warning)
-	     (setq init-file-had-error t))))
-
-      (if (and deactivate-mark transient-mark-mode)
-	    (with-current-buffer (window-buffer)
-	      (deactivate-mark)))
-
-	;; If the user has a file of abbrevs, read it (unless -batch).
-	(when (and (not noninteractive)
-		   (file-exists-p abbrev-file-name)
-		   (file-readable-p abbrev-file-name))
-	    (quietly-read-abbrev-file abbrev-file-name))
-
-	;; If the abbrevs came entirely from the init file or the
-	;; abbrevs file, they do not need saving.
-	(setq abbrevs-changed nil)
-
-	;; If we can tell that the init file altered debug-on-error,
-	;; arrange to preserve the value that it set up.
-	(or (eq debug-on-error debug-on-error-initial)
-	    (setq debug-on-error-should-be-set t
-		  debug-on-error-from-init-file debug-on-error)))
-      (if debug-on-error-should-be-set
-	  (setq debug-on-error debug-on-error-from-init-file)))
+    (load-user-init-file
+     (lambda ()
+       (cond
+        ((eq system-type 'ms-dos)
+         (concat "~" init-file-user "/_emacs"))
+        ((not (eq system-type 'windows-nt))
+         (concat "~" init-file-user "/.emacs"))
+        ;; Else deal with the Windows situation.
+        ((directory-files "~" nil "^\\.emacs\\(\\.elc?\\)?$")
+         ;; Prefer .emacs on Windows.
+         "~/.emacs")
+        ((directory-files "~" nil "^_emacs\\(\\.elc?\\)?$")
+         ;; Also support _emacs for compatibility, but warn about it.
+         (push `(initialization
+                 ,(format-message
+                   "`_emacs' init file is deprecated, please use `.emacs'"))
+               delayed-warnings-list)
+         "~/_emacs")
+        (t ;; But default to .emacs if _emacs does not exist.
+         "~/.emacs")))
+     (lambda ()
+       (expand-file-name
+        "init"
+        (file-name-as-directory
+         (concat "~" init-file-user "/.emacs.d"))))
+     (not inhibit-default-init))
+
+    (when (and deactivate-mark transient-mark-mode)
+      (with-current-buffer (window-buffer)
+        (deactivate-mark)))
+
+    ;; If the user has a file of abbrevs, read it (unless -batch).
+    (when (and (not noninteractive)
+               (file-exists-p abbrev-file-name)
+               (file-readable-p abbrev-file-name))
+      (quietly-read-abbrev-file abbrev-file-name))
+
+    ;; If the abbrevs came entirely from the init file or the
+    ;; abbrevs file, they do not need saving.
+    (setq abbrevs-changed nil)
 
     ;; Do this here in case the init file sets mail-host-address.
     (and mail-host-address
@@ -1296,33 +1356,6 @@ command-line
 		 (eq face-ignored-fonts old-face-ignored-fonts))
       (clear-face-cache)))
 
-  ;; If any package directory exists, initialize the package system.
-  (and user-init-file
-       package-enable-at-startup
-       (catch 'package-dir-found
-	 (let (dirs)
-	   (if (boundp 'package-directory-list)
-	       (setq dirs package-directory-list)
-	     (dolist (f load-path)
-	       (and (stringp f)
-		    (equal (file-name-nondirectory f) "site-lisp")
-		    (push (expand-file-name "elpa" f) dirs))))
-	   (push (if (boundp 'package-user-dir)
-		     package-user-dir
-		   (locate-user-emacs-file "elpa"))
-		 dirs)
-	   (dolist (dir dirs)
-	     (when (file-directory-p dir)
-	       (dolist (subdir (directory-files dir))
-		 (when (let ((subdir (expand-file-name subdir dir)))
-                         (and (file-directory-p subdir)
-                              (file-exists-p
-                               (expand-file-name
-                                (package--description-file subdir)
-                                subdir))))
-		   (throw 'package-dir-found t)))))))
-       (package-initialize))
-
   (setq after-init-time (current-time))
   ;; Display any accumulated warnings after all functions in
   ;; `after-init-hook' like `desktop-read' have finalized possible
diff --git a/src/lread.c b/src/lread.c
index 7cacd47d51..d009bd0cd2 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4922,7 +4922,7 @@ directory.  These file names are converted to absolute at startup.  */);
 If the file loaded had extension `.elc', and the corresponding source file
 exists, this variable contains the name of source file, suitable for use
 by functions like `custom-save-all' which edit the init file.
-While Emacs loads and evaluates the init file, value is the real name
+While Emacs loads and evaluates any init file, value is the real name
 of the file, regardless of whether or not it has the `.elc' extension.  */);
   Vuser_init_file = Qnil;
 
-- 
2.16.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* RE: [PATCH] Fixing package-initialize, adding early init file
  2018-02-15  4:38                         ` Radon Rosborough
@ 2018-02-15 15:54                           ` Drew Adams
  2018-02-15 16:25                             ` Stefan Monnier
  2018-02-15 19:32                             ` John Wiegley
  2018-02-17 11:38                           ` Eli Zaretskii
  1 sibling, 2 replies; 838+ messages in thread
From: Drew Adams @ 2018-02-15 15:54 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: emacs-devel

>> Btw, is it only looked up in .emacs.d, or also in the directory where
>> .emacs is searched (which could be just the home directory)?
>
> No, since .emacs is deprecated in favor of ~/.emacs.d/init.el.

Huh?  Deprecation does not mean desupport.
Emacs still supports ~/.emacs, AFAIK.

(And why should ~/.emacs have been deprecated?
It's fine to recommend ~/.emacs.d/init.el, of course.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-15 15:54                           ` Drew Adams
@ 2018-02-15 16:25                             ` Stefan Monnier
  2018-02-15 19:32                             ` John Wiegley
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-15 16:25 UTC (permalink / raw)
  To: emacs-devel

>>> Btw, is it only looked up in .emacs.d, or also in the directory where
>>> .emacs is searched (which could be just the home directory)?
>> No, since .emacs is deprecated in favor of ~/.emacs.d/init.el.
> Huh?  Deprecation does not mean desupport.
> Emacs still supports ~/.emacs, AFAIK.

He just means that he didn't find it necessary to provide a ~/.<foo>
alternative to the ~/.emacs,.d/early-init.el file.

FWIW I completely agree that it doesn't seem to be worthwhile to add
support for an alternate ~/.<foo> name: it would only make sense to do
that in order to provide backward compatibility with a preexisting such
~/.<foo>, but in this case there's no such preexisting file.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-15 15:54                           ` Drew Adams
  2018-02-15 16:25                             ` Stefan Monnier
@ 2018-02-15 19:32                             ` John Wiegley
  2018-02-15 21:13                               ` Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: John Wiegley @ 2018-02-15 19:32 UTC (permalink / raw)
  To: Drew Adams; +Cc: Radon Rosborough, emacs-devel

>>>>> "DA" == Drew Adams <drew.adams@oracle.com> writes:

DA> Huh?  Deprecation does not mean desupport.
DA> Emacs still supports ~/.emacs, AFAIK.

DA> (And why should ~/.emacs have been deprecated?
DA> It's fine to recommend ~/.emacs.d/init.el, of course.)

I see we have an xdg.el package. Is ~/.config/emacs/init.el a possibility yet?

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-15 19:32                             ` John Wiegley
@ 2018-02-15 21:13                               ` Stefan Monnier
  2018-02-16  7:00                                 ` John Wiegley
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-02-15 21:13 UTC (permalink / raw)
  To: emacs-devel

> DA> Huh?  Deprecation does not mean desupport.
> DA> Emacs still supports ~/.emacs, AFAIK.
> DA> (And why should ~/.emacs have been deprecated?
> DA> It's fine to recommend ~/.emacs.d/init.el, of course.)
> I see we have an xdg.el package. Is ~/.config/emacs/init.el a possibility yet?

As long as xdg.el is not preloaded in the dumped Emacs, I think not.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-15 21:13                               ` Stefan Monnier
@ 2018-02-16  7:00                                 ` John Wiegley
  0 siblings, 0 replies; 838+ messages in thread
From: John Wiegley @ 2018-02-16  7:00 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

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

SM> As long as xdg.el is not preloaded in the dumped Emacs, I think not.

Then may I suggest that we...

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-15  4:38                         ` Radon Rosborough
  2018-02-15 15:54                           ` Drew Adams
@ 2018-02-17 11:38                           ` Eli Zaretskii
  2018-02-17 14:14                             ` Clément Pit-Claudel
  2018-02-17 18:17                             ` Radon Rosborough
  1 sibling, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2018-02-17 11:38 UTC (permalink / raw)
  To: Radon Rosborough; +Cc: cpitclaudel, monnier, emacs-devel

> From: Radon Rosborough <radon.neon@gmail.com>
> Date: Wed, 14 Feb 2018 20:38:14 -0800
> Cc: Stefan Monnier <monnier@iro.umontreal.ca>, 
> 	Clément Pit-Claudel <cpitclaudel@gmail.com>, 
> 	emacs-devel <emacs-devel@gnu.org>
> 
> Unless otherwise noted, I have integrated your comments, Eli. Let
> me know if more changes are needed before merging.

Thanks, I pushed this to the master branch.

A few minor nits about the docs, for the future:

 . when you add new nodes to a manual, you need to update higher-level
   menus accordingly, in the parent section/chapter and in the
   top-level menu in emacs.texi or elisp.texi
 . @xref is inappropriate for parenthesized notes; use @pxref instead
 . there were a couple of places with only one blank between
   sentences.
 . long expressions with embedded whitespace should be included in
   @w{..}, to prevent breaking them between lines, which makes them
   less readable



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-17 11:38                           ` Eli Zaretskii
@ 2018-02-17 14:14                             ` Clément Pit-Claudel
  2018-02-17 18:17                             ` Radon Rosborough
  1 sibling, 0 replies; 838+ messages in thread
From: Clément Pit-Claudel @ 2018-02-17 14:14 UTC (permalink / raw)
  To: Eli Zaretskii, Radon Rosborough; +Cc: monnier, emacs-devel

On 2018-02-17 06:38, Eli Zaretskii wrote:
> Thanks, I pushed this to the master branch.

Radon, congratulations for the awesome work!
And thanks Eli (and everyone else) for proofreading and merging.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-17 11:38                           ` Eli Zaretskii
  2018-02-17 14:14                             ` Clément Pit-Claudel
@ 2018-02-17 18:17                             ` Radon Rosborough
  2018-02-18 18:26                               ` Basil L. Contovounesios
  1 sibling, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2018-02-17 18:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Clément Pit-Claudel, Stefan Monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 219 bytes --]

> Thanks, I pushed this to the master branch.

[ confetti ]

> A few minor nits about the docs, for the future

Thanks, this is very helpful. I never did anything with texinfo before
this, so good to know.
​

[-- Attachment #2: Type: text/html, Size: 539 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-01 13:36                               ` Stefan Monnier
@ 2018-02-18  5:40                                 ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-18  5:40 UTC (permalink / raw)
  To: emacs-devel

>> forms from init.el into early-init.el).  People whose configurations are
>> advanced enough to set `package-load-list' and `package-user-dir' will find
>> this change trivial to make.
> FWIW, I do set package-user-dir in my config, and I resolve the problem
> by moving my whole config from .emacs.d/init.el to
> .emacs.d/early-init.el.

Another option is to use my package-quickstart thingy: it uses
package-load-list and package-user-dir to build one big autoloads file
which not only can be quickly loaded by Emacs at startup but it can do
so before package-load-list and package-user-dir have been set!


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-17 18:17                             ` Radon Rosborough
@ 2018-02-18 18:26                               ` Basil L. Contovounesios
  2018-02-18 18:55                                 ` Radon Rosborough
  2018-02-19  3:10                                 ` Stefan Monnier
  0 siblings, 2 replies; 838+ messages in thread
From: Basil L. Contovounesios @ 2018-02-18 18:26 UTC (permalink / raw)
  To: Radon Rosborough
  Cc: Eli Zaretskii, emacs-devel, Clément Pit-Claudel,
	Stefan Monnier

This feature ("Add early init file, stop package-initialize insertion",
commit 24acb31c04) seems to cause the following behaviour for me:

1. cd
2. mv .emacs.d .emacs.d.bak
   (My user-init-file lives under user-emacs-directory, so this is like
    erasing user-init-file and uninstalling all packages.)
3. emacs --no-site-file
4. M-x package-install RET bbdb RET
   (I think any package with a "dir" file will do - lmc.el does not
    cause any issues, for example.)
5. C-x C-c
6. emacs --no-site-file
7. C-h e

The first line in the *Messages* buffer reads

  Symbol’s value as variable is void: Info-default-directory-list

followed by "[N times]" where N (I guess) is proportional to the number
of packages installed in package-user-dir.

Repeating step 6 with --debug-init doesn't change anything, and neither
does Stefan's latest "Use condition-case-unless-debug" commit
eb3337cdb3.

Any ideas on what is happening and how to debug/fix this?

Thanks,

-- 
Basil



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-18 18:26                               ` Basil L. Contovounesios
@ 2018-02-18 18:55                                 ` Radon Rosborough
  2018-02-19  3:10                                 ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-02-18 18:55 UTC (permalink / raw)
  To: Basil L. Contovounesios
  Cc: Eli Zaretskii, emacs-devel, Clément Pit-Claudel,
	Stefan Monnier

> Any ideas on what is happening and how to debug/fix this?

I saw this error before, but for some reason concluded that it wasn't
due to my change. Thus I didn't look too much into it, but I would
assume that it is because package initialization happens earlier now,
and package.el does not take care to initialize the Info system if
it's not done already.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-18 18:26                               ` Basil L. Contovounesios
  2018-02-18 18:55                                 ` Radon Rosborough
@ 2018-02-19  3:10                                 ` Stefan Monnier
  2018-02-20 19:13                                   ` Basil L. Contovounesios
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-02-19  3:10 UTC (permalink / raw)
  To: Basil L. Contovounesios
  Cc: Eli Zaretskii, Radon Rosborough, Clément Pit-Claudel,
	emacs-devel

> The first line in the *Messages* buffer reads
>   Symbol’s value as variable is void: Info-default-directory-list

Hmm... indeed, I see the problem: in `command-line`, we do:

- load early-init.el
- activate all packages
- do various frame initializations (e.g. create the GUI frame)
- run custom-reevaluate-setting on the custom-delayed-init-variables
- load init.el

and until we run custom-reevaluate-setting, those delayed vars are
still unbound.

I don't know if it's safe to do the custom-reevaluate-setting before the
frame initializations.  If it is, then we could move it to before
loading early-init.el, and that would be my favorite choice.

If that can't be done, then the second best option is to move the
package-activation to after we run custom-reevaluate-setting (so
early-init.el still can't (require 'info) because
Info-default-directory-list is unbound, but at least the problem at hand
should be fixed).


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-19  3:10                                 ` Stefan Monnier
@ 2018-02-20 19:13                                   ` Basil L. Contovounesios
  2018-02-20 19:26                                     ` Basil L. Contovounesios
  0 siblings, 1 reply; 838+ messages in thread
From: Basil L. Contovounesios @ 2018-02-20 19:13 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Eli Zaretskii, Radon Rosborough, Clément Pit-Claudel,
	emacs-devel


>> The first line in the *Messages* buffer reads
>>   Symbol’s value as variable is void: Info-default-directory-list

A knock-on effect is a near-twofold increase in my startup time, from
~0.4s to ~0.7s, but hopefully this is due only to the unintended 34
times the error is logged while activating 146 packages on my side.

Sorry I can't be of any help at this time; I haven't been keeping up
with this feature.

-- 
Basil



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-20 19:13                                   ` Basil L. Contovounesios
@ 2018-02-20 19:26                                     ` Basil L. Contovounesios
  2018-02-20 20:35                                       ` Radon Rosborough
  2018-02-21  3:43                                       ` T.V Raman
  0 siblings, 2 replies; 838+ messages in thread
From: Basil L. Contovounesios @ 2018-02-20 19:26 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Eli Zaretskii, Radon Rosborough, Clément Pit-Claudel,
	emacs-devel

"Basil L. Contovounesios" <contovob@tcd.ie> writes:

>>> The first line in the *Messages* buffer reads
>>>   Symbol’s value as variable is void: Info-default-directory-list
>
> A knock-on effect is a near-twofold increase in my startup time, from
> ~0.4s to ~0.7s, but hopefully this is due only to the unintended 34
> times the error is logged while activating 146 packages on my side.

Indeed, I spoke too soon - I think the slowdown was being caused by a
repeated call to package-initialize, which I now avoid by disabling
package-enable-at-startup in early-init-file.  Sorry about the noise.

-- 
Basil



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-20 19:26                                     ` Basil L. Contovounesios
@ 2018-02-20 20:35                                       ` Radon Rosborough
  2018-02-21  3:48                                         ` T.V Raman
  2018-02-21  8:16                                         ` Stefan Monnier
  2018-02-21  3:43                                       ` T.V Raman
  1 sibling, 2 replies; 838+ messages in thread
From: Radon Rosborough @ 2018-02-20 20:35 UTC (permalink / raw)
  To: Basil L. Contovounesios
  Cc: Eli Zaretskii, Clément Pit-Claudel, Stefan Monnier,
	emacs-devel

[-- Attachment #1: Type: text/plain, Size: 766 bytes --]

> I think the slowdown was being caused by a
> repeated call to package-initialize, which I now avoid by disabling
> package-enable-at-startup in early-init-file.

Might it be a good idea to have `package-initialize' signal a warning if
it's
called multiple times? I hadn't considered this side effect of the change,
but at least it's easier to get users to remove a duplicate call than to add
a missing one.

Are there ever circumstances where calling `package-initialize' more than
once makes sense? Perhaps we can allow for those by introducing a
variable `package-warn-on-reinitialization' or somesuch, which would be
set to non-nil in `package-initialize', and then next time around produce a
warning, but then could be set back to nil to suppress the warning.

[-- Attachment #2: Type: text/html, Size: 1574 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-20 19:26                                     ` Basil L. Contovounesios
  2018-02-20 20:35                                       ` Radon Rosborough
@ 2018-02-21  3:43                                       ` T.V Raman
  1 sibling, 0 replies; 838+ messages in thread
From: T.V Raman @ 2018-02-21  3:43 UTC (permalink / raw)
  To: Basil L. Contovounesios
  Cc: Eli Zaretskii, Radon Rosborough, Clément Pit-Claudel,
	Stefan Monnier, emacs-devel

But that error re Info-default-directory is still
annoying. Interestingly, declaring it as a defvar in early-init.el
doesn't seem to help 
-- 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-20 20:35                                       ` Radon Rosborough
@ 2018-02-21  3:48                                         ` T.V Raman
  2018-02-21  8:16                                         ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: T.V Raman @ 2018-02-21  3:48 UTC (permalink / raw)
  To: Radon Rosborough
  Cc: Basil L. Contovounesios, Eli Zaretskii, emacs-devel,
	Clément Pit-Claudel, Stefan Monnier

Also the documentation for variable 
package-enable-at-startup may need updating, present doc-string no
longer feels right:
package-enable-at-startup is a variable defined in `package.el'.
Its value is nil
Original value was t

Documentation:
Whether to activate installed packages when Emacs starts.
If non-nil, packages are activated after reading the init file
and before `after-init-hook'.  Activation is not done if
`user-init-file' is nil (e.g. Emacs was started with "-q").

Even if the value is nil, you can type M-x package-initialize to
activate the package system at any time.

You can customize this variable.

This variable was introduced, or its default value was changed, in
version 24.1 of Emacs.

-- 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-20 20:35                                       ` Radon Rosborough
  2018-02-21  3:48                                         ` T.V Raman
@ 2018-02-21  8:16                                         ` Stefan Monnier
  2018-02-21 20:48                                           ` Radon Rosborough
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2018-02-21  8:16 UTC (permalink / raw)
  To: Radon Rosborough
  Cc: Basil L. Contovounesios, Eli Zaretskii, Clément Pit-Claudel,
	emacs-devel

> Might it be a good idea to have `package-initialize' signal a warning
> if it's called multiple times? I hadn't considered this side effect of
> the change, but at least it's easier to get users to remove
> a duplicate call than to add a missing one.
>
> Are there ever circumstances where calling `package-initialize' more than
> once makes sense?

It can make sense if packages were added/removed/updated without
Emacs's knowledge.  So maybe we need something more targeted to
~/.emacs, by temporarily let-binding a package--within-init.el variable
(this would also allow us to not only emit a message but even skip the
execution of such a second call to package-initialize).


        Stefan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-21  8:16                                         ` Stefan Monnier
@ 2018-02-21 20:48                                           ` Radon Rosborough
  2018-02-21 21:26                                             ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Radon Rosborough @ 2018-02-21 20:48 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Basil L. Contovounesios, Eli Zaretskii, Clément Pit-Claudel,
	emacs-devel

> So maybe we need something more targeted to
> ~/.emacs, by temporarily let-binding a package--within-init.el variable
> (this would also allow us to not only emit a message but even skip the
> execution of such a second call to package-initialize).

So then if you actually do want to run `package-initialize', you would
let-bind `package--within-init.el' to nil? I feel like that's a little
odd, since it would require you to introduce a workaround even if
`package-initialize' was only called once (i.e. you set
`package-enable-at-startup' to nil in early-init.el). Whereas with
what I suggested, you'd only need to introduce a workaround if
`package-initialize' was actually called twice. (If you were concerned
about a warning being signaled after startup, we could just condition
it on `after-init-time' being nil.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: [PATCH] Fixing package-initialize, adding early init file
  2018-02-21 20:48                                           ` Radon Rosborough
@ 2018-02-21 21:26                                             ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-02-21 21:26 UTC (permalink / raw)
  To: emacs-devel

> So then if you actually do want to run `package-initialize', you would
> let-bind `package--within-init.el' to nil? I feel like that's a little
> odd, since it would require you to introduce a workaround even if
> `package-initialize' was only called once (i.e. you set
> `package-enable-at-startup' to nil in early-init.el). Whereas with
> what I suggested, you'd only need to introduce a workaround if
> `package-initialize' was actually called twice.

Clearly, we would not want to warn and/or skip one the first call
(e.g. when the user set package-enable-at-startup to nil in early-init.el).

> (If you were concerned about a warning being signaled after startup,
> we could just condition it on `after-init-time' being nil.)

That would work as well, yes,


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Stefan's patch to improve package loading
  2018-02-14 23:32                                         ` George Plymale II
@ 2018-03-09  2:54                                           ` George Plymale II
  0 siblings, 0 replies; 838+ messages in thread
From: George Plymale II @ 2018-03-09  2:54 UTC (permalink / raw)
  To: George Plymale II; +Cc: monnier, emacs-devel

Hi Stefan,

I know we've sent each other messages in private about this patch and
you said that you'd post some updates here on the mailing list, but it's
been a few weeks so I thought I'd give you a thread to send it to.

I have to say that your patch has really cut down on my startup time to
a point where I'm satisfied with it again (although it's not always
under one second, but that is mostly due to some of my configuration
plus the workload of my machine). I'm excited to see what kinds of
updates you have for it, as I hope it makes it into the trunk at some point.

Thanks.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
       [not found] <mailman.5042.1543777897.1284.help-gnu-emacs@gnu.org>
@ 2018-12-04  9:04 ` Barry Margolin
  2018-12-04 13:56   ` Stefan Monnier
                     ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Barry Margolin @ 2018-12-04  9:04 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.5042.1543777897.1284.help-gnu-emacs@gnu.org>,
 Robert Thorpe <rt@robertthorpeconsulting.com> wrote:

> I've seen lots of beginners write programs that setq undefined symbols
> and now I know why.

There's nothing wrong with it in Emacs Lisp and a number of other Lisp 
dialects. I think Common Lisp was the first specification that made it 
questionable, but it was commonplace in the days of Maclisp, which is 
the dialect that Emacs Lisp is most directly descended from.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
  2018-12-04  9:04 ` using setq to create lists based on other lists Barry Margolin
@ 2018-12-04 13:56   ` Stefan Monnier
  2018-12-05  1:07   ` Robert Thorpe
       [not found]   ` <mailman.5145.1543931778.1284.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2018-12-04 13:56 UTC (permalink / raw)
  To: help-gnu-emacs

> There's nothing wrong with it in Emacs Lisp

Actually, there is in the sense that these are global variables and so
can interfere with other Elisp packages.

> and a number of other Lisp dialects.

For most other Lisps what the user writes only creates havoc with its
own code because each program runs in its own process.  But Emacs being
its own kind of OS the situation is a bit different.  Of course similar
situations occur with "Lisp machine" kind of systems (or Smalltalk
machines, ...).


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
  2018-12-04  9:04 ` using setq to create lists based on other lists Barry Margolin
  2018-12-04 13:56   ` Stefan Monnier
@ 2018-12-05  1:07   ` Robert Thorpe
  2018-12-05  2:32     ` Drew Adams
       [not found]     ` <mailman.5186.1543978155.1284.help-gnu-emacs@gnu.org>
       [not found]   ` <mailman.5145.1543931778.1284.help-gnu-emacs@gnu.org>
  2 siblings, 2 replies; 838+ messages in thread
From: Robert Thorpe @ 2018-12-05  1:07 UTC (permalink / raw)
  To: Barry Margolin; +Cc: help-gnu-emacs

Barry Margolin <barmar@alum.mit.edu> writes:

> In article <mailman.5042.1543777897.1284.help-gnu-emacs@gnu.org>,
>  Robert Thorpe <rt@robertthorpeconsulting.com> wrote:
>
>> I've seen lots of beginners write programs that setq undefined symbols
>> and now I know why.
>
> There's nothing wrong with it in Emacs Lisp and a number of other Lisp 
> dialects. I think Common Lisp was the first specification that made it 
> questionable, but it was commonplace in the days of Maclisp, which is 
> the dialect that Emacs Lisp is most directly descended from.

Yes.  But, there's still the issue of accidentally creating global
variables.

I think the modern learner will expect "setq" to do what "let"
does unless told otherwise.  

BR,
Robert Thorpe




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: using setq to create lists based on other lists...
  2018-12-05  1:07   ` Robert Thorpe
@ 2018-12-05  2:32     ` Drew Adams
  2018-12-05  6:45       ` Jean-Christophe Helary
       [not found]     ` <mailman.5186.1543978155.1284.help-gnu-emacs@gnu.org>
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2018-12-05  2:32 UTC (permalink / raw)
  To: Robert Thorpe, Barry Margolin; +Cc: help-gnu-emacs

> I think the modern learner will expect "setq" to
> do what "let" does unless told otherwise.

"Modern learner"...  Why not just say Lisp learner? ;-)

How/why is "the modern learner" different here from
the learner of 2008, 1998, 1988, or 1978?  (Or `68
or `58, for that matter?)  Am I missing something?

Lexically bound, "ordinary", local variables are as
old as Fortran - nay, assembler.  Nothing particularly
modern about them, or about folks who are used to only
them.  They were even added to Lisp as long ago as the
'70s (at least).

Lisp is typically not a Lisp learner's first language.
Gunk accumulated on eyeballs can need to be scraped
off, to see more easily and clearly.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
  2018-12-05  2:32     ` Drew Adams
@ 2018-12-05  6:45       ` Jean-Christophe Helary
  2018-12-05  8:00         ` Marcin Borkowski
                           ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Jean-Christophe Helary @ 2018-12-05  6:45 UTC (permalink / raw)
  To: help-gnu-emacs



> On Dec 5, 2018, at 11:32, Drew Adams <drew.adams@oracle.com> wrote:
> 
> Lisp is typically not a Lisp learner's first language.

I'm straying off topic here but let me suggest that emacs could (and is) used by first learners and that the Introduction could be used as a Lisp manual for such people.

Hence the need to clarify things and slightly bridge the gap between the Introduction and the Reference.

There is nothing intrinsically difficult to emacs lisp, compared to a language (and ecosystem) like AppleScript that *is* advertised as a first learner language, even though both target the same class of people: users who need to do automation on their machine.

That's exactly the spirit of what Stallman wrote when he referred to secretaries who were not conscious of doing "programming" but were still writing programs in Emacs.

Jean-Christophe Helary
-----------------------------------------------
http://mac4translators.blogspot.com @brandelune




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
  2018-12-05  6:45       ` Jean-Christophe Helary
@ 2018-12-05  8:00         ` Marcin Borkowski
  2018-12-05  8:11           ` Jean-Christophe Helary
  2018-12-05 14:57         ` Drew Adams
       [not found]         ` <mailman.5218.1544021892.1284.help-gnu-emacs@gnu.org>
  2 siblings, 1 reply; 838+ messages in thread
From: Marcin Borkowski @ 2018-12-05  8:00 UTC (permalink / raw)
  To: Jean-Christophe Helary; +Cc: help-gnu-emacs


On 2018-12-05, at 07:45, Jean-Christophe Helary <brandelune@gmail.com> wrote:

>> On Dec 5, 2018, at 11:32, Drew Adams <drew.adams@oracle.com> wrote:
>>
>> Lisp is typically not a Lisp learner's first language.
>
> I'm straying off topic here but let me suggest that emacs could (and is) used by first learners and that the Introduction could be used as a Lisp manual for such people.
>
> Hence the need to clarify things and slightly bridge the gap between the Introduction and the Reference.
>
> There is nothing intrinsically difficult to emacs lisp, compared to a language (and ecosystem) like AppleScript that *is* advertised as a first learner language, even though both target the same class of people: users who need to do automation on their machine.
>
> That's exactly the spirit of what Stallman wrote when he referred to secretaries who were not conscious of doing "programming" but were still writing programs in Emacs.

+1 to all Jean-Christophe says.

And your emails make really want to get back to work on my intermediate
Elisp textbook...  (I have to finish another book I'm writing right now,
especially that I'm a coauthor and expected to work rather hard on it.)

Best,

--
Marcin Borkowski
http://mbork.pl



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
  2018-12-05  8:00         ` Marcin Borkowski
@ 2018-12-05  8:11           ` Jean-Christophe Helary
  0 siblings, 0 replies; 838+ messages in thread
From: Jean-Christophe Helary @ 2018-12-05  8:11 UTC (permalink / raw)
  To: help-gnu-emacs



> On Dec 5, 2018, at 17:00, Marcin Borkowski <mbork@mbork.pl> wrote:
> 
> And your emails make really want to get back to work on my intermediate
> Elisp textbook...  (I have to finish another book I'm writing right now,
> especially that I'm a coauthor and expected to work rather hard on it.)

Marcin,

I'm actually working on a rewrite of the Introduction, as I progress through it. It's hard because I need to write code (and play with the kids, and work) more than I have time to read the book and write additional pages...

I feel like a lot of attempts at writing introductions do not reach their objectives because they are written by people who do not remember how it was when they needed the introduction... That's my feeling when I read the Introduction, even though I have a lot of respect for what Chassell did with that book.

Jean-Christophe Helary
-----------------------------------------------
http://mac4translators.blogspot.com @brandelune




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: using setq to create lists based on other lists...
  2018-12-05  6:45       ` Jean-Christophe Helary
  2018-12-05  8:00         ` Marcin Borkowski
@ 2018-12-05 14:57         ` Drew Adams
       [not found]         ` <mailman.5218.1544021892.1284.help-gnu-emacs@gnu.org>
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2018-12-05 14:57 UTC (permalink / raw)
  To: Jean-Christophe Helary, help-gnu-emacs

> > Lisp is typically not a Lisp learner's first language.
> 
> Emacs could (and is) used by first learners and ...
> the Introduction could be used as a Lisp manual for
> such people.

Yes, of course.

The point is that someone coming to Lisp from another
language, especially (and typically) from a language
where variables are essentially local & lexical, may
have a harder time "getting it" than someone learning
programming with Lisp as her first language.

Things like list structure (including, yes, sharing
structure), symbols (named objects with properties),
dynamic scope/binding, `setq' (which can act on both
global & local vars), and even REPL/interpretation
can seem quite odd if you come to Lisp with only C
or Java or ... eyes.

Years ago I would have added higher-order and
anonymous functions to the list.  Even more years
ago I would have added recursion to it.  Depending
on the languages you are used to, the list can vary.
But Lisp is not C or Java or Haskell or ...

FWIW, I came to Lisp (and to purely functional,
logic-programming, and OOP languages) from Fortran.
No recursion, no nothin' - nada.  Another planet.
But lots of variable-value/common-memory sharing.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
       [not found]   ` <mailman.5145.1543931778.1284.help-gnu-emacs@gnu.org>
@ 2018-12-05 16:47     ` Barry Margolin
  0 siblings, 0 replies; 838+ messages in thread
From: Barry Margolin @ 2018-12-05 16:47 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.5145.1543931778.1284.help-gnu-emacs@gnu.org>,
 Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> > There's nothing wrong with it in Emacs Lisp
> 
> Actually, there is in the sense that these are global variables and so
> can interfere with other Elisp packages.

Declaring the variable with defvar won't change that. Anyway, the code 
we're talking about is just example snippets, not a full program.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
       [not found]     ` <mailman.5186.1543978155.1284.help-gnu-emacs@gnu.org>
@ 2018-12-05 16:50       ` Barry Margolin
  0 siblings, 0 replies; 838+ messages in thread
From: Barry Margolin @ 2018-12-05 16:50 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.5186.1543978155.1284.help-gnu-emacs@gnu.org>,
 Drew Adams <drew.adams@oracle.com> wrote:

> Lisp is typically not a Lisp learner's first language.

It often was back in the days of Multics Emacs (30 years ago). It was 
pretty common for non-programmers to learn it so they could customize 
their editor. Although often they just learned enough to set a few 
customization variables, not write complex extensions; that's the kind 
of thing that's now automated with M-x customize.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: using setq to create lists based on other lists...
       [not found]         ` <mailman.5218.1544021892.1284.help-gnu-emacs@gnu.org>
@ 2018-12-05 16:59           ` Barry Margolin
  0 siblings, 0 replies; 838+ messages in thread
From: Barry Margolin @ 2018-12-05 16:59 UTC (permalink / raw)
  To: help-gnu-emacs

In article <mailman.5218.1544021892.1284.help-gnu-emacs@gnu.org>,
 Drew Adams <drew.adams@oracle.com> wrote:

> > > Lisp is typically not a Lisp learner's first language.
> > 
> > Emacs could (and is) used by first learners and ...
> > the Introduction could be used as a Lisp manual for
> > such people.
> 
> Yes, of course.
> 
> The point is that someone coming to Lisp from another
> language, especially (and typically) from a language
> where variables are essentially local & lexical, may
> have a harder time "getting it" than someone learning
> programming with Lisp as her first language.
> 
> Things like list structure (including, yes, sharing
> structure), symbols (named objects with properties),
> dynamic scope/binding, `setq' (which can act on both
> global & local vars), and even REPL/interpretation
> can seem quite odd if you come to Lisp with only C
> or Java or ... eyes.

If you come to it from Java, JavaScript, or Python it actually shouldn't 
be that hard; they all pass data as references to structures. C and C++ 
are the only popular languages with explicit pointers. PHP is in between 
-- arrays are copied, but objects are not.

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***


^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
@ 2019-04-21 19:30 Drew Adams
  2019-07-09 14:21 ` Lars Ingebrigtsen
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2019-04-21 19:30 UTC (permalink / raw)
  To: 35367

1. I believe `dired-copy-how-to-fn' was added to Emacs quite a while ago
   (1991[1]).  But it's not clear to me what it's really for, and there
   seem to be no uses of it in the distributed Emacs code, apart from
   `dired-do-copy', which just passes it on to `dired-create-files'.
   The variable's doc just says to "See HOW-TO argument for
   `dired-create-files'."

   So why was this variable created?

2. Apart from the variable, why was the HOW-TO arg of
   `dired-do-create-files' added?  I find no uses of it, apart from
   `dired-do-copy' (which just passes it along).

   Presumably someone thought that someone might want to pass such a
   thing to `dired-do-copy', but why?

   Half the doc of `dired-do-create-files' is for this parameter.  And
   its description, although probably correct and complete, reads like
   gobbledygook, to me.

   For one thing, the nil case should not be described under this
   parameter; it should be described as the function's default behavior,
   up above the parameter list.  (That's already 4 lines of its
   description.)

   Beyond that:

   * A value of `t' is unclear to me.  What does it mean to target a
     plain file - is this the same as using a `nil' value?  What happens
     with `t' if the target is a directory or if there are multiple
     marked files?  Is that where the difference lies somehow (how)?

   * A unary function value is the most confusing.  I can't follow it,
     I'm afraid.

   If HOW-TO is to stay (and I assume it is) then we really need some
   kind of motivating explanation - perhaps an example of why/when/how
   you would use a function here.  With no existing examples in the code
   this seems a bit
   maybe-someone-someday-might-need-this-thing-that-somebody-dreamed.

   It was apparently RMS who added this [1].  I'm surprised that it's
   not more clear what good it is.

[1] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=25075#20


In GNU Emacs 26.2 (build 1, x86_64-w64-mingw32)
 of 2019-04-13
Repository revision: fd1b34bfba8f3f6298df47c8e10b61530426f749
Windowing system distributor `Microsoft Corp.', version 10.0.17134
Configured using:
 `configure --without-dbus --host=x86_64-w64-mingw32
 --without-compress-install 'CFLAGS=-O2 -static -g3''





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
  2019-04-21 19:30 bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files' Drew Adams
@ 2019-07-09 14:21 ` Lars Ingebrigtsen
  2019-07-11  5:51   ` Mike Kupfer
  0 siblings, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2019-07-09 14:21 UTC (permalink / raw)
  To: Drew Adams; +Cc: 35367

Drew Adams <drew.adams@oracle.com> writes:

> 1. I believe `dired-copy-how-to-fn' was added to Emacs quite a while ago
>    (1991[1]).  But it's not clear to me what it's really for, and there
>    seem to be no uses of it in the distributed Emacs code, apart from
>    `dired-do-copy', which just passes it on to `dired-create-files'.
>    The variable's doc just says to "See HOW-TO argument for
>    `dired-create-files'."
>
>    So why was this variable created?

I hoped that the code might throw some light on this variable, but:

(defun dired-into-dir-with-symlinks (target)
  (and (file-directory-p target)
       (not (file-symlink-p target))))
;; This may not always be what you want, especially if target is your
;; home directory and it happens to be a symbolic link, as is often the
;; case with NFS and automounters.  Or if you want to make symlinks
;; into directories that themselves are only symlinks, also quite
;; common.

;; So we don't use this function as value for HOW-TO in
;; dired-do-symlink, which has the minor disadvantage of
;; making links *into* a symlinked-dir, when you really wanted to
;; *overwrite* that symlink.  In that (rare, I guess) case, you'll
;; just have to remove that symlink by hand before making your marked
;; symlinks.

(defvar dired-copy-how-to-fn nil
  "Either nil or a function used by `dired-do-copy' to determine target.
See HOW-TO argument for `dired-do-create-files'.")

It's still clear as mud to me.

> 2. Apart from the variable, why was the HOW-TO arg of
>    `dired-do-create-files' added?  I find no uses of it, apart from
>    `dired-do-copy' (which just passes it along).
>
>    Presumably someone thought that someone might want to pass such a
>    thing to `dired-do-copy', but why?
>
>    Half the doc of `dired-do-create-files' is for this parameter.  And
>    its description, although probably correct and complete, reads like
>    gobbledygook, to me.
>
>    For one thing, the nil case should not be described under this
>    parameter; it should be described as the function's default behavior,
>    up above the parameter list.  (That's already 4 lines of its
>    description.)

Well...  I think it makes sense (in so far as this parameter makes any
sense) to keep it where it is:

Optional arg HOW-TO determines how to treat the target.
  If HOW-TO is nil, use `file-directory-p' to determine if the
   target is a directory.  If so, the marked file(s) are created
   inside that directory.  Otherwise, the target is a plain file;
   an error is raised unless there is exactly one marked file.
  If HOW-TO is t, target is always treated as a plain file.
  Otherwise, HOW-TO should be a function of one argument, TARGET.
   If its return value is nil, TARGET is regarded as a plain file.
   If it return value is a list, TARGET is a generalized
    directory (e.g. some sort of archive).  The first element of
    this list must be a function with at least four arguments:
      operation - as OPERATION above.
      rfn-list  - list of the relative names for the marked files.
      fn-list   - list of the absolute names for the marked files.
      target    - the name of the target itself.
    The rest of elements of the list returned by HOW-TO are optional
    arguments for the function that is the first element of the list.
   For any other return value, TARGET is treated as a directory."


>    Beyond that:
>
>    * A value of `t' is unclear to me.  What does it mean to target a
>      plain file - is this the same as using a `nil' value?  What happens
>      with `t' if the target is a directory or if there are multiple
>      marked files?  Is that where the difference lies somehow (how)?

My interpretation of t is that all files you copy will up in the same
file if it's t, which is a supremely useless thing, you'd think...

>    It was apparently RMS who added this [1].  I'm surprised that it's
>    not more clear what good it is.

Does anybody know what this parameter and variable was meant to do, and
whether it's used anywhere out-of-tree?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
  2019-07-09 14:21 ` Lars Ingebrigtsen
@ 2019-07-11  5:51   ` Mike Kupfer
  2019-07-11 14:04     ` Lars Ingebrigtsen
                       ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Mike Kupfer @ 2019-07-11  5:51 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 35367

Lars Ingebrigtsen wrote:

> Drew Adams <drew.adams@oracle.com> writes:
> 
> > 1. I believe `dired-copy-how-to-fn' was added to Emacs quite a while ago
> >    (1991[1]).

lisp/ChangeLog.8 in the 25.3 tarball attributes the change to Inge
Frick, with a date of 1999-09-14 (a couple days before the date listed
in bug#25075).

> > But it's not clear to me what it's really for, and there
> >    seem to be no uses of it in the distributed Emacs code, apart from
> >    `dired-do-copy', which just passes it on to `dired-create-files'.
> >    The variable's doc just says to "See HOW-TO argument for
> >    `dired-create-files'."
> >
> >    So why was this variable created?

Presumably it's so you could override dired's behavior for handling a
target.  If the target is a symlink to a directory, the default behavior
would be to treat it as a directory, but maybe there are cases where you
want to replace the link instead.

The bit about

   If it return value is a list, TARGET is a generalized
    directory (e.g. some sort of archive).  The first element of
    this list must be a function with at least four arguments:

looks like it might be useful when the target is, for example, a tar
file.  By default, copying a single file would replace the tar file.
But this could be overridden (I think) to add or replace entries in the
tar file.

Besides the possibility of a user setting dired-copy-how-to-fn, I can
imagine a package might want to dynamically rebind dired-copy-how-to-fn,
perhaps as a buffer-local variable in a dired buffer.  (I'm not sure
what sort of package might want to do that, but it seems like a possible
reason for having a variable.)

> I hoped that the code might throw some light on this variable, but:
> 
> (defun dired-into-dir-with-symlinks (target)
>   (and (file-directory-p target)
>        (not (file-symlink-p target))))
> ;; This may not always be what you want, especially if target is your
> ;; home directory and it happens to be a symbolic link, as is often the
> ;; case with NFS and automounters.  Or if you want to make symlinks
> ;; into directories that themselves are only symlinks, also quite
> ;; common.
> 
> ;; So we don't use this function as value for HOW-TO in
> ;; dired-do-symlink, which has the minor disadvantage of
> ;; making links *into* a symlinked-dir, when you really wanted to
> ;; *overwrite* that symlink.  In that (rare, I guess) case, you'll
> ;; just have to remove that symlink by hand before making your marked
> ;; symlinks.
> 
> (defvar dired-copy-how-to-fn nil
>   "Either nil or a function used by `dired-do-copy' to determine target.
> See HOW-TO argument for `dired-do-create-files'.")
> 
> It's still clear as mud to me.

dired-into-dir-with-symlinks returns t if TARGET is a real directory.
It returns nil if TARGET is a plain file or a symlink to a directory.
The first generation automounter(s) mounted your home directory in a
temporary directory and then created a symlink to the mounted directory.
But $HOME would be the path to the symlink.

> My interpretation of t is that all files you copy will up in the same
> file if it's t, which is a supremely useless thing, you'd think...

No, you can only copy one file if the target is a plain file.  From
earlier in the docstring for dired-do-create-files:

    The target may also be a non-directory file, if only
    one file is marked.

Maybe this sentence should be deleted:

    Otherwise, the target is a plain file;
    an error is raised unless there is exactly one marked file.

The way the docstring is currently written, it seems to imply that the
error only gets raised in the case where HOW-TO is nil.

I agree that this is all very complicated and confusing.  It doesn't
help that if HOW-TO is t, the target is treated as a plain file.  But if
HOW-TO is a function, it returns nil to indicate a plain file.

mike






^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
  2019-07-11  5:51   ` Mike Kupfer
@ 2019-07-11 14:04     ` Lars Ingebrigtsen
  2019-07-11 14:18     ` Drew Adams
  2022-01-22 14:43     ` Lars Ingebrigtsen
  2 siblings, 0 replies; 838+ messages in thread
From: Lars Ingebrigtsen @ 2019-07-11 14:04 UTC (permalink / raw)
  To: Mike Kupfer; +Cc: 35367

Mike Kupfer <mkupfer@alum.berkeley.edu> writes:

> Presumably it's so you could override dired's behavior for handling a
> target.  If the target is a symlink to a directory, the default behavior
> would be to treat it as a directory, but maybe there are cases where you
> want to replace the link instead.

Ah, I see.

[More useful explanation deleted; thanks for figuring it out.]

>> My interpretation of t is that all files you copy will up in the same
>> file if it's t, which is a supremely useless thing, you'd think...
>
> No, you can only copy one file if the target is a plain file.  From
> earlier in the docstring for dired-do-create-files:
>
>     The target may also be a non-directory file, if only
>     one file is marked.
>
> Maybe this sentence should be deleted:
>
>     Otherwise, the target is a plain file;
>     an error is raised unless there is exactly one marked file.
>
> The way the docstring is currently written, it seems to imply that the
> error only gets raised in the case where HOW-TO is nil.
>
> I agree that this is all very complicated and confusing.  It doesn't
> help that if HOW-TO is t, the target is treated as a plain file.  But if
> HOW-TO is a function, it returns nil to indicate a plain file.

Could you perhaps propose a rewrite of the doc string here to make it
more understandable; both what it does and say when it might be useful?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
  2019-07-11  5:51   ` Mike Kupfer
  2019-07-11 14:04     ` Lars Ingebrigtsen
@ 2019-07-11 14:18     ` Drew Adams
  2019-07-12  3:20       ` Mike Kupfer
  2022-01-22 14:43     ` Lars Ingebrigtsen
  2 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2019-07-11 14:18 UTC (permalink / raw)
  To: Mike Kupfer, Lars Ingebrigtsen; +Cc: 35367

Thanks, Mike.  I probably would never have
figured out all of that.

Kinda seems odd that we'd have created a
variable for something that someone _might_
want to do (but probably never has done).

Usually, when someone proposes something
like that it gets rejected as fulfilling
only a hypothetical need.

Anyway, if the variable will stay then it
would be great if the doc could be fixed
a bit, based on some of what you said here.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
  2019-07-11 14:18     ` Drew Adams
@ 2019-07-12  3:20       ` Mike Kupfer
  2019-07-12  3:33         ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Mike Kupfer @ 2019-07-12  3:20 UTC (permalink / raw)
  To: Drew Adams; +Cc: 35367, Lars Ingebrigtsen

Drew Adams wrote:

> Kinda seems odd that we'd have created a
> variable for something that someone _might_
> want to do (but probably never has done).
> 
> Usually, when someone proposes something
> like that it gets rejected as fulfilling
> only a hypothetical need.

Indeed.  Maybe there were consumers of dired-copy-how-to-fn back in the
1990s.  While poking around in the sources I noticed a comment in
vc-dir.el saying that it *used to be* based on dired.  (Or maybe whoever
was the Emacs maintainer at the time thought dired-copy-how-to-fn was a
cool idea and didn't insist on having a consumer for it.)

> Anyway, if the variable will stay then it
> would be great if the doc could be fixed
> a bit, based on some of what you said here.

I can try proposing clearer wording for the dired-do-create-files
docstring, though it'll probably be several days before I can get to it.

I want to be cautious about proposing ways to use dired-copy-how-to-fn.
My earlier comments were based on my reading of the documentation and a
tiny bit of testing.  I wasn't involved with Emacs development when the
dired how-to stuff was introduced, so I don't have any special insights
into what the thinking was at the time.  Though the more I think about
my tarfile example, the more I think it'd be a fun little hack.

mike





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
  2019-07-12  3:20       ` Mike Kupfer
@ 2019-07-12  3:33         ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2019-07-12  3:33 UTC (permalink / raw)
  To: Mike Kupfer; +Cc: 35367, Lars Ingebrigtsen

> > Kinda seems odd that we'd have created a
> > variable for something that someone _might_
> > want to do (but probably never has done).
> >
> > Usually, when someone proposes something
> > like that it gets rejected as fulfilling
> > only a hypothetical need.
> 
> Indeed.  Maybe there were consumers of dired-copy-how-to-fn back in the
> 1990s.  While poking around in the sources I noticed a comment in
> vc-dir.el saying that it *used to be* based on dired.  (Or maybe whoever
> was the Emacs maintainer at the time thought dired-copy-how-to-fn was a
> cool idea and didn't insist on having a consumer for it.)
> 
> > Anyway, if the variable will stay then it
> > would be great if the doc could be fixed
> > a bit, based on some of what you said here.
> 
> I can try proposing clearer wording for the dired-do-create-files
> docstring, though it'll probably be several days before I can get to it.
> 
> I want to be cautious about proposing ways to use dired-copy-how-to-fn.
> My earlier comments were based on my reading of the documentation and a
> tiny bit of testing.  I wasn't involved with Emacs development when the
> dired how-to stuff was introduced, so I don't have any special insights
> into what the thinking was at the time.  Though the more I think about
> my tarfile example, the more I think it'd be a fun little hack.

Sounds good.  I don't think you have to worry
about hurrying.  Instead of several days it
could probably be several years (decades?)
without anyone noticing. ;-)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2)
       [not found] ` <20200515175845.997EC20999@vcs0.savannah.gnu.org>
@ 2020-05-15 18:38   ` Stefan Monnier
  2020-05-15 20:58     ` Stefan Kangas
                       ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-05-15 18:38 UTC (permalink / raw)
  To: emacs-devel; +Cc: Stefan Kangas

>     Delete libraries obsolete since 23.1 and 23.2

Thanks Stefan.

I did a quick `grep` to see the functions/vars that were obsoleted in
the same time frame, and I saw instead a deluge of

    :version "23.1"

If we consider those thingies old enough to remove their obsolete
functions, shouldn't we also remove the corresponding `:version`
thingies from `defcustom`s?

I see:
- 1 defcustom with a :version of 19.29
- >200 defcustoms with a :version of 20.x
- a bit less than 200 defcustoms with a :version of 21.x
- >400 defcustoms with a :version of 22.x
- >200 defcustoms with a :version of 23.x


-- Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2)
  2020-05-15 18:38   ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Monnier
@ 2020-05-15 20:58     ` Stefan Kangas
  2020-08-07 15:42       ` [PATCH] Remove obsolete fast-lock and lazy-lock libraries (was: Re: Deleting old `:version` from defcustoms) Stefan Kangas
  2020-05-16 13:18     ` Delete variables obsolete since Emacs 23 Stefan Kangas
  2020-05-17  3:18     ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Kangas
  2 siblings, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-05-15 20:58 UTC (permalink / raw)
  To: Stefan Monnier, emacs-devel

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

> I did a quick `grep` to see the functions/vars that were obsoleted in
> the same time frame, and I saw instead a deluge of
>
>     :version "23.1"
>
> If we consider those thingies old enough to remove their obsolete
> functions, shouldn't we also remove the corresponding `:version`
> thingies from `defcustom`s?

There are also these two libraries:

./lisp/obsolete/fast-lock.el9:;; Obsolete-since: 22.1
./lisp/obsolete/lazy-lock.el9:;; Obsolete-since: 22.1

For some reason they weren't removed in 27.1, when most other libraries
obsolete since 22.x were deleted.  This made me wonder if there was any
particular reason for their non-removal.  Does anyone know?  And could
we delete them now?

Best regards,
Stefan Kangas



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Delete variables obsolete since Emacs 23
  2020-05-15 18:38   ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Monnier
  2020-05-15 20:58     ` Stefan Kangas
@ 2020-05-16 13:18     ` Stefan Kangas
  2020-05-16 15:49       ` Paul Eggert
                         ` (2 more replies)
  2020-05-17  3:18     ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Kangas
  2 siblings, 3 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-05-16 13:18 UTC (permalink / raw)
  To: Stefan Monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1144 bytes --]

I've attached a patch which removes most variables declared obsolete in
Emacs 23.1.  I tried following the style in Glenn's commit f1c48b0ec5
which does the same for Emacs 22.1.

1. There is a small number of variables declared obsolete in 23.2, 23.3
   and 23.4.  I think we can remove them in a subsequent patch.

2. I was not able to untangle how to remove this, and so left it alone
   for now:

   * lisp/net/newst-backend.el (newsticker-cache-filename)

3. Note the added FIXME in `vc-default-working-revision', where I'm not
   sure if it should be declared obsolete or not.  See Stefan M's commit
   6e5d0e9e73.

4. The variable `translation-table-for-input' was declared obsolete with
   in Emacs 23.1 and has the following comment.  I'm not sure what to do
   about it, if anything.

   ;; This was introduced in 21.4 for pre-unicode unification.  That
   ;; usage was rendered obsolete in 23.1, which uses Unicode internally.
   ;; Other uses are possible, so this variable is not _really_ obsolete,
   ;; but Stefan insists to mark it so.

Other than that, does the attached patch look okay for master?

Best regards,
Stefan Kangas

[-- Attachment #2: 0001-Remove-many-items-obsolete-since-Emacs-23.1.patch --]
[-- Type: text/x-diff, Size: 50121 bytes --]

From 993fd6697972f99d503385aec1f5012a573af41c Mon Sep 17 00:00:00 2001
From: Stefan Kangas <stefankangas@gmail.com>
Date: Sat, 16 May 2020 14:16:24 +0200
Subject: [PATCH] Remove many items obsolete since Emacs 23.1

Emacs 23.1 was five major releases and over a decade ago.
This list can be reviewed before to the next release, but for now
hopefully this motivates any needed external updates.

* lisp/abbrev.el (pre-abbrev-expand-hook):
* lisp/bookmark.el (bookmark-read-annotation-text-func)
(bookmark-jump-noselect):
* lisp/buff-menu.el (buffer-menu-mode-hook):
* lisp/cus-edit.el (custom-mode-hook, custom-mode):
* lisp/dirtrack.el (dirtrack-debug-toggle, dirtrack-debug):
* lisp/emacs-lisp/crm.el (crm-minibuffer-complete)
(crm-minibuffer-completion-help)
(crm-minibuffer-complete-and-exit):
* lisp/emacs-lisp/easymenu.el
(easy-menu-precalculate-equivalent-keybindings):
* lisp/emacs-lisp/lisp-mode.el (lisp-mode-auto-fill):
* lisp/epa.el (epa-display-verify-result):
* lisp/epg.el (epg-passphrase-callback-function):
* lisp/eshell/eshell.el (eshell-report-bug):
* lisp/ffap.el (ffap-bug, ffap-submit-bug):
* lisp/files.el (locate-file-completion):
* lisp/hi-lock.el (hi-lock-face-history, hi-lock-regexp-history):
* lisp/hilit-chg.el (highlight-changes-initial-state)
(highlight-changes-active-string)
(highlight-changes-passive-string, global-highlight-changes):
* lisp/international/mule-cmds.el (nonascii-insert-offset)
(nonascii-translation-table):
* lisp/international/mule-diag.el (non-iso-charset-alist):
* lisp/international/mule-util.el (detect-coding-with-priority):
* lisp/international/mule.el (charset-id, charset-bytes)
(charset-list, char-valid-p, generic-char-p)
(char-coding-system-table, make-coding-system)
(set-coding-priority)
* lisp/mail/rmail.el (rmail-message-filter):
* lisp/minibuffer.el (complete-in-turn, dynamic-completion-table)
(completion-common-substring)
(minibuffer-local-must-match-filename-map):
* lisp/mouse.el (mouse-major-mode-menu, mouse-popup-menubar)
(mouse-popup-menubar-stuff):
* lisp/net/newst-treeview.el (newsticker-groups-filename):
* lisp/obsolete/tpu-edt.el (tpu-have-ispell, GOLD-map):
* lisp/obsolete/vc-arch.el (vc-arch-command):
* lisp/password-cache.el (password-read-and-add):
* lisp/shell.el (shell-dirtrack-toggle):
* lisp/subr.el (forward-point, define-key-rebound-commands)
(redisplay-end-trigger-functions, window-redisplay-end-trigger)
(set-window-redisplay-end-trigger, process-filter-multibyte-p)
(set-process-filter-multibyte):
* lisp/t-mouse.el (t-mouse-mode):
* lisp/term/w32-win.el (w32-focus-frame, w32-select-font):
* lisp/textmodes/ispell.el (ispell-aspell-supports-utf8):
* lisp/textmodes/remember.el (remember-buffer):
* lisp/tooltip.el (tooltip-hook):
* lisp/url/url-util.el (url-generate-unique-filename):
* lisp/url/url-vars.el (url-temporary-directory):
* lisp/vc/vc-hooks.el (vc-workfile-version):
* lisp/vc/vc-mtn.el (vc-mtn-command):
* lisp/vc/vc.el (vc-revert-buffer):
* lisp/vcursor.el (vcursor-toggle-vcursor-map):
Remove items, obsolete since Emacs 23.1.
* lisp/abbrev.el (expand-abbrev):
Don't run removed hook 'pre-abbrev-expand-hook'.
* lisp/cedet/semantic/wisent/wisent.el:
* lisp/progmodes/idlwave.el:
Update reference to removed function 'char-valid-p'.
* lisp/gnus/mml2015.el (epg-encrypt-string):
* lisp/gnus/mml1991.el (epg-make-context):
* lisp/gnus/mml-smime.el (autoload):
Remove autoload of removed 'epg-passphrase-callback-function'.
* lisp/minibuffer.el (completion-extra-properties):
Remove support for `completion-common-substring'.
* lisp/obsolete/tpu-edt.el (tpu-toggle-overwrite-mode)
Remove support for removed `spell' package.
; * etc/NEWS: List removed items.
---
 etc/NEWS                             |  34 +++++++
 lisp/abbrev.el                       |  10 --
 lisp/bookmark.el                     |  13 ---
 lisp/buff-menu.el                    |   3 -
 lisp/cedet/semantic/wisent/wisent.el |   6 +-
 lisp/cus-edit.el                     |   4 -
 lisp/dirtrack.el                     |   3 -
 lisp/emacs-lisp/crm.el               |   6 --
 lisp/emacs-lisp/easymenu.el          |  10 --
 lisp/emacs-lisp/lisp-mode.el         |   2 -
 lisp/epa.el                          |   4 -
 lisp/epg.el                          |  13 ---
 lisp/eshell/eshell.el                |   9 --
 lisp/ffap.el                         |   6 --
 lisp/files.el                        |   8 --
 lisp/gnus/mml-smime.el               |   1 -
 lisp/gnus/mml1991.el                 |   1 -
 lisp/gnus/mml2015.el                 |   1 -
 lisp/hi-lock.el                      |   6 --
 lisp/hilit-chg.el                    |  16 ----
 lisp/international/mule-cmds.el      |   5 -
 lisp/international/mule-diag.el      |   4 -
 lisp/international/mule-util.el      |   9 --
 lisp/international/mule.el           | 134 ---------------------------
 lisp/mail/rmail.el                   |  19 ----
 lisp/minibuffer.el                   |  18 +---
 lisp/mouse.el                        |  28 ------
 lisp/net/newst-treeview.el           |  30 +-----
 lisp/obsolete/tpu-edt.el             |  12 +--
 lisp/obsolete/vc-arch.el             |   2 -
 lisp/password-cache.el               |  16 ----
 lisp/progmodes/idlwave.el            |   2 -
 lisp/shell.el                        |   3 -
 lisp/subr.el                         |  11 ---
 lisp/t-mouse.el                      |   2 -
 lisp/term/w32-win.el                 |   4 -
 lisp/textmodes/ispell.el             |   9 --
 lisp/textmodes/remember.el           |   3 -
 lisp/tooltip.el                      |   2 -
 lisp/url/url-util.el                 |  25 -----
 lisp/url/url-vars.el                 |   7 --
 lisp/vc/vc-hooks.el                  |   3 +-
 lisp/vc/vc-mtn.el                    |   1 -
 lisp/vc/vc.el                        |   3 -
 lisp/vcursor.el                      |   3 -
 45 files changed, 41 insertions(+), 470 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index b93199f362..0e3791e13a 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -401,6 +401,40 @@ Use macro 'with-current-buffer-window' with action alist entry 'body-function'.
 ** Some libraries obsolete since Emacs 23 have been removed:
 'ledit.el', 'lmenu.el', 'lucid.el and 'old-whitespace.el'.
 
+---
+** Some functions and variables obsolete since Emacs 23 have been removed:
+'GOLD-map', 'bookmark-jump-noselect',
+'bookmark-read-annotation-text-func', 'buffer-menu-mode-hook',
+'char-coding-system-table', 'char-valid-p', 'charset-bytes',
+'charset-id', 'charset-list', 'complete-in-turn',
+'completion-common-substring', 'crm-minibuffer-complete',
+'crm-minibuffer-complete-and-exit', 'crm-minibuffer-completion-help',
+'custom-mode', 'custom-mode-hook', 'define-key-rebound-commands',
+'detect-coding-with-priority', 'dirtrack-debug',
+'dirtrack-debug-toggle', 'dynamic-completion-table',
+'easy-menu-precalculate-equivalent-keybindings',
+'epa-display-verify-result', 'epg-passphrase-callback-function',
+'eshell-report-bug', 'ffap-bug', 'ffap-submit-bug', 'forward-point',
+'generic-char-p', 'global-highlight-changes', 'hi-lock-face-history',
+'hi-lock-regexp-history', 'highlight-changes-active-string',
+'highlight-changes-initial-state', 'highlight-changes-passive-string',
+'ispell-aspell-supports-utf8', 'lisp-mode-auto-fill',
+'locate-file-completion', 'make-coding-system',
+'minibuffer-local-must-match-filename-map', 'mouse-major-mode-menu',
+'mouse-popup-menubar', 'mouse-popup-menubar-stuff',
+'newsticker-groups-filename', 'non-iso-charset-alist',
+'nonascii-insert-offset', 'nonascii-translation-table',
+'password-read-and-add', 'pre-abbrev-expand-hook',
+'process-filter-multibyte-p', 'redisplay-end-trigger-functions',
+'remember-buffer', 'rmail-message-filter', 'set-coding-priority',
+'set-process-filter-multibyte', 'set-window-redisplay-end-trigger',
+'shell-dirtrack-toggle', 't-mouse-mode', 'tooltip-hook',
+'tpu-have-ispell', 'url-generate-unique-filename',
+'url-temporary-directory', 'vc-arch-command', 'vc-mtn-command',
+'vc-revert-buffer', 'vc-workfile-version',
+'vcursor-toggle-vcursor-map', 'w32-focus-frame', 'w32-select-font',
+'window-redisplay-end-trigger'.
+
 \f
 * Lisp Changes in Emacs 28.1
 
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index 190b3504fa..6fcaa52d46 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -521,14 +521,6 @@ last-abbrev-location
 ;;   "Local (mode-specific) abbrev table of current buffer.")
 ;; (make-variable-buffer-local 'local-abbrev-table)
 
-(defcustom pre-abbrev-expand-hook nil
-  "Function or functions to be called before abbrev expansion is done.
-This is the first thing that `expand-abbrev' does, and so this may change
-the current abbrev table before abbrev lookup happens."
-  :type 'hook
-  :group 'abbrev-mode)
-(make-obsolete-variable 'pre-abbrev-expand-hook 'abbrev-expand-function "23.1")
-
 (defun clear-abbrev-table (table)
   "Undefine all abbrevs in abbrev table TABLE, leaving it empty."
   (setq abbrevs-changed t)
@@ -840,12 +832,10 @@ abbrev-expand-function
 (defun expand-abbrev ()
   "Expand the abbrev before point, if there is an abbrev there.
 Effective when explicitly called even when `abbrev-mode' is nil.
-Before doing anything else, runs `pre-abbrev-expand-hook'.
 Calls the value of `abbrev-expand-function' with no argument to do
 the work, and returns whatever it does.  (That return value should
 be the abbrev symbol if expansion occurred, else nil.)"
   (interactive)
-  (run-hooks 'pre-abbrev-expand-hook)
   (funcall abbrev-expand-function))
 
 (defun abbrev--default-expand ()
diff --git a/lisp/bookmark.el b/lisp/bookmark.el
index 0fa77ed322..f4580cd36e 100644
--- a/lisp/bookmark.el
+++ b/lisp/bookmark.el
@@ -922,8 +922,6 @@ bookmark-default-annotation-text
 	  "#  Date:    " (current-time-string) "\n"))
 
 
-(define-obsolete-variable-alias 'bookmark-read-annotation-text-func
-  'bookmark-edit-annotation-text-func "23.1")
 (defvar bookmark-edit-annotation-text-func 'bookmark-default-annotation-text
   "Function to return default text to use for a bookmark annotation.
 It takes one argument, the name of the bookmark, as a string.")
@@ -1142,17 +1140,6 @@ bookmark-jump-other-frame
   (let ((pop-up-frames t))
     (bookmark-jump-other-window bookmark)))
 
-(defun bookmark-jump-noselect (bookmark)
-  "Return the location pointed to by BOOKMARK (see `bookmark-jump').
-The return value has the form (BUFFER . POINT).
-
-Note: this function is deprecated and is present for Emacs 22
-compatibility only."
-  (declare (obsolete bookmark-handle-bookmark "23.1"))
-  (save-excursion
-    (bookmark-handle-bookmark bookmark)
-    (cons (current-buffer) (point))))
-
 (defun bookmark-handle-bookmark (bookmark-name-or-record)
   "Call BOOKMARK-NAME-OR-RECORD's handler or `bookmark-default-handler'
 if it has none.  This changes current buffer and point and returns nil,
diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el
index 655a76a713..9f8cdce4a2 100644
--- a/lisp/buff-menu.el
+++ b/lisp/buff-menu.el
@@ -214,9 +214,6 @@ Buffer-menu-mode-map
     map)
   "Local keymap for `Buffer-menu-mode' buffers.")
 
-(define-obsolete-variable-alias 'buffer-menu-mode-hook
-  'Buffer-menu-mode-hook "23.1")
-
 (define-derived-mode Buffer-menu-mode tabulated-list-mode "Buffer Menu"
   "Major mode for Buffer Menu buffers.
 The Buffer Menu is invoked by the commands \\[list-buffers],
diff --git a/lisp/cedet/semantic/wisent/wisent.el b/lisp/cedet/semantic/wisent/wisent.el
index d8a35d3e7d..3ec1cae020 100644
--- a/lisp/cedet/semantic/wisent/wisent.el
+++ b/lisp/cedet/semantic/wisent/wisent.el
@@ -55,10 +55,10 @@ wisent
 ;;;; Runtime stuff
 ;;;; -------------
 
-;;; Compatibility
+;;; XEmacs Compatibility
 (eval-and-compile
-  (if (fboundp 'char-valid-p)
-      (defalias 'wisent-char-p 'char-valid-p)
+  (if (fboundp 'characterp)
+      (defalias 'wisent-char-p 'characterp)
     (defalias 'wisent-char-p 'char-or-char-int-p)))
 
 ;;; Printed representation of terminals and nonterminals
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 1ec2708550..171c27c945 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -4864,8 +4864,6 @@ Custom-goto-parent
 	       (parent (downcase (widget-get  button :tag))))
 	  (customize-group parent)))))
 
-(define-obsolete-variable-alias 'custom-mode-hook 'Custom-mode-hook "23.1")
-
 (defcustom Custom-mode-hook nil
   "Hook called when entering Custom mode."
   :type 'hook
@@ -4936,8 +4934,6 @@ Custom-mode
 
 (put 'Custom-mode 'mode-class 'special)
 
-(define-obsolete-function-alias 'custom-mode 'Custom-mode "23.1")
-
 ;;; The End.
 
 (provide 'cus-edit)
diff --git a/lisp/dirtrack.el b/lisp/dirtrack.el
index 3a0bbd2c9c..ad0c18d1b3 100644
--- a/lisp/dirtrack.el
+++ b/lisp/dirtrack.el
@@ -196,9 +196,6 @@ dirtrack-mode
     (remove-hook 'comint-preoutput-filter-functions 'dirtrack t)))
 
 
-(define-obsolete-function-alias 'dirtrack-debug-toggle 'dirtrack-debug-mode
-  "23.1")
-(define-obsolete-variable-alias 'dirtrack-debug 'dirtrack-debug-mode "23.1")
 (define-minor-mode dirtrack-debug-mode
   "Toggle Dirtrack debugging."
   nil nil nil
diff --git a/lisp/emacs-lisp/crm.el b/lisp/emacs-lisp/crm.el
index 65483d0813..89d106ee48 100644
--- a/lisp/emacs-lisp/crm.el
+++ b/lisp/emacs-lisp/crm.el
@@ -270,12 +270,6 @@ completing-read-multiple
     (remove-hook 'choose-completion-string-functions
 		 'crm--choose-completion-string)))
 
-(define-obsolete-function-alias 'crm-minibuffer-complete 'crm-complete "23.1")
-(define-obsolete-function-alias
-  'crm-minibuffer-completion-help 'crm-completion-help "23.1")
-(define-obsolete-function-alias
-  'crm-minibuffer-complete-and-exit 'crm-complete-and-exit "23.1")
-
 ;; testing and debugging
 ;; (defun crm-init-test-environ ()
 ;;   "Set up some variables for testing."
diff --git a/lisp/emacs-lisp/easymenu.el b/lisp/emacs-lisp/easymenu.el
index 6ba8b997f8..73dabef3fa 100644
--- a/lisp/emacs-lisp/easymenu.el
+++ b/lisp/emacs-lisp/easymenu.el
@@ -29,16 +29,6 @@
 
 ;;; Code:
 
-(defvar easy-menu-precalculate-equivalent-keybindings nil
-  "Determine when equivalent key bindings are computed for easy-menu menus.
-It can take some time to calculate the equivalent key bindings that are shown
-in a menu.  If the variable is on, then this calculation gives a (maybe
-noticeable) delay when a mode is first entered.  If the variable is off, then
-this delay will come when a menu is displayed the first time.  If you never use
-menus, turn this variable off, otherwise it is probably better to keep it on.")
-(make-obsolete-variable
- 'easy-menu-precalculate-equivalent-keybindings nil "23.1")
-
 (defsubst easy-menu-intern (s)
   (if (stringp s) (intern s) s))
 
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 7098a41f27..8d3b357a7f 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -785,8 +785,6 @@ lisp-comment-indent
             nil)))
       (comment-indent-default)))
 
-(define-obsolete-function-alias 'lisp-mode-auto-fill 'do-auto-fill "23.1")
-
 (defcustom lisp-indent-offset nil
   "If non-nil, indent second line of expressions that many more columns."
   :group 'lisp
diff --git a/lisp/epa.el b/lisp/epa.el
index 8ec4218735..68c472f3f5 100644
--- a/lisp/epa.el
+++ b/lisp/epa.el
@@ -631,10 +631,6 @@ epa-display-error
 	  (goto-char (point-min)))
 	(display-buffer buffer)))))
 
-(defun epa-display-verify-result (verify-result)
-  (declare (obsolete epa-display-info "23.1"))
-  (epa-display-info (epg-verify-result-to-string verify-result)))
-
 (defun epa-passphrase-callback-function (context key-id handback)
   (if (eq key-id 'SYM)
       (read-passwd
diff --git a/lisp/epg.el b/lisp/epg.el
index 222fd913e1..603415f0ec 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -1234,19 +1234,6 @@ epg--status-IMPORT_RES
 			     (epg-context-result-for context 'import-status)))
     (epg-context-set-result-for context 'import-status nil)))
 
-(defun epg-passphrase-callback-function (context key-id _handback)
-  (declare (obsolete epa-passphrase-callback-function "23.1"))
-  (if (eq key-id 'SYM)
-      (read-passwd "Passphrase for symmetric encryption: "
-		   (eq (epg-context-operation context) 'encrypt))
-    (read-passwd
-     (if (eq key-id 'PIN)
-	"Passphrase for PIN: "
-       (let ((entry (assoc key-id epg-user-id-alist)))
-	 (if entry
-	     (format "Passphrase for %s %s: " key-id (cdr entry))
-	   (format "Passphrase for %s: " key-id)))))))
-
 (defun epg--list-keys-1 (context name mode)
   (let ((args (append (if (epg-context-home-directory context)
 			  (list "--homedir"
diff --git a/lisp/eshell/eshell.el b/lisp/eshell/eshell.el
index 2a63882ff0..7f94c9ba63 100644
--- a/lisp/eshell/eshell.el
+++ b/lisp/eshell/eshell.el
@@ -380,15 +380,6 @@ eshell-command-result
 	      (set status-var eshell-last-command-status))
 	  (cadr result))))))
 
-;;;_* Reporting bugs
-;;
-;; If you do encounter a bug, on any system, please report
-;; it -- in addition to any particular oddities in your configuration
-;; -- so that the problem may be corrected for the benefit of others.
-
-;;;###autoload
-(define-obsolete-function-alias 'eshell-report-bug 'report-emacs-bug "23.1")
-
 ;;; Code:
 
 (defun eshell-unload-all-modules ()
diff --git a/lisp/ffap.el b/lisp/ffap.el
index d656b37372..c26fb5420b 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1814,12 +1814,6 @@ ffap-literally
 
 (defalias 'find-file-literally-at-point 'ffap-literally)
 
-\f
-;;; Bug Reporter:
-
-(define-obsolete-function-alias 'ffap-bug 'report-emacs-bug "23.1")
-(define-obsolete-function-alias 'ffap-submit-bug 'report-emacs-bug "23.1")
-
 \f
 ;;; Hooks for Gnus, VM, Rmail:
 ;;
diff --git a/lisp/files.el b/lisp/files.el
index dba704f7a4..c2f37c178d 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -972,14 +972,6 @@ locate-file-completion-table
       (completion-table-with-context
        string-dir names string-file pred action)))))
 
-(defun locate-file-completion (string path-and-suffixes action)
-  "Do completion for file names passed to `locate-file'.
-PATH-AND-SUFFIXES is a pair of lists, (DIRECTORIES . SUFFIXES)."
-  (declare (obsolete locate-file-completion-table "23.1"))
-  (locate-file-completion-table (car path-and-suffixes)
-                                (cdr path-and-suffixes)
-                                string nil action))
-
 (defvar locate-dominating-stop-dir-regexp
   (purecopy "\\`\\(?:[\\/][\\/][^\\/]+[\\/]\\|/\\(?:net\\|afs\\|\\.\\.\\.\\)/\\)\\'")
   "Regexp of directory names that stop the search in `locate-dominating-file'.
diff --git a/lisp/gnus/mml-smime.el b/lisp/gnus/mml-smime.el
index 4754f37a2d..acddb30033 100644
--- a/lisp/gnus/mml-smime.el
+++ b/lisp/gnus/mml-smime.el
@@ -329,7 +329,6 @@ password-cache-expiry
   (autoload 'epg-verify-string "epg")
   (autoload 'epg-sign-string "epg")
   (autoload 'epg-encrypt-string "epg")
-  (autoload 'epg-passphrase-callback-function "epg")
   (autoload 'epg-context-set-passphrase-callback "epg")
   (autoload 'epg-sub-key-fingerprint "epg")
   (autoload 'epg-configuration "epg-config")
diff --git a/lisp/gnus/mml1991.el b/lisp/gnus/mml1991.el
index 8be1b84e52..88864ea357 100644
--- a/lisp/gnus/mml1991.el
+++ b/lisp/gnus/mml1991.el
@@ -242,7 +242,6 @@ mml1991-pgg-encrypt
 (defvar epg-user-id-alist)
 
 (autoload 'epg-make-context "epg")
-(autoload 'epg-passphrase-callback-function "epg")
 (autoload 'epa-select-keys "epa")
 (autoload 'epg-list-keys "epg")
 (autoload 'epg-context-set-armor "epg")
diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el
index d1d150ad2e..45c9bbfe90 100644
--- a/lisp/gnus/mml2015.el
+++ b/lisp/gnus/mml2015.el
@@ -712,7 +712,6 @@ inhibit-redisplay
 (autoload 'epg-verify-string "epg")
 (autoload 'epg-sign-string "epg")
 (autoload 'epg-encrypt-string "epg")
-(autoload 'epg-passphrase-callback-function "epg")
 (autoload 'epg-context-set-passphrase-callback "epg")
 (autoload 'epg-key-sub-key-list "epg")
 (autoload 'epg-sub-key-capability "epg")
diff --git a/lisp/hi-lock.el b/lisp/hi-lock.el
index a18310322a..27bd316621 100644
--- a/lisp/hi-lock.el
+++ b/lisp/hi-lock.el
@@ -237,17 +237,11 @@ hi-lock-interactive-lighters
   "Human-readable lighters for `hi-lock-interactive-patterns'.")
 (put 'hi-lock-interactive-lighters 'permanent-local t)
 
-(define-obsolete-variable-alias 'hi-lock-face-history
-                                'hi-lock-face-defaults "23.1")
 (defvar hi-lock-face-defaults
   '("hi-yellow" "hi-pink" "hi-green" "hi-blue" "hi-salmon" "hi-aquamarine"
     "hi-black-b" "hi-blue-b" "hi-red-b" "hi-green-b" "hi-black-hb")
   "Default faces for hi-lock interactive functions.")
 
-(define-obsolete-variable-alias 'hi-lock-regexp-history
-                                'regexp-history
-                                "23.1")
-
 (defvar hi-lock-file-patterns-prefix "Hi-lock"
   "String used to identify hi-lock patterns at the start of files.")
 
diff --git a/lisp/hilit-chg.el b/lisp/hilit-chg.el
index 04a5ccd8d5..ae97bb008a 100644
--- a/lisp/hilit-chg.el
+++ b/lisp/hilit-chg.el
@@ -224,9 +224,6 @@ highlight-changes-colors
 ;; When you invoke highlight-changes-mode, should highlight-changes-visible-mode
 ;; be on or off?
 
-(define-obsolete-variable-alias 'highlight-changes-initial-state
-  'highlight-changes-visibility-initial-state "23.1")
-
 (defcustom highlight-changes-visibility-initial-state t
   "Controls whether changes are initially visible in Highlight Changes mode.
 
@@ -236,13 +233,7 @@ highlight-changes-visibility-initial-state
   :type 'boolean
   :group 'highlight-changes)
 
-;; highlight-changes-global-initial-state has been removed
-
-
-
 ;; These are the strings displayed in the mode-line for the minor mode:
-(define-obsolete-variable-alias 'highlight-changes-active-string
-  'highlight-changes-visible-string "23.1")
 
 (defcustom highlight-changes-visible-string " +Chg"
   "The string used when in Highlight Changes mode and changes are visible.
@@ -252,9 +243,6 @@ highlight-changes-visible-string
 		 (const :tag "None"  nil))
   :group 'highlight-changes)
 
-(define-obsolete-variable-alias 'highlight-changes-passive-string
-  'highlight-changes-invisible-string "23.1")
-
 (defcustom highlight-changes-invisible-string " -Chg"
   "The string used when in Highlight Changes mode and changes are hidden.
 This should be set to nil if no indication is desired, or to
@@ -957,10 +945,6 @@ hilit-chg-get-diff-list-hk
 (define-globalized-minor-mode global-highlight-changes-mode
   highlight-changes-mode highlight-changes-mode-turn-on)
 
-(define-obsolete-function-alias
- 'global-highlight-changes
-  'global-highlight-changes-mode "23.1")
-
 (defun highlight-changes-mode-turn-on ()
   "See if Highlight Changes mode should be turned on for this buffer.
 This is called when `global-highlight-changes-mode' is turned on."
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 7714a778fc..5fe931dd9b 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -2968,11 +2968,6 @@ unify-8859-on-decoding-mode
 ;; Doc said "obsolete" in 23.1, this statement only added in 24.1.
 (make-obsolete 'unify-8859-on-decoding-mode "don't use it." "23.1")
 
-(defvar nonascii-insert-offset 0)
-(make-obsolete-variable 'nonascii-insert-offset "do not use it." "23.1")
-(defvar nonascii-translation-table nil)
-(make-obsolete-variable 'nonascii-translation-table "do not use it." "23.1")
-
 (defvar ucs-names nil
   "Hash table of cached CHAR-NAME keys to CHAR-CODE values.")
 
diff --git a/lisp/international/mule-diag.el b/lisp/international/mule-diag.el
index 80e78ef787..b13bde58ca 100644
--- a/lisp/international/mule-diag.el
+++ b/lisp/international/mule-diag.el
@@ -200,10 +200,6 @@ list-character-sets-2
 ;;;		   (charset-iso-graphic-plane charset)
 		   (charset-description charset)))))
 
-(defvar non-iso-charset-alist nil
-  "Obsolete.")
-(make-obsolete-variable 'non-iso-charset-alist "no longer relevant." "23.1")
-
 ;; A variable to hold charset input history.
 (defvar charset-history nil)
 
diff --git a/lisp/international/mule-util.el b/lisp/international/mule-util.el
index 5cc10b1315..660ac58e02 100644
--- a/lisp/international/mule-util.el
+++ b/lisp/international/mule-util.el
@@ -274,15 +274,6 @@ with-coding-priority
 ;;;###autoload(put 'with-coding-priority 'lisp-indent-function 1)
 (put 'with-coding-priority 'edebug-form-spec t)
 
-;;;###autoload
-(defmacro detect-coding-with-priority (from to priority-list)
-  "Detect a coding system of the text between FROM and TO with PRIORITY-LIST.
-PRIORITY-LIST is an alist of coding categories vs the corresponding
-coding systems ordered by priority."
-  (declare (obsolete with-coding-priority "23.1"))
-  `(with-coding-priority (mapcar #'cdr ,priority-list)
-     (detect-coding-region ,from ,to)))
-
 ;;;###autoload
 (defun detect-coding-with-language-environment (from to lang-env)
   "Detect a coding system for the text between FROM and TO with LANG-ENV.
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 72e8cad9d6..411cc6f41d 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -408,16 +408,6 @@ charset-info
 ;; because that makes a bootstrapping problem
 ;; if you need to recompile all the Lisp files using interpreted code.
 
-(defun charset-id (_charset)
-  "Always return 0.  This is provided for backward compatibility."
-  (declare (obsolete nil "23.1"))
-  0)
-
-(defmacro charset-bytes (_charset)
-  "Always return 0.  This is provided for backward compatibility."
-  (declare (obsolete nil "23.1"))
-  0)
-
 (defun get-charset-property (charset propname)
   "Return the value of CHARSET's PROPNAME property.
 This is the last value stored with
@@ -463,19 +453,8 @@ charset-long-name
   "Return long name of CHARSET."
   (plist-get (charset-plist charset) :long-name))
 
-(defun charset-list ()
-  "Return list of all charsets ever defined."
-  (declare (obsolete charset-list "23.1"))
-  charset-list)
-
 \f
 ;;; CHARACTER
-(define-obsolete-function-alias 'char-valid-p 'characterp "23.1")
-
-(defun generic-char-p (_char)
-  "Always return nil.  This is provided for backward compatibility."
-  (declare (obsolete nil "23.1"))
-  nil)
 
 (defun make-char-internal (charset-id &optional code1 code2)
   (let ((charset (aref emacs-mule-charset-table charset-id)))
@@ -1084,10 +1063,6 @@ coding-system-list
 	      (setq codings (cons alias codings))))))
     codings))
 
-(defconst char-coding-system-table nil
-  "It exists just for backward compatibility, and the value is always nil.")
-(make-obsolete-variable 'char-coding-system-table nil "23.1")
-
 (defun transform-make-coding-system-args (name type &optional doc-string props)
   "For internal use only.
 Transform XEmacs style args for `make-coding-system' to Emacs style.
@@ -1169,106 +1144,6 @@ transform-make-coding-system-args
       (error "unsupported XEmacs style make-coding-style arguments: %S"
 	     `(,name ,type ,doc-string ,props))))))
 
-(defun make-coding-system (coding-system type mnemonic doc-string
-					 &optional
-					 flags
-					 properties
-					 eol-type)
-  "Define a new coding system CODING-SYSTEM (symbol).
-This function is provided for backward compatibility."
-  (declare (obsolete define-coding-system "23.1"))
-  ;; For compatibility with XEmacs, we check the type of TYPE.  If it
-  ;; is a symbol, perhaps, this function is called with XEmacs-style
-  ;; arguments.  Here, try to transform that kind of arguments to
-  ;; Emacs style.
-  (if (symbolp type)
-      (let ((args (transform-make-coding-system-args coding-system type
-						     mnemonic doc-string)))
-	(setq coding-system (car args)
-	      type (nth 1 args)
-	      mnemonic (nth 2 args)
-	      doc-string (nth 3 args)
-	      flags (nth 4 args)
-	      properties (nth 5 args)
-	      eol-type (nth 6 args))))
-
-  (setq type
-	(cond ((eq type 0) 'emacs-mule)
-	      ((eq type 1) 'shift-jis)
-	      ((eq type 2) 'iso2022)
-	      ((eq type 3) 'big5)
-	      ((eq type 4) 'ccl)
-	      ((eq type 5) 'raw-text)
-	      (t
-	       (error "Invalid coding system type: %s" type))))
-
-  (setq properties
-	(let ((plist nil) key)
-	  (dolist (elt properties)
-	    (setq key (car elt))
-	    (cond ((eq key 'post-read-conversion)
-		   (setq key :post-read-conversion))
-		  ((eq key 'pre-write-conversion)
-		   (setq key :pre-write-conversion))
-		  ((eq key 'translation-table-for-decode)
-		   (setq key :decode-translation-table))
-		  ((eq key 'translation-table-for-encode)
-		   (setq key :encode-translation-table))
-		  ((eq key 'safe-charsets)
-		   (setq key :charset-list))
-		  ((eq key 'mime-charset)
-		   (setq key :mime-charset))
-		  ((eq key 'valid-codes)
-		   (setq key :valids)))
-	    (setq plist (plist-put plist key (cdr elt))))
-	  plist))
-  (setq properties (plist-put properties :mnemonic mnemonic))
-  (plist-put properties :coding-type type)
-  (cond ((eq eol-type 0) (setq eol-type 'unix))
-	((eq eol-type 1) (setq eol-type 'dos))
-	((eq eol-type 2) (setq eol-type 'mac))
-	((vectorp eol-type) (setq eol-type nil)))
-  (plist-put properties :eol-type eol-type)
-
-  (cond
-   ((eq type 'iso2022)
-    (plist-put properties :flags
-	       (list (and (or (consp (nth 0 flags))
-			      (consp (nth 1 flags))
-			      (consp (nth 2 flags))
-			      (consp (nth 3 flags))) 'designation)
-		     (or (nth 4 flags) 'long-form)
-		     (and (nth 5 flags) 'ascii-at-eol)
-		     (and (nth 6 flags) 'ascii-at-cntl)
-		     (and (nth 7 flags) '7-bit)
-		     (and (nth 8 flags) 'locking-shift)
-		     (and (nth 9 flags) 'single-shift)
-		     (and (nth 10 flags) 'use-roman)
-		     (and (nth 11 flags) 'use-oldjis)
-		     (or (nth 12 flags) 'direction)
-		     (and (nth 13 flags) 'init-at-bol)
-		     (and (nth 14 flags) 'designate-at-bol)
-		     (and (nth 15 flags) 'safe)
-		     (and (nth 16 flags) 'latin-extra)))
-    (plist-put properties :designation
-	       (let ((vec (make-vector 4 nil)))
-		 (dotimes (i 4)
-		   (let ((spec (nth i flags)))
-		     (if (eq spec t)
-			 (aset vec i '(94 96))
-		     (if (consp spec)
-			 (progn
-			   (if (memq t spec)
-			       (setq spec (append (delq t spec) '(94 96))))
-			   (aset vec i spec))))))
-		 vec)))
-
-   ((eq type 'ccl)
-    (plist-put properties :ccl-decoder (car flags))
-    (plist-put properties :ccl-encoder (cdr flags))))
-
-  (apply 'define-coding-system coding-system doc-string properties))
-
 (defun merge-coding-systems (first second)
   "Fill in any unspecified aspects of coding system FIRST from SECOND.
 Return the resulting coding system."
@@ -1615,15 +1490,6 @@ set-next-selection-coding-system
 
   (setq next-selection-coding-system coding-system))
 
-(defun set-coding-priority (arg)
-  "Set priority of coding categories according to ARG.
-ARG is a list of coding categories ordered by priority.
-
-This function is provided for backward compatibility."
-  (declare (obsolete set-coding-system-priority "23.1"))
-  (apply 'set-coding-system-priority
-	 (mapcar #'(lambda (x) (symbol-value x)) arg)))
-
 ;;; X selections
 
 (defvar ctext-non-standard-encodings-alist
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 44cde7cb5a..312baffb90 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -521,25 +521,6 @@ rmail-mmdf-delim1
 (defvar rmail-mmdf-delim2 "^\001\001\001\001\n"
   "Regexp marking the end of an mmdf message.")
 
-;; FIXME Post-mbox, this is now unused.
-;; In Emacs-22, this was called:
-;;  i) the very first time a message was shown.
-;; ii) when toggling the headers to the normal state, every time.
-;; It's not clear what it should do now, since there is nothing that
-;; records when a message is shown for the first time (unseen is not
-;; necessarily the same thing).
-;; See https://lists.gnu.org/r/emacs-devel/2009-03/msg00013.html
-(defcustom rmail-message-filter nil
-  "If non-nil, a filter function for new messages in RMAIL.
-Called with region narrowed to the message, including headers,
-before obeying `rmail-ignored-headers'."
-  :group 'rmail-headers
-  :type '(choice (const nil) function))
-
-(make-obsolete-variable 'rmail-message-filter
-			"it is not used (try `rmail-show-message-hook')."
-			"23.1")
-
 (defcustom rmail-automatic-folder-directives nil
   "List of directives specifying how to automatically file messages.
 Whenever Rmail shows a message in the folder that `rmail-file-name'
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index d2c3f9045e..0d99f4687c 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -685,13 +685,6 @@ completion--twq-all
                completions)
        qboundary))))
 
-;; (defmacro complete-in-turn (a b) `(completion-table-in-turn ,a ,b))
-;; (defmacro dynamic-completion-table (fun) `(completion-table-dynamic ,fun))
-(define-obsolete-function-alias
-  'complete-in-turn #'completion-table-in-turn "23.1")
-(define-obsolete-function-alias
-  'dynamic-completion-table #'completion-table-dynamic "23.1")
-
 ;;; Minibuffer completion
 
 (defgroup minibuffer nil
@@ -1770,9 +1763,6 @@ completion--insert-strings
 			      ;; Round up to a whole number of columns.
 			      (* colwidth (ceiling length colwidth))))))))))))
 
-(defvar completion-common-substring nil)
-(make-obsolete-variable 'completion-common-substring nil "23.1")
-
 (defvar completion-setup-hook nil
   "Normal hook run at the end of setting up a completion list buffer.
 When this hook is run, the current buffer is the one in which the
@@ -1864,11 +1854,7 @@ display-completion-list
         (insert "Possible completions are:\n")
         (completion--insert-strings completions))))
 
-  ;; The hilit used to be applied via completion-setup-hook, so there
-  ;; may still be some code that uses completion-common-substring.
-  (with-no-warnings
-    (let ((completion-common-substring common-substring))
-      (run-hooks 'completion-setup-hook)))
+  (run-hooks 'completion-setup-hook)
   nil)
 
 (defvar completion-extra-properties nil
@@ -2374,8 +2360,6 @@ minibuffer-local-filename-completion-map
 Gets combined either with `minibuffer-local-completion-map' or
 with `minibuffer-local-must-match-map'.")
 
-(define-obsolete-variable-alias 'minibuffer-local-must-match-filename-map
-  'minibuffer-local-filename-must-match-map "23.1")
 (defvar minibuffer-local-filename-must-match-map (make-sparse-keymap))
 (make-obsolete-variable 'minibuffer-local-filename-must-match-map nil "24.1")
 
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 795b4da19e..ae6ebf4dfc 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -271,34 +271,6 @@ mouse-menu-bar-map
            local-menu
            minor-mode-menus)))
 
-(defun mouse-major-mode-menu (event &optional prefix)
-  "Pop up a mode-specific menu of mouse commands.
-Default to the Edit menu if the major mode doesn't define a menu."
-  (declare (obsolete mouse-menu-major-mode-map "23.1"))
-  (interactive "@e\nP")
-  (run-hooks 'activate-menubar-hook 'menu-bar-update-hook)
-  (popup-menu (mouse-menu-major-mode-map) event prefix))
-
-(defun mouse-popup-menubar (event prefix)
-  "Pop up a menu equivalent to the menu bar for keyboard EVENT with PREFIX.
-The contents are the items that would be in the menu bar whether or
-not it is actually displayed."
-  (declare (obsolete mouse-menu-bar-map "23.1"))
-  (interactive "@e \nP")
-  (run-hooks 'activate-menubar-hook 'menu-bar-update-hook)
-  (popup-menu (mouse-menu-bar-map) (unless (integerp event) event) prefix))
-
-(defun mouse-popup-menubar-stuff (event prefix)
-  "Popup a menu like either `mouse-major-mode-menu' or `mouse-popup-menubar'.
-Use the former if the menu bar is showing, otherwise the latter."
-  (declare (obsolete nil "23.1"))
-  (interactive "@e\nP")
-  (run-hooks 'activate-menubar-hook 'menu-bar-update-hook)
-  (popup-menu
-   (if (zerop (or (frame-parameter nil 'menu-bar-lines) 0))
-       (mouse-menu-bar-map)
-     (mouse-menu-major-mode-map))
-   event prefix))
 \f
 ;; Commands that operate on windows.
 
diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el
index 1bed61f3e7..ff8a447c7c 100644
--- a/lisp/net/newst-treeview.el
+++ b/lisp/net/newst-treeview.el
@@ -131,14 +131,6 @@ newsticker-groups
 Example: (\"Topmost group\" \"feed1\" (\"subgroup1\" \"feed 2\")
 \"feed3\")")
 
-(defcustom newsticker-groups-filename
-  nil
-  "Name of the newsticker groups settings file."
-  :version "25.1"                       ; changed default value to nil
-  :type '(choice (const nil) string)
-  :group 'newsticker-treeview)
-(make-obsolete-variable 'newsticker-groups-filename 'newsticker-dir "23.1")
-
 ;; ======================================================================
 ;;; internal variables
 ;; ======================================================================
@@ -1265,29 +1257,9 @@ newsticker-treeview-save
 (defun newsticker--treeview-load ()
   "Load treeview settings."
   (let* ((coding-system-for-read 'utf-8)
-         (filename
-          (or (and newsticker-groups-filename
-                   (not (string=
-                         (expand-file-name newsticker-groups-filename)
-                         (expand-file-name (concat newsticker-dir "/groups"))))
-                   (file-exists-p newsticker-groups-filename)
-                   (y-or-n-p
-                    (format-message
-                     (concat "Obsolete variable `newsticker-groups-filename' "
-                             "points to existing file \"%s\".\n"
-                             "Read it? ")
-                     newsticker-groups-filename))
-                   newsticker-groups-filename)
-              (concat newsticker-dir "/groups")))
+         (filename (concat newsticker-dir "/groups"))
          (buf (and (file-exists-p filename)
                    (find-file-noselect filename))))
-    (and newsticker-groups-filename
-         (file-exists-p newsticker-groups-filename)
-	 (y-or-n-p (format-message
-                    (concat "Delete the file \"%s\",\nto which the obsolete "
-                            "variable `newsticker-groups-filename' points ? ")
-                    newsticker-groups-filename))
-	 (delete-file newsticker-groups-filename))
     (when buf
       (set-buffer buf)
       (goto-char (point-min))
diff --git a/lisp/obsolete/tpu-edt.el b/lisp/obsolete/tpu-edt.el
index d71f79c87b..0de7aa096d 100644
--- a/lisp/obsolete/tpu-edt.el
+++ b/lisp/obsolete/tpu-edt.el
@@ -287,14 +287,6 @@ tpu-version
 ;;;
 ;;;  User Configurable Variables
 ;;;
-(defcustom tpu-have-ispell t
-  "Non-nil means `tpu-spell-check' uses `ispell-region' for spell checking.
-Otherwise, use `spell-region'."
-  :type 'boolean
-  :group 'tpu)
-(make-obsolete-variable 'tpu-have-ispell "the `spell' package is obsolete."
-                        "23.1")
-
 (defcustom tpu-kill-buffers-silently nil
   "If non-nil, TPU-edt kills modified buffers without asking."
   :type 'boolean
@@ -315,7 +307,6 @@ tpu-pan-columns
 ;;;  Global Keymaps
 ;;;
 
-(define-obsolete-variable-alias 'GOLD-map 'tpu-gold-map "23.1")
 (defvar tpu-gold-map
   (let ((map (make-keymap)))
     ;; Previously we used escape sequences here.  We now instead presume
@@ -892,8 +883,7 @@ tpu-spell-check
 if no region is selected."
   (interactive)
   (let ((m (tpu-mark)))
-    (apply (if tpu-have-ispell 'ispell-region
-             'spell-region)
+    (apply 'ispell-region
            (if m
                (if (> m (point)) (list (point) m)
                  (list m (point)))
diff --git a/lisp/obsolete/vc-arch.el b/lisp/obsolete/vc-arch.el
index 93bd991eb3..6b34b31fcd 100644
--- a/lisp/obsolete/vc-arch.el
+++ b/lisp/obsolete/vc-arch.el
@@ -84,8 +84,6 @@ vc-arch-diff-switches
   :version "23.1"
   :group 'vc-arch)
 
-(define-obsolete-variable-alias 'vc-arch-command 'vc-arch-program "23.1")
-
 (defcustom vc-arch-program
   (let ((candidates '("tla" "baz")))
     (while (and candidates (not (executable-find (car candidates))))
diff --git a/lisp/password-cache.el b/lisp/password-cache.el
index 5e5f3240bc..5aed4e4049 100644
--- a/lisp/password-cache.el
+++ b/lisp/password-cache.el
@@ -93,22 +93,6 @@ password-read
   (or (password-read-from-cache key)
       (read-passwd prompt)))
 
-(defun password-read-and-add (prompt &optional key)
-  "Read password, for use with KEY, from user, or from cache if wanted.
-Then store the password in the cache.  Uses `password-read' and
-`password-cache-add'.  Custom variables `password-cache' and
-`password-cache-expiry' regulate cache behavior.
-
-Warning: the password is cached without checking that it is
-correct.  It is better to check the password before caching.  If
-you must use this function, take care to check passwords and
-remove incorrect ones from the cache."
-  (declare (obsolete password-read "23.1"))
-  (let ((password (password-read prompt key)))
-    (when (and password key)
-      (password-cache-add key password))
-    password))
-
 (defun password-cache-remove (key)
   "Remove password indexed by KEY from password cache.
 This is typically run by a timer setup from `password-cache-add',
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index 3092d4c45b..55acb77425 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -159,8 +159,6 @@
   (defalias 'line-beginning-position 'point-at-bol))
 (unless (fboundp 'line-end-position)
   (defalias 'line-end-position 'point-at-eol))
-(unless (fboundp 'char-valid-p)
-  (defalias 'char-valid-p 'characterp))
 (unless (fboundp 'match-string-no-properties)
   (defalias 'match-string-no-properties 'match-string))
 
diff --git a/lisp/shell.el b/lisp/shell.el
index 1e2679f723..3461ce71ef 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -988,9 +988,6 @@ shell-dirtrack-mode
       (add-hook 'comint-input-filter-functions #'shell-directory-tracker nil t)
     (remove-hook 'comint-input-filter-functions #'shell-directory-tracker t)))
 
-(define-obsolete-function-alias 'shell-dirtrack-toggle #'shell-dirtrack-mode
-  "23.1")
-
 (defun shell-cd (dir)
   "Do normal `cd' to DIR, and set `list-buffers-directory'."
   (cd dir)
diff --git a/lisp/subr.el b/lisp/subr.el
index 324c59f13f..b7ef32d5d5 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1578,11 +1578,6 @@ posn-object-width-height
 (make-obsolete 'string-as-multibyte "use `decode-coding-string'." "26.1")
 (make-obsolete 'string-make-multibyte "use `decode-coding-string'." "26.1")
 
-(defun forward-point (n)
-  "Return buffer position N characters after (before if N negative) point."
-  (declare (obsolete "use (+ (point) N) instead." "23.1"))
-  (+ (point) n))
-
 (defun log10 (x)
   "Return (log X 10), the log base 10 of X."
   (declare (obsolete log "24.4"))
@@ -1598,17 +1593,11 @@ log10
 \f
 ;;;; Obsolescence declarations for variables, and aliases.
 
-(make-obsolete-variable 'define-key-rebound-commands nil "23.2")
-(make-obsolete-variable 'redisplay-end-trigger-functions 'jit-lock-register "23.1")
 (make-obsolete-variable 'deferred-action-list 'post-command-hook "24.1")
 (make-obsolete-variable 'deferred-action-function 'post-command-hook "24.1")
 (make-obsolete-variable 'redisplay-dont-pause nil "24.5")
-(make-obsolete 'window-redisplay-end-trigger nil "23.1")
-(make-obsolete 'set-window-redisplay-end-trigger nil "23.1")
 
 (make-obsolete 'run-window-configuration-change-hook nil "27.1")
-(make-obsolete 'process-filter-multibyte-p nil "23.1")
-(make-obsolete 'set-process-filter-multibyte nil "23.1")
 
 (make-obsolete-variable 'command-debug-status
                         "expect it to be removed in a future version." "25.2")
diff --git a/lisp/t-mouse.el b/lisp/t-mouse.el
index a1af53d8c4..4feab71401 100644
--- a/lisp/t-mouse.el
+++ b/lisp/t-mouse.el
@@ -62,8 +62,6 @@ gpm-mouse-disable
     (gpm-mouse-stop))
   (set-terminal-parameter nil 'gpm-mouse-active nil))
 
-;;;###autoload
-(define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
 ;;;###autoload
 (define-minor-mode gpm-mouse-mode
   "Toggle mouse support in GNU/Linux consoles (GPM Mouse mode).
diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el
index 5901e0295e..e866fdc36c 100644
--- a/lisp/term/w32-win.el
+++ b/lisp/term/w32-win.el
@@ -78,12 +78,8 @@
 (require 'dnd)
 (require 'w32-vars)
 
-;; Keep an obsolete alias for w32-focus-frame and w32-select-font in case
-;; they are used by code outside Emacs.
-(define-obsolete-function-alias 'w32-focus-frame 'x-focus-frame "23.1")
 (declare-function x-select-font "w32font.c"
                   (&optional frame exclude-proportional))
-(define-obsolete-function-alias 'w32-select-font 'x-select-font "23.1")
 
 (defvar w32-color-map) ;; defined in w32fns.c
 (make-obsolete 'w32-default-color-map nil "24.1")
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 65f61644b6..ffcdb9bd16 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -621,15 +621,6 @@ ispell-encoding8-command
 Earlier Aspell versions do not consistently support charset encoding.  Handling
 this would require some extra guessing in `ispell-aspell-find-dictionary'.")
 
-(defvar ispell-aspell-supports-utf8 nil
-  "Non-nil if Aspell has consistent command line UTF-8 support.  Obsolete.
-ispell.el and flyspell.el will use for this purpose the more generic
-variable `ispell-encoding8-command' for both Aspell and Hunspell.  Is left
-here just for backwards compatibility.")
-
-(make-obsolete-variable 'ispell-aspell-supports-utf8
-                        'ispell-encoding8-command "23.1")
-
 (defvar ispell-dicts-name2locale-equivs-alist
   '(("american"      "en_US")
     ("brasileiro"    "pt_BR")
diff --git a/lisp/textmodes/remember.el b/lisp/textmodes/remember.el
index 279dbb4450..7bc7dc1762 100644
--- a/lisp/textmodes/remember.el
+++ b/lisp/textmodes/remember.el
@@ -487,9 +487,6 @@ remember-finalize
   (interactive)
   (remember-region (point-min) (point-max)))
 
-;; Org needs this
-(define-obsolete-function-alias 'remember-buffer 'remember-finalize "23.1")
-
 (defun remember-destroy ()
   "Destroy the current *Remember* buffer."
   (interactive)
diff --git a/lisp/tooltip.el b/lisp/tooltip.el
index f35f6b9a03..5f5a4788b2 100644
--- a/lisp/tooltip.el
+++ b/lisp/tooltip.el
@@ -167,8 +167,6 @@ tooltip-resize-echo-area
 \f
 ;;; Variables that are not customizable.
 
-(define-obsolete-variable-alias 'tooltip-hook 'tooltip-functions "23.1")
-
 (defvar tooltip-functions nil
   "Functions to call to display tooltips.
 Each function is called with one argument EVENT which is a copy
diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el
index 6dd7a9c2aa..0a7e7e205e 100644
--- a/lisp/url/url-util.el
+++ b/lisp/url/url-util.el
@@ -569,31 +569,6 @@ url-get-url-at-point
 	  (setq url nil))
       url)))
 
-(defun url-generate-unique-filename (&optional fmt)
-  "Generate a unique filename in `url-temporary-directory'."
-  (declare (obsolete make-temp-file "23.1"))
-  ;; This variable is obsolete, but so is this function.
-  (let ((tempdir (with-no-warnings url-temporary-directory)))
-    (if (not fmt)
-	(let ((base (format "url-tmp.%d" (user-real-uid)))
-	      (fname "")
-	      (x 0))
-	  (setq fname (format "%s%d" base x))
-	  (while (file-exists-p
-		  (expand-file-name fname tempdir))
-	    (setq x (1+ x)
-		  fname (concat base (int-to-string x))))
-	  (expand-file-name fname tempdir))
-      (let ((base (concat "url" (int-to-string (user-real-uid))))
-	    (fname "")
-	    (x 0))
-	(setq fname (format fmt (concat base (int-to-string x))))
-	(while (file-exists-p
-		(expand-file-name fname tempdir))
-	  (setq x (1+ x)
-		fname (format fmt (concat base (int-to-string x)))))
-	(expand-file-name fname tempdir)))))
-
 (defun url-extract-mime-headers ()
   "Set `url-current-mime-headers' in current buffer."
   (save-excursion
diff --git a/lisp/url/url-vars.el b/lisp/url/url-vars.el
index d9277cf6f4..e35823ab9a 100644
--- a/lisp/url/url-vars.el
+++ b/lisp/url/url-vars.el
@@ -312,13 +312,6 @@ url-max-password-attempts
   :type 'integer
   :group 'url)
 
-(defcustom url-temporary-directory (or (getenv "TMPDIR") "/tmp")
-  "Where temporary files go."
-  :type 'directory
-  :group 'url-file)
-(make-obsolete-variable 'url-temporary-directory
-			'temporary-file-directory "23.1")
-
 (defcustom url-show-status t
   "Whether to show a running total of bytes transferred.
 Can cause a large hit if using a remote X display over a slow link, or
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index 2ca9d3e620..20002c4f59 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -506,9 +506,8 @@ vc-working-revision
                             backend 'working-revision file))))))
 
 ;; Backward compatibility.
-(define-obsolete-function-alias
-  'vc-workfile-version 'vc-working-revision "23.1")
 (defun vc-default-working-revision (backend file)
+  ;; FIXME: Should this be declared obsolete?
   (message
    "`working-revision' not found: using the old `workfile-version' instead")
   (vc-call-backend backend 'workfile-version file))
diff --git a/lisp/vc/vc-mtn.el b/lisp/vc/vc-mtn.el
index 092d8b5396..3c26ffc0e5 100644
--- a/lisp/vc/vc-mtn.el
+++ b/lisp/vc/vc-mtn.el
@@ -60,7 +60,6 @@ vc-mtn-annotate-switches
   :version "25.1"
   :group 'vc-mtn)
 
-(define-obsolete-variable-alias 'vc-mtn-command 'vc-mtn-program "23.1")
 (defcustom vc-mtn-program "mtn"
   "Name of the monotone executable."
   :type 'string
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index c640ba0420..2128f0edc1 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -2700,9 +2700,6 @@ vc-revert
       (vc-revert-file file)
       (message "Reverting %s...done" (vc-delistify files)))))
 
-;;;###autoload
-(define-obsolete-function-alias 'vc-revert-buffer 'vc-revert "23.1")
-
 ;;;###autoload
 (defun vc-pull (&optional arg)
   "Update the current fileset or branch.
diff --git a/lisp/vcursor.el b/lisp/vcursor.el
index fa0cbb74b0..3601abcd6e 100644
--- a/lisp/vcursor.el
+++ b/lisp/vcursor.el
@@ -1132,9 +1132,6 @@ vcursor-copy-line
     (vcursor-copy (if (or (= count 0) arg) (1+ count) count)))
   )
 
-(define-obsolete-function-alias
-  'vcursor-toggle-vcursor-map 'vcursor-use-vcursor-map "23.1")
-
 (defun vcursor-post-command ()
   (and vcursor-auto-disable (not vcursor-last-command)
        vcursor-overlay
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-05-16 13:18     ` Delete variables obsolete since Emacs 23 Stefan Kangas
@ 2020-05-16 15:49       ` Paul Eggert
  2020-05-17  2:52       ` Stefan Monnier
  2020-08-08  0:28       ` Stefan Kangas
  2 siblings, 0 replies; 838+ messages in thread
From: Paul Eggert @ 2020-05-16 15:49 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Stefan Monnier, emacs-devel

On 5/16/20 6:18 AM, Stefan Kangas wrote:
> Other than that, does the attached patch look okay for master?

Yes, it looks good to me, thanks. Though Glenn is the real expert here....



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-05-16 13:18     ` Delete variables obsolete since Emacs 23 Stefan Kangas
  2020-05-16 15:49       ` Paul Eggert
@ 2020-05-17  2:52       ` Stefan Monnier
  2020-05-17 11:39         ` Dmitry Gutov
  2020-08-08  0:28       ` Stefan Kangas
  2 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-05-17  2:52 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: emacs-devel

> 3. Note the added FIXME in `vc-default-working-revision', where I'm not
>    sure if it should be declared obsolete or not.  See Stefan M's commit
>    6e5d0e9e73.

This function is never called directly (the only way it could be called
was via (vc-call-backend .. 'working-revision) for backends that
defined `vc-<backend>-workfile-revision` instead of
`vc-<backend>-working-revision`.

So a `make-obsolete` would have been ineffective (since it's never
called directly, the byte-compiler would never emit an obsolescence
warning) and I replaced it with a more annoying "message".  Since noone
complained about that message, I think it's definitely safe to remove
the function.

> 4. The variable `translation-table-for-input' was declared obsolete with
>    in Emacs 23.1 and has the following comment.  I'm not sure what to do
>    about it, if anything.
>
>    ;; This was introduced in 21.4 for pre-unicode unification.  That
>    ;; usage was rendered obsolete in 23.1, which uses Unicode internally.
>    ;; Other uses are possible, so this variable is not _really_ obsolete,
>    ;; but Stefan insists to mark it so.

It's not obsolete in the sense that there's nothing to replace
it, indeed.  But it's been completely unused since Emacs-23.1 so it's
complexity that's not pulling its weight.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2)
  2020-05-15 18:38   ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Monnier
  2020-05-15 20:58     ` Stefan Kangas
  2020-05-16 13:18     ` Delete variables obsolete since Emacs 23 Stefan Kangas
@ 2020-05-17  3:18     ` Stefan Kangas
  2020-05-17 15:18       ` Eli Zaretskii
  2 siblings, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-05-17  3:18 UTC (permalink / raw)
  To: Stefan Monnier, emacs-devel

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

> I did a quick `grep` to see the functions/vars that were obsoleted in
> the same time frame, and I saw instead a deluge of
>
>     :version "23.1"
>
> If we consider those thingies old enough to remove their obsolete
> functions, shouldn't we also remove the corresponding `:version`
> thingies from `defcustom`s?
>
> I see:
> - 1 defcustom with a :version of 19.29
> - >200 defcustoms with a :version of 20.x
> - a bit less than 200 defcustoms with a :version of 21.x
> - >400 defcustoms with a :version of 22.x
> - >200 defcustoms with a :version of 23.x

I realize I don't fully understand the purpose of the :version
declarations.  If it's mostly to let users know what changed, they can
probably be removed for these very old versions.

But are they also intended to provide a historical record?  If so, maybe
they should be kept indefinitely.

Best regards,
Stefan Kangas



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-05-17  2:52       ` Stefan Monnier
@ 2020-05-17 11:39         ` Dmitry Gutov
  0 siblings, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-05-17 11:39 UTC (permalink / raw)
  To: Stefan Monnier, Stefan Kangas; +Cc: emacs-devel

On 17.05.2020 05:52, Stefan Monnier wrote:
>> 3. Note the added FIXME in `vc-default-working-revision', where I'm not
>>     sure if it should be declared obsolete or not.  See Stefan M's commit
>>     6e5d0e9e73.
> This function is never called directly (the only way it could be called
> was via (vc-call-backend .. 'working-revision) for backends that
> defined `vc-<backend>-workfile-revision` instead of
> `vc-<backend>-working-revision`.
> 
> So a `make-obsolete` would have been ineffective (since it's never
> called directly, the byte-compiler would never emit an obsolescence
> warning) and I replaced it with a more annoying "message".  Since noone
> complained about that message, I think it's definitely safe to remove
> the function.
> 

Agree.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2)
  2020-05-17  3:18     ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Kangas
@ 2020-05-17 15:18       ` Eli Zaretskii
  2020-05-17 16:59         ` Deleting old `:version` from defcustoms Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2020-05-17 15:18 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: monnier, emacs-devel

> From: Stefan Kangas <stefankangas@gmail.com>
> Date: Sat, 16 May 2020 20:18:54 -0700
> 
> I realize I don't fully understand the purpose of the :version
> declarations.  If it's mostly to let users know what changed, they can
> probably be removed for these very old versions.
> 
> But are they also intended to provide a historical record?  If so, maybe
> they should be kept indefinitely.

I think it's good to have a facility that can tell us in which Emacs
version was some option introduced.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Deleting old `:version` from defcustoms
  2020-05-17 15:18       ` Eli Zaretskii
@ 2020-05-17 16:59         ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-05-17 16:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Stefan Kangas, emacs-devel

> I think it's good to have a facility that can tell us in which Emacs
> version was some option introduced.

The :version doesn't quite tell us that: it tells us when it was
last changed.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
@ 2020-05-21 16:56 Philip K.
  2020-05-21 22:18 ` Juri Linkov
  2020-06-26 19:46 ` Philip K.
  0 siblings, 2 replies; 838+ messages in thread
From: Philip K. @ 2020-05-21 16:56 UTC (permalink / raw)
  To: 41438

[-- Attachment #1: Type: text/plain, Size: 1091 bytes --]


Hi,

I'm probably not the only one who tends to use C-{f,b,n,p} over the
arrow keys, but also sometimes gets annoyed by navigating windows. I
recently realised that the reason I didn't use windmove as much as I
would want to, was that I coudln't find a satisfying modifier-key. My
idea was then to try windmove without any modifier, and I quite like
it. The only "annoying" thing is that I have to bind all keys
manually, instead of using a function like
`windmove-default-keybindings', because `nil' is interpreted as a
default binding.

This patch adds a pseudo-modifier (`none') to allow bindings the
windmove functions without any real modifier or prefix key, depending on
the function.

--

Another question I'd like to ask before trying it out: Would there be
any interest in adding user options for the "default" modifiers that
windmove should use? If yes, one could add a :set function that
automatically calls the apropriate bindings function, when it's value
is non-nil. I have a very customize-centric configuration, where something
this would fit in very well.

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Allow-windmove-keys-to-be-bound-without-prefix-or-mo.patch --]
[-- Type: text/x-diff, Size: 3810 bytes --]

From 0fb951817fc11983498052f2a4fdb8815bc89b92 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Thu, 21 May 2020 18:44:10 +0200
Subject: [PATCH] Allow windmove keys to be bound without prefix or modifiers

---
 lisp/windmove.el | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index f96383197b..3d7f86b9af 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -431,9 +431,12 @@ windmove-default-keybindings
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-left)
   (global-set-key (vector (append modifiers '(right))) 'windmove-right)
@@ -568,9 +571,12 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
   (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
@@ -640,11 +646,16 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
   (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
@@ -695,9 +706,13 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
   (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-05-21 16:56 bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers Philip K.
@ 2020-05-21 22:18 ` Juri Linkov
  2020-05-22 18:26   ` Philip K.
  2020-05-22 18:26   ` Philip K.
  2020-06-26 19:46 ` Philip K.
  1 sibling, 2 replies; 838+ messages in thread
From: Juri Linkov @ 2020-05-21 22:18 UTC (permalink / raw)
  To: Philip K.; +Cc: 41438

> I'm probably not the only one who tends to use C-{f,b,n,p} over the
> arrow keys, but also sometimes gets annoyed by navigating windows. I
> recently realised that the reason I didn't use windmove as much as I
> would want to, was that I coudln't find a satisfying modifier-key. My
> idea was then to try windmove without any modifier, and I quite like
> it. The only "annoying" thing is that I have to bind all keys
> manually, instead of using a function like
> `windmove-default-keybindings', because `nil' is interpreted as a
> default binding.
>
> This patch adds a pseudo-modifier (`none') to allow bindings the
> windmove functions without any real modifier or prefix key, depending on
> the function.

Thanks, since `nil' means a default binding it seems there is no other way
than using a pseudo-modifier `none'.

> Another question I'd like to ask before trying it out: Would there be
> any interest in adding user options for the "default" modifiers that
> windmove should use? If yes, one could add a :set function that
> automatically calls the apropriate bindings function, when it's value
> is non-nil. I have a very customize-centric configuration, where something
> this would fit in very well.

I think that adding defcustoms (including a new const `none')
would be the most natural way to customize windmove modifiers
(provided that the existing functions should remain).





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-05-21 22:18 ` Juri Linkov
@ 2020-05-22 18:26   ` Philip K.
  2020-05-22 18:26   ` Philip K.
  1 sibling, 0 replies; 838+ messages in thread
From: Philip K. @ 2020-05-22 18:26 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 863 bytes --]

Juri Linkov <juri@linkov.net> writes:

>> Another question I'd like to ask before trying it out: Would there be
>> any interest in adding user options for the "default" modifiers that
>> windmove should use? If yes, one could add a :set function that
>> automatically calls the apropriate bindings function, when it's value
>> is non-nil. I have a very customize-centric configuration, where something
>> this would fit in very well.
>
> I think that adding defcustoms (including a new const `none')
> would be the most natural way to customize windmove modifiers
> (provided that the existing functions should remain).

I made a first concept, but it doesn't work unless windmove is explicity
required (see below). As far as I know, autoloading variables isn't good
style, so is there any other way to invoke the :set property of a user
option?

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Implement-user-options-for-windmove-modifiers-and-pr.patch --]
[-- Type: text/x-diff, Size: 8273 bytes --]

From b35173936e681e170172eb3d4548a2f91f70dad3 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Fri, 22 May 2020 20:21:59 +0200
Subject: [PATCH] Implement user options for windmove modifiers and prefixes

---
 lisp/windmove.el | 103 +++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 95 insertions(+), 8 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index 3d7f86b9af..95f74bfb81 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -162,6 +162,19 @@ windmove-window-distance-delta
 (make-obsolete-variable 'windmove-window-distance-delta
                         "no longer used." "27.1")
 
+(defconst windmove-modifier-type
+  '(choice (set :tag "Modifier Symbols"
+                :greedy t
+                ;; See `(elisp) Keyboard Events'
+                (const :tag "Meta" meta)
+                (const :tag "Control" control)
+                (const :tag "Shift" shift)
+                (const :tag "Hyper" hyper)
+                (const :tag "Super" super)
+                (const :tag "Alt" alt))
+           (const :tag "No modifier" none))
+  "Customisation type for windmove modifiers")
+
 \f
 ;; Note:
 ;;
@@ -419,6 +432,7 @@ windmove-down
   (interactive "P")
   (windmove-do-window-select 'down (and arg (prefix-numeric-value arg))))
 
+(defvar windmove-modifiers)
 
 ;;; set up keybindings
 ;; Idea for this function is from iswitchb.el, by Stephen Eglen
@@ -433,9 +447,10 @@ windmove-default-keybindings
 where MODIFIERS is either a list of modifiers or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to
 the arrow keys.
-Default value of MODIFIERS is `shift'."
+Default value of MODIFIERS is stored in `windmove-modifiers'."
   (interactive)
-  (unless modifiers (setq modifiers 'shift))
+  (unless modifiers
+    (setq modifiers windmove-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-left)
@@ -443,6 +458,25 @@ windmove-default-keybindings
   (global-set-key (vector (append modifiers '(up)))    'windmove-up)
   (global-set-key (vector (append modifiers '(down)))  'windmove-down))
 
+;; has to be declared AFTER windmove-default-keybindings, or else
+;; windmove is recursivly loaded
+;;;###autoload
+(defcustom windmove-modifiers '(shift super)
+  "Modifiers for `windmove-default-keybindings'.
+Can either be a symbol or list of modifier symbols,
+i.e. `meta',`control', `shift', `hyper', `super', or `alt'
+representing modifier keys to use with the arrow keys.
+
+If the value is just `none', the arrow keys will be directly
+bound to the windmove functions."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (when val
+           (windmove-swap-states-default-keybindings val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window display and selection
 
@@ -565,6 +599,8 @@ windmove-display-new-tab
   (interactive "P")
   (windmove-display-in-direction 'new-tab arg))
 
+(defvar windmove-display-modifiers)
+
 ;;;###autoload
 (defun windmove-display-default-keybindings (&optional modifiers)
   "Set up keybindings for directional buffer display.
@@ -573,7 +609,7 @@ windmove-display-default-keybindings
 where MODIFIERS is either a list of modifiers or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to
 the arrow keys.
-Default value of MODIFIERS is `shift-meta'."
+Default value of MODIFIERS is stored in `windmove-display-modifiers'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
   (when (eq modifiers 'none) (setq modifiers nil))
@@ -586,6 +622,17 @@ windmove-display-default-keybindings
   (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
   (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
 
+(defcustom windmove-display-modifiers '(shift meta)
+  "Modifiers for `windmove-display-default-keybindings'.
+Analogous to `windmove-modifiers'."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (when val
+           (windmove-display-default-keybindings val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window deletion
 
@@ -640,6 +687,9 @@ windmove-delete-down
   (interactive "P")
   (windmove-delete-in-direction 'down arg))
 
+(defvar windmove-delete-prefix)
+(defvar windmove-delete-modifiers)
+
 ;;;###autoload
 (defun windmove-delete-default-keybindings (&optional prefix modifiers)
   "Set up keybindings for directional window deletion.
@@ -649,12 +699,13 @@ windmove-delete-default-keybindings
 a single modifier.
 If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
 are directly bound to the arrow keys.
-Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+The default values for PREFIX and MODIFIERS are stored in `windmove-delete-prefix'
+and `windmove-delete-modifiers' respectively."
   (interactive)
-  (unless prefix (setq prefix '(?\C-x)))
+  (unless prefix (setq prefix (list windmove-delete-prefix)))
   (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
-  (unless modifiers (setq modifiers '(shift)))
+  (unless modifiers (setq modifiers windmove-delete-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
@@ -662,6 +713,28 @@ windmove-delete-default-keybindings
   (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
   (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
 
+(defcustom windmove-delete-prefix (kbd "C-x")
+  "Prefix for `windmove-delete-default-keybindings'."
+  :type 'key-sequence
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (windmove-delete-default-keybindings
+          val windmove-delete-modifiers)
+         (set-default sym val)))
+
+(defcustom windmove-delete-modifiers '(shift)
+  "Modifiers for `windmove-delete-default-keybindings'.
+See `windmove-modifiers' for more details"
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (when val
+           (windmove-delete-default-keybindings
+            windmove-delete-prefix val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window swap states
 
@@ -700,6 +773,8 @@ windmove-swap-states-right
   (interactive)
   (windmove-swap-states-in-direction 'right))
 
+(defvar windmove-swap-states-modifiers)
+
 ;;;###autoload
 (defun windmove-swap-states-default-keybindings (&optional modifiers)
   "Set up keybindings for directional window swap states.
@@ -709,9 +784,10 @@ windmove-swap-states-default-keybindings
 or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to the
 arrow keys.
-Default value of MODIFIERS is `shift-super'."
+Default value of MODIFIERS is stored in `windmove-swap-states-modifiers'."
   (interactive)
-  (unless modifiers (setq modifiers '(shift super)))
+  (unless modifiers
+    (setq modifiers windmove-swap-states-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
@@ -719,6 +795,17 @@ windmove-swap-states-default-keybindings
   (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
   (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
 
+(defcustom windmove-swap-states-modifiers
+  '(shift super)
+  "Modifiers for `windmove-swap-states-default-keybindings'.
+Analogous to `windmove-modifiers'."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (windmove-swap-states-default-keybindings val)
+         (set-default sym val)))
+
 \f
 (provide 'windmove)
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-05-21 22:18 ` Juri Linkov
  2020-05-22 18:26   ` Philip K.
@ 2020-05-22 18:26   ` Philip K.
  2020-05-22 19:15     ` Drew Adams
  2020-05-23 22:12     ` Juri Linkov
  1 sibling, 2 replies; 838+ messages in thread
From: Philip K. @ 2020-05-22 18:26 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 863 bytes --]

Juri Linkov <juri@linkov.net> writes:

>> Another question I'd like to ask before trying it out: Would there be
>> any interest in adding user options for the "default" modifiers that
>> windmove should use? If yes, one could add a :set function that
>> automatically calls the apropriate bindings function, when it's value
>> is non-nil. I have a very customize-centric configuration, where something
>> this would fit in very well.
>
> I think that adding defcustoms (including a new const `none')
> would be the most natural way to customize windmove modifiers
> (provided that the existing functions should remain).

I made a first concept, but it doesn't work unless windmove is explicity
required (see below). As far as I know, autoloading variables isn't good
style, so is there any other way to invoke the :set property of a user
option?

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Implement-user-options-for-windmove-modifiers-and-pr.patch --]
[-- Type: text/x-diff, Size: 8273 bytes --]

From b35173936e681e170172eb3d4548a2f91f70dad3 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Fri, 22 May 2020 20:21:59 +0200
Subject: [PATCH] Implement user options for windmove modifiers and prefixes

---
 lisp/windmove.el | 103 +++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 95 insertions(+), 8 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index 3d7f86b9af..95f74bfb81 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -162,6 +162,19 @@ windmove-window-distance-delta
 (make-obsolete-variable 'windmove-window-distance-delta
                         "no longer used." "27.1")
 
+(defconst windmove-modifier-type
+  '(choice (set :tag "Modifier Symbols"
+                :greedy t
+                ;; See `(elisp) Keyboard Events'
+                (const :tag "Meta" meta)
+                (const :tag "Control" control)
+                (const :tag "Shift" shift)
+                (const :tag "Hyper" hyper)
+                (const :tag "Super" super)
+                (const :tag "Alt" alt))
+           (const :tag "No modifier" none))
+  "Customisation type for windmove modifiers")
+
 \f
 ;; Note:
 ;;
@@ -419,6 +432,7 @@ windmove-down
   (interactive "P")
   (windmove-do-window-select 'down (and arg (prefix-numeric-value arg))))
 
+(defvar windmove-modifiers)
 
 ;;; set up keybindings
 ;; Idea for this function is from iswitchb.el, by Stephen Eglen
@@ -433,9 +447,10 @@ windmove-default-keybindings
 where MODIFIERS is either a list of modifiers or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to
 the arrow keys.
-Default value of MODIFIERS is `shift'."
+Default value of MODIFIERS is stored in `windmove-modifiers'."
   (interactive)
-  (unless modifiers (setq modifiers 'shift))
+  (unless modifiers
+    (setq modifiers windmove-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-left)
@@ -443,6 +458,25 @@ windmove-default-keybindings
   (global-set-key (vector (append modifiers '(up)))    'windmove-up)
   (global-set-key (vector (append modifiers '(down)))  'windmove-down))
 
+;; has to be declared AFTER windmove-default-keybindings, or else
+;; windmove is recursivly loaded
+;;;###autoload
+(defcustom windmove-modifiers '(shift super)
+  "Modifiers for `windmove-default-keybindings'.
+Can either be a symbol or list of modifier symbols,
+i.e. `meta',`control', `shift', `hyper', `super', or `alt'
+representing modifier keys to use with the arrow keys.
+
+If the value is just `none', the arrow keys will be directly
+bound to the windmove functions."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (when val
+           (windmove-swap-states-default-keybindings val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window display and selection
 
@@ -565,6 +599,8 @@ windmove-display-new-tab
   (interactive "P")
   (windmove-display-in-direction 'new-tab arg))
 
+(defvar windmove-display-modifiers)
+
 ;;;###autoload
 (defun windmove-display-default-keybindings (&optional modifiers)
   "Set up keybindings for directional buffer display.
@@ -573,7 +609,7 @@ windmove-display-default-keybindings
 where MODIFIERS is either a list of modifiers or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to
 the arrow keys.
-Default value of MODIFIERS is `shift-meta'."
+Default value of MODIFIERS is stored in `windmove-display-modifiers'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
   (when (eq modifiers 'none) (setq modifiers nil))
@@ -586,6 +622,17 @@ windmove-display-default-keybindings
   (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
   (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
 
+(defcustom windmove-display-modifiers '(shift meta)
+  "Modifiers for `windmove-display-default-keybindings'.
+Analogous to `windmove-modifiers'."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (when val
+           (windmove-display-default-keybindings val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window deletion
 
@@ -640,6 +687,9 @@ windmove-delete-down
   (interactive "P")
   (windmove-delete-in-direction 'down arg))
 
+(defvar windmove-delete-prefix)
+(defvar windmove-delete-modifiers)
+
 ;;;###autoload
 (defun windmove-delete-default-keybindings (&optional prefix modifiers)
   "Set up keybindings for directional window deletion.
@@ -649,12 +699,13 @@ windmove-delete-default-keybindings
 a single modifier.
 If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
 are directly bound to the arrow keys.
-Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+The default values for PREFIX and MODIFIERS are stored in `windmove-delete-prefix'
+and `windmove-delete-modifiers' respectively."
   (interactive)
-  (unless prefix (setq prefix '(?\C-x)))
+  (unless prefix (setq prefix (list windmove-delete-prefix)))
   (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
-  (unless modifiers (setq modifiers '(shift)))
+  (unless modifiers (setq modifiers windmove-delete-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
@@ -662,6 +713,28 @@ windmove-delete-default-keybindings
   (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
   (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
 
+(defcustom windmove-delete-prefix (kbd "C-x")
+  "Prefix for `windmove-delete-default-keybindings'."
+  :type 'key-sequence
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (windmove-delete-default-keybindings
+          val windmove-delete-modifiers)
+         (set-default sym val)))
+
+(defcustom windmove-delete-modifiers '(shift)
+  "Modifiers for `windmove-delete-default-keybindings'.
+See `windmove-modifiers' for more details"
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (when val
+           (windmove-delete-default-keybindings
+            windmove-delete-prefix val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window swap states
 
@@ -700,6 +773,8 @@ windmove-swap-states-right
   (interactive)
   (windmove-swap-states-in-direction 'right))
 
+(defvar windmove-swap-states-modifiers)
+
 ;;;###autoload
 (defun windmove-swap-states-default-keybindings (&optional modifiers)
   "Set up keybindings for directional window swap states.
@@ -709,9 +784,10 @@ windmove-swap-states-default-keybindings
 or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to the
 arrow keys.
-Default value of MODIFIERS is `shift-super'."
+Default value of MODIFIERS is stored in `windmove-swap-states-modifiers'."
   (interactive)
-  (unless modifiers (setq modifiers '(shift super)))
+  (unless modifiers
+    (setq modifiers windmove-swap-states-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
@@ -719,6 +795,17 @@ windmove-swap-states-default-keybindings
   (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
   (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
 
+(defcustom windmove-swap-states-modifiers
+  '(shift super)
+  "Modifiers for `windmove-swap-states-default-keybindings'.
+Analogous to `windmove-modifiers'."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (windmove-swap-states-default-keybindings val)
+         (set-default sym val)))
+
 \f
 (provide 'windmove)
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-05-22 18:26   ` Philip K.
@ 2020-05-22 19:15     ` Drew Adams
  2020-05-23 22:12     ` Juri Linkov
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-05-22 19:15 UTC (permalink / raw)
  To: philip, Juri Linkov; +Cc: 41438, emacs-devel

Please don't send the same mail to both the bug list and emacs-devel.  Thx.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-05-22 18:26   ` Philip K.
  2020-05-22 19:15     ` Drew Adams
@ 2020-05-23 22:12     ` Juri Linkov
  1 sibling, 0 replies; 838+ messages in thread
From: Juri Linkov @ 2020-05-23 22:12 UTC (permalink / raw)
  To: Philip K.; +Cc: 41438

>>> Another question I'd like to ask before trying it out: Would there be
>>> any interest in adding user options for the "default" modifiers that
>>> windmove should use? If yes, one could add a :set function that
>>> automatically calls the apropriate bindings function, when it's value
>>> is non-nil. I have a very customize-centric configuration, where something
>>> this would fit in very well.
>>
>> I think that adding defcustoms (including a new const `none')
>> would be the most natural way to customize windmove modifiers
>> (provided that the existing functions should remain).
>
> I made a first concept, but it doesn't work unless windmove is explicity
> required (see below). As far as I know, autoloading variables isn't good
> style, so is there any other way to invoke the :set property of a user
> option?

Recently we had a similar problem in char-fold.el that was solved using
defconst for the default value and a :set function, this might help here.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-05-21 16:56 bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers Philip K.
  2020-05-21 22:18 ` Juri Linkov
@ 2020-06-26 19:46 ` Philip K.
  2020-06-27 23:53   ` Juri Linkov
  1 sibling, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-06-26 19:46 UTC (permalink / raw)
  To: juri; +Cc: 41438


> Recently we had a similar problem in char-fold.el that was solved
> using defconst for the default value and a :set function, this might
> help here.

I've been trying to understand what was changed there (I presume you're
referring to 376f5df), but I don't think I can quite follow. What
difference does adding the defconst forms to the eval-and-compile block
do?

-- 
	Philip K.






^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-06-26 19:46 ` Philip K.
@ 2020-06-27 23:53   ` Juri Linkov
  2020-06-28  8:30     ` Philip K.
  0 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2020-06-27 23:53 UTC (permalink / raw)
  To: Philip K.; +Cc: 41438, 41438

>> Recently we had a similar problem in char-fold.el that was solved
>> using defconst for the default value and a :set function, this might
>> help here.
>
> I've been trying to understand what was changed there (I presume you're
> referring to 376f5df), but I don't think I can quite follow. What
> difference does adding the defconst forms to the eval-and-compile block
> do?

Actually, I meant not so much the defconst form (that is an unimportant
detail), but more the :set function, and also I forgot to mention
:initialize.  Their combination in char-fold.el looks like:

  :initialize #'custom-initialize-default
  :set (lambda (sym val)
         (custom-set-default sym val)
         (char-fold-update-table))

Then after loading char-fold.el, this function is executed at the top level:

(char-fold-update-table)

Maybe something like this could help to initialize default keybindings
after loading windmove.el.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-06-27 23:53   ` Juri Linkov
@ 2020-06-28  8:30     ` Philip K.
  2020-06-28 23:37       ` Juri Linkov
  0 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-06-28  8:30 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438

Juri Linkov <juri@linkov.net> writes:

> Actually, I meant not so much the defconst form (that is an unimportant
> detail), but more the :set function, and also I forgot to mention
> :initialize.  Their combination in char-fold.el looks like:
>
>   :initialize #'custom-initialize-default
>   :set (lambda (sym val)
>          (custom-set-default sym val)
>          (char-fold-update-table))
>
> Then after loading char-fold.el, this function is executed at the top level:
>
> (char-fold-update-table)
>
> Maybe something like this could help to initialize default keybindings
> after loading windmove.el.

I get what you were saying, but it seems the issue with windmove is the
opposite. Just loading windmove shouldn't create any new keybindings,
but customising the new user options should, *even if* windmove hasn't
been loaded yet (ideally).

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-06-28  8:30     ` Philip K.
@ 2020-06-28 23:37       ` Juri Linkov
  2020-08-05 18:05         ` Lars Ingebrigtsen
  0 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2020-06-28 23:37 UTC (permalink / raw)
  To: Philip K.; +Cc: 41438

> I get what you were saying, but it seems the issue with windmove is the
> opposite. Just loading windmove shouldn't create any new keybindings,
> but customising the new user options should, *even if* windmove hasn't
> been loaded yet (ideally).

Then it seems explicitly requiring windmove and autoloading variables
is unavoidable, so your previous patch was the right thing to do.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work
@ 2020-07-30  4:01 Brett Randall
       [not found] ` <handler.42611.B.159608273314264.ack@debbugs.gnu.org>
  2020-10-17  8:41 ` Lars Ingebrigtsen
  0 siblings, 2 replies; 838+ messages in thread
From: Brett Randall @ 2020-07-30  4:01 UTC (permalink / raw)
  To: 42611

[-- Attachment #1: Type: text/plain, Size: 4444 bytes --]

Actions that triggered the bug:


M-x edit-abbrevs


Enter abbrevs in fundamental or global abbreviations at bottom of the list, e.g.:


"dfn" 0 "definition"


C-c C-c


Buffer appears committed (modified flag disappears). Close buffer, test the abbrev in "abbrev-mode" minor mode and nothing happens. M-x edit-abbrevs again. The definition I entered is no longer there. This is in the same session. Emacs was not closed/reopened. The definitions are not applying/temporarily saving.


In GNU Emacs 26.3 (build 1, x86_64-pc-cygwin)
of 2019-08-31 built on moufang2
Repository revision: 522486e90a3d9402d836c2186be9e73299423cd9
Windowing system distributor 'Microsoft Corp.', version 10.0.19041
Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Quit
(New file)
Making completion list...
Abbrev mode enabled in current buffer
Saving all Org buffers... done


Configured using:
'configure
--srcdir=/home/kbrown/src/cygpackages/emacs/emacs-26.3-2.x86_64/src/emacs-26.3
--prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc
--docdir=/usr/share/doc/emacs --htmldir=/usr/share/doc/emacs/html -C
--with-w32 'CFLAGS=-ggdb -O2 -pipe -Wall -Werror=format-security
-Wp,-D_FORTIFY_SOURCE=2 -fstack-protector-strong
--param=ssp-buffer-size=4
-fdebug-prefix-map=/home/kbrown/src/cygpackages/emacs/emacs-26.3-2.x86_64/build=/usr/src/debug/emacs-26.3-2
-fdebug-prefix-map=/home/kbrown/src/cygpackages/emacs/emacs-26.3-2.x86_64/src/emacs-26.3=/usr/src/debug/emacs-26.3-2'
CPPFLAGS= LDFLAGS='


Configured features:
XPM JPEG TIFF GIF PNG IMAGEMAGICK SOUND DBUS GLIB NOTIFY ACL GNUTLS
LIBXML2 ZLIB TOOLKIT_SCROLL_BARS XIM THREADS LCMS2


Important settings:
locale-coding-system: nil


Major mode: Info


Minor modes in effect:
global-auto-revert-mode: t
tooltip-mode: t
global-eldoc-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
tool-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
buffer-read-only: t
line-number-mode: t
transient-mark-mode: t


Load-path shadows:
None found.


Features:
(shadow sort mail-extr emacsbug message rmc puny dired dired-loaddefs
rfc822 mml mml-sec epa derived epg gnus-util rmail rmail-loaddefs
mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils
mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr
mail-utils jka-compr info elec-pair org-element avl-tree generator org
org-macro org-footnote org-pcomplete pcomplete org-list org-faces
org-entities noutline outline easy-mmode org-version ob-emacs-lisp ob
ob-tangle org-src ob-ref ob-lob ob-table ob-keys ob-exp ob-comint comint
ansi-color ring ob-core ob-eval org-compat org-macs org-loaddefs
format-spec find-func cal-menu calendar cal-loaddefs edmacro kmacro
advice autorevert filenotify arjen-theme finder-inf package easymenu
epg-config url-handlers url-parse auth-source cl-seq eieio eieio-core
cl-macs eieio-loaddefs password-cache url-vars seq byte-opt gv bytecomp
byte-compile cconv cl-loaddefs cl-lib time-date mule-util tooltip eldoc
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel disp-table
term/w32-win w32-win w32-vars term/common-win tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode
lisp-mode prog-mode register page menu-bar rfn-eshadow isearch timer
select scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote threads dbusbind gfilenotify w32 lcms2 multi-tty
make-network-process emacs)


Memory information:
((conses 16 165726 13709)
(symbols 48 27132 1)
(miscs 40 72 220)
(strings 32 55598 1442)
(string-bytes 1 1610203)
(vectors 16 22900)
(vector-slots 8 589906 9136)
(floats 8 97 210)
(intervals 56 320 176)
(buffers 992 16))

Brett

[-- Attachment #2: Type: text/html, Size: 6111 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-06-28 23:37       ` Juri Linkov
@ 2020-08-05 18:05         ` Lars Ingebrigtsen
  2020-08-05 23:40           ` Juri Linkov
  0 siblings, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-05 18:05 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, Philip K.

Juri Linkov <juri@linkov.net> writes:

>> I get what you were saying, but it seems the issue with windmove is the
>> opposite. Just loading windmove shouldn't create any new keybindings,
>> but customising the new user options should, *even if* windmove hasn't
>> been loaded yet (ideally).
>
> Then it seems explicitly requiring windmove and autoloading variables
> is unavoidable, so your previous patch was the right thing to do.

The patch wasn't applied, though?  I know nothing about windmove, so I'm
not really qualified to have an opinion, but if you think it's the right
thing to do, then you should apply it?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-08-05 18:05         ` Lars Ingebrigtsen
@ 2020-08-05 23:40           ` Juri Linkov
  2020-08-06  9:28             ` Philip K.
  0 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2020-08-05 23:40 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 41438, Philip K.

>>> I get what you were saying, but it seems the issue with windmove is the
>>> opposite. Just loading windmove shouldn't create any new keybindings,
>>> but customising the new user options should, *even if* windmove hasn't
>>> been loaded yet (ideally).
>>
>> Then it seems explicitly requiring windmove and autoloading variables
>> is unavoidable, so your previous patch was the right thing to do.
>
> The patch wasn't applied, though?  I know nothing about windmove, so I'm
> not really qualified to have an opinion, but if you think it's the right
> thing to do, then you should apply it?

Philip, could you please prepare the final version of your patch
(I see there were some unfinished parts in your previous patch).





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-08-05 23:40           ` Juri Linkov
@ 2020-08-06  9:28             ` Philip K.
  2020-08-06 23:43               ` Juri Linkov
  0 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-08-06  9:28 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, larsi

Juri Linkov <juri@linkov.net> writes:

> Philip, could you please prepare the final version of your patch

Sure, I'll try to finish it today.

> (I see there were some unfinished parts in your previous patch).

It's been a while since I submitted it, so I had to re-read the thread,
but I'm not quite sure what the "unfinished" parts were, aside from the
missing autoload cookies. Sorry if I missed something :/

Also, the second patch (the one with the user options) depended on the
previous one in this thread[0], that introduced the "none" prefix. Is
that fine, or should I just merge both patches into one.

[0] https://debbugs.gnu.org/cgi/bugreport.cgi?bug=41438#5

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-08-06  9:28             ` Philip K.
@ 2020-08-06 23:43               ` Juri Linkov
  2020-08-07 10:53                 ` Philip K.
  0 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2020-08-06 23:43 UTC (permalink / raw)
  To: Philip K.; +Cc: 41438, larsi

>> (I see there were some unfinished parts in your previous patch).
>
> It's been a while since I submitted it, so I had to re-read the thread,
> but I'm not quite sure what the "unfinished" parts were, aside from the
> missing autoload cookies. Sorry if I missed something :/

I don't know, my impression seems to suggest the first version was not
completely tested, for example, windmove-modifiers defcustom called
windmove-swap-states-default-keybindings, not windmove-default-keybindings.
But maybe you already fixed this.

> Also, the second patch (the one with the user options) depended on the
> previous one in this thread[0], that introduced the "none" prefix. Is
> that fine, or should I just merge both patches into one.

This is perfectly fine - better to commit two separate patches.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-08-06 23:43               ` Juri Linkov
@ 2020-08-07 10:53                 ` Philip K.
  2020-08-08 23:54                   ` Juri Linkov
  2021-05-12 20:38                   ` Lars Ingebrigtsen
  0 siblings, 2 replies; 838+ messages in thread
From: Philip K. @ 2020-08-07 10:53 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, larsi

[-- Attachment #1: Type: text/plain, Size: 2002 bytes --]

Juri Linkov <juri@linkov.net> writes:

>>> (I see there were some unfinished parts in your previous patch).
>>
>> It's been a while since I submitted it, so I had to re-read the thread,
>> but I'm not quite sure what the "unfinished" parts were, aside from the
>> missing autoload cookies. Sorry if I missed something :/
>
> I don't know, my impression seems to suggest the first version was not
> completely tested, for example, windmove-modifiers defcustom called
> windmove-swap-states-default-keybindings, not windmove-default-keybindings.
> But maybe you already fixed this.

You're right, I still had a few local changes. A noteworthy addition is
that the user options unbind their previous bindings, before binding the
new ones. This should lead to more consistent behaviour when updating
the option a few times in the same session.

>> Also, the second patch (the one with the user options) depended on the
>> previous one in this thread[0], that introduced the "none" prefix. Is
>> that fine, or should I just merge both patches into one.
>
> This is perfectly fine - better to commit two separate patches.

Ok. I added both below.

But there are a few general issues I noticed:

1. windmove-display-{same-window,new-{frame,tab}} can disturb regular
   input when the modifier is set to shift or none. Possible solutions
   could be to prohibit using these modifiers or to add a prefix key and
   generate a warning when eg. "S-t" or "t" would be rebound.
2. The new function windmove--unbind works with the global-map, so when
   someone sets a prefix to none, and then changes it to something else,
   the arrow keys are left undefined. I could either see this being
   fixed by using a separate map or by somehow memorising what the
   previous key was (eg. by using the property list of the windmove
   command's symbol).

These are the only edge-cases I found, but I didn't fix them yet, as I'm
not sure what would be preferred. So the patches should not be applies yet.

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Allow-windmove-keys-to-be-bound-without-prefix-or-mo.patch --]
[-- Type: text/x-diff, Size: 3810 bytes --]

From f87d057b72f0cc374c132100664c5b8553bd58e2 Mon Sep 17 00:00:00 2001
From: Philip K <philip@warpmail.net>
Date: Thu, 21 May 2020 18:44:10 +0200
Subject: [PATCH] Allow windmove keys to be bound without prefix or modifiers

---
 lisp/windmove.el | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index 6557960064..613727f8ed 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -431,9 +431,12 @@ windmove-default-keybindings
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-left)
   (global-set-key (vector (append modifiers '(right))) 'windmove-right)
@@ -546,9 +549,12 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
   (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
@@ -618,11 +624,16 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
   (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
@@ -673,9 +684,13 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
   (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-- 
2.20.1


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0001-Add-user-options-to-bind-windmove-commands.patch --]
[-- Type: text/x-diff, Size: 11235 bytes --]

From c009311887372e1e822739edc050a802bfa4d1d8 Mon Sep 17 00:00:00 2001
From: Philip K <philipk@posteo.net>
Date: Fri, 7 Aug 2020 12:35:49 +0200
Subject: [PATCH] Add user options to bind windmove commands

* windmove.el (windmove-modifier-type): Create
(windmove--unbind): New constant
(windmove-modifiers): New user option
(windmove-default-keybindings): Use windmove-modifiers
(windmove-display-modifiers): New user option
(windmove-display-default-keybindings): Use windmove-display-modifiers
(windmove-delete-prefix): New user option
(windmove-delete-modifiers): New user option
(windmove-delete-default-keybindings): Use windmove-delete-prefix and
windmove-delete-modifiers
(windmove-swap-states-modifiers): New user option
(windmove-swap-states-default-keybindings): Use windmove-swap-states-modifiers
---
 lisp/windmove.el | 154 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 145 insertions(+), 9 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index 613727f8ed..9b68f9a5b9 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -162,6 +162,40 @@ windmove-window-distance-delta
 (make-obsolete-variable 'windmove-window-distance-delta
                         "no longer used." "27.1")
 
+(defconst windmove-modifier-type
+  '(choice (set :tag "Modifier Symbols"
+                :greedy t
+                ;; See `(elisp) Keyboard Events'
+                (const :tag "Meta" meta)
+                (const :tag "Control" control)
+                (const :tag "Shift" shift)
+                (const :tag "Hyper" hyper)
+                (const :tag "Super" super)
+                (const :tag "Alt" alt))
+           (const :tag "No modifier" none)
+           (const :tag "Not bound" nil))
+  "Customisation type for windmove modifiers")
+
+(defun windmove--unbind (prefix modifiers fns &optional extra)
+  "Unbind windmove commands, bound by PREFIX and MODIFIER.
+To ensure that only windmove functions are unbound, the command
+must be member of the list FNS.
+By default only the left, right, up and down keys are unbound,
+but further keys can be added via EXTRA."
+  (setq prefix
+        (cond ((eq prefix 'none) nil)
+              ((not (listp prefix)) (list prefix))
+              (t prefix)))
+  (setq modifiers
+        (cond ((eq modifiers 'none) nil)
+              ((not (listp modifiers)) (list modifiers))
+              (t modifiers)))
+  (dolist (dir (append '(left right up down) extra))
+    (let* ((key (append modifiers (list dir)))
+           (key (vconcat prefix (list key))))
+      (when (memq (lookup-key global-map key) fns)
+        (global-set-key key nil)))))
+
 \f
 ;; Note:
 ;;
@@ -419,6 +453,7 @@ windmove-down
   (interactive "P")
   (windmove-do-window-select 'down (and arg (prefix-numeric-value arg))))
 
+(defvar windmove-modifiers)
 
 ;;; set up keybindings
 ;; Idea for this function is from iswitchb.el, by Stephen Eglen
@@ -433,16 +468,41 @@ windmove-default-keybindings
 where MODIFIERS is either a list of modifiers or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to
 the arrow keys.
-Default value of MODIFIERS is `shift'."
+Default value of MODIFIERS is stored in `windmove-modifiers'."
   (interactive)
-  (unless modifiers (setq modifiers 'shift))
   (when (eq modifiers 'none) (setq modifiers nil))
+  (unless modifiers
+    (setq modifiers windmove-modifiers))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-left)
   (global-set-key (vector (append modifiers '(right))) 'windmove-right)
   (global-set-key (vector (append modifiers '(up)))    'windmove-up)
   (global-set-key (vector (append modifiers '(down)))  'windmove-down))
 
+;; has to be declared AFTER windmove-default-keybindings, or else
+;; windmove is recursivly loaded
+;;;###autoload
+(defcustom windmove-modifiers '(shift super)
+  "Modifiers for `windmove-default-keybindings'.
+Can either be a symbol or list of modifier symbols,
+i.e. `meta',`control', `shift', `hyper', `super', or `alt'
+representing modifier keys to use with the arrow keys.
+
+If the value is just `none', the arrow keys will be directly
+bound to the windmove functions."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (windmove--unbind nil (default-value sym)
+                           '(windmove-left
+                             windmove-right
+                             windmove-up
+                             windmove-down))
+         (when val
+           (windmove-default-keybindings val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window display and selection
 
@@ -543,6 +603,8 @@ windmove-display-new-tab
   (interactive "P")
   (windmove-display-in-direction 'new-tab arg))
 
+(defvar windmove-display-modifiers)
+
 ;;;###autoload
 (defun windmove-display-default-keybindings (&optional modifiers)
   "Set up keybindings for directional buffer display.
@@ -551,9 +613,10 @@ windmove-display-default-keybindings
 where MODIFIERS is either a list of modifiers or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to
 the arrow keys.
-Default value of MODIFIERS is `shift-meta'."
+Default value of MODIFIERS is stored in `windmove-display-modifiers'."
   (interactive)
-  (unless modifiers (setq modifiers '(shift meta)))
+  (unless modifiers
+    (setq modifiers windmove-display-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
@@ -564,6 +627,27 @@ windmove-display-default-keybindings
   (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
   (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
 
+;;;###autoload
+(defcustom windmove-display-modifiers '(shift meta)
+  "Modifiers for `windmove-display-default-keybindings'.
+Analogous to `windmove-modifiers'."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (windmove--unbind nil (default-value sym)
+                           '(windmove-display-left
+                             windmove-display-right
+                             windmove-display-up
+                             windmove-display-down
+                             windmove-display-same-window
+                             windmove-display-new-frame
+                             windmove-display-new-tab)
+                           '(?0 ?f ?t))
+         (when val
+           (windmove-display-default-keybindings val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window deletion
 
@@ -618,6 +702,9 @@ windmove-delete-down
   (interactive "P")
   (windmove-delete-in-direction 'down arg))
 
+(defvar windmove-delete-prefix)
+(defvar windmove-delete-modifiers)
+
 ;;;###autoload
 (defun windmove-delete-default-keybindings (&optional prefix modifiers)
   "Set up keybindings for directional window deletion.
@@ -627,12 +714,15 @@ windmove-delete-default-keybindings
 a single modifier.
 If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
 are directly bound to the arrow keys.
-Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+The default values for PREFIX and MODIFIERS are stored in `windmove-delete-prefix'
+and `windmove-delete-modifiers' respectively."
   (interactive)
-  (unless prefix (setq prefix '(?\C-x)))
+  (unless prefix
+    (setq prefix (list windmove-delete-prefix)))
   (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
-  (unless modifiers (setq modifiers '(shift)))
+  (unless modifiers
+    (setq modifiers windmove-delete-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
@@ -640,6 +730,32 @@ windmove-delete-default-keybindings
   (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
   (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
 
+(defcustom windmove-delete-prefix (kbd "C-x")
+  "Prefix for `windmove-delete-default-keybindings'."
+  :type 'key-sequence
+  :require 'windmove
+  :initialize #'custom-initialize-changed)
+
+;;;###autoload
+(defcustom windmove-delete-modifiers '(shift)
+  "Modifiers for `windmove-delete-default-keybindings'.
+See `windmove-modifiers' for more details"
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set-after '(windmove-delete-prefix)
+  :set (lambda (sym val)
+         (windmove--unbind windmove-delete-prefix
+                           (default-value sym)
+                           '(windmove-delete-left
+                             windmove-delete-right
+                             windmove-delete-up
+                             windmove-delete-down))
+         (when val
+           (windmove-delete-default-keybindings
+            windmove-delete-prefix val))
+         (set-default sym val)))
+
 \f
 ;;; Directional window swap states
 
@@ -678,6 +794,8 @@ windmove-swap-states-right
   (interactive)
   (windmove-swap-states-in-direction 'right))
 
+(defvar windmove-swap-states-modifiers)
+
 ;;;###autoload
 (defun windmove-swap-states-default-keybindings (&optional modifiers)
   "Set up keybindings for directional window swap states.
@@ -687,9 +805,10 @@ windmove-swap-states-default-keybindings
 or a single modifier.
 If MODIFIERS is `none', the keybindings will be directly bound to the
 arrow keys.
-Default value of MODIFIERS is `shift-super'."
+Default value of MODIFIERS is stored in `windmove-swap-states-modifiers'."
   (interactive)
-  (unless modifiers (setq modifiers '(shift super)))
+  (unless modifiers
+    (setq modifiers windmove-swap-states-modifiers))
   (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
   (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
@@ -697,6 +816,23 @@ windmove-swap-states-default-keybindings
   (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
   (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
 
+;;;###autoload
+(defcustom windmove-swap-states-modifiers '(shift super)
+  "Modifiers for `windmove-swap-states-default-keybindings'.
+Analogous to `windmove-modifiers'."
+  :type windmove-modifier-type
+  :require 'windmove
+  :initialize #'custom-initialize-changed
+  :set (lambda (sym val)
+         (windmove--unbind nil (default-value sym)
+                           '(windmove-swap-states-left
+                             windmove-swap-states-right
+                             windmove-swap-states-up
+                             windmove-swap-states-downp))
+         (when val
+           (windmove-swap-states-default-keybindings val))
+         (set-default sym val)))
+
 \f
 (provide 'windmove)
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* [PATCH] Remove obsolete fast-lock and lazy-lock libraries (was: Re: Deleting old `:version` from defcustoms)
  2020-05-15 20:58     ` Stefan Kangas
@ 2020-08-07 15:42       ` Stefan Kangas
  2020-08-08  2:19         ` [PATCH] Remove obsolete fast-lock and lazy-lock libraries Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-08-07 15:42 UTC (permalink / raw)
  To: Stefan Monnier, Emacs developers

[-- Attachment #1: Type: text/plain, Size: 1092 bytes --]

Stefan Kangas <stefankangas@gmail.com> writes:

> There are also these two libraries:
>
> ./lisp/obsolete/fast-lock.el9:;; Obsolete-since: 22.1
> ./lisp/obsolete/lazy-lock.el9:;; Obsolete-since: 22.1
>
> For some reason they weren't removed in 27.1, when most other libraries
> obsolete since 22.x were deleted.  This made me wonder if there was any
> particular reason for their non-removal.  Does anyone know?  And could
> we delete them now?

I have attached a patch to remove them below.

One thing to note is that I've kept the support for
'font-lock-support-mode' set to nil since Alan Mackenzie indicated
that this could be useful for debugging purposes here:
https://lists.gnu.org/archive/html/emacs-devel/2011-10/msg00748.html
Perhaps it should be changed into a defvar, though. Or maybe it is no
longer useful. But that could in any case be done separately, I think.

(In case anyone is wondering, the motivation here is that these
libraries are the only reason why some variables obsolete since 23.1
can't yet be removed.)

Any comments or objections?

Best regards,
Stefan Kangas

[-- Attachment #2: 0001-Remove-obsolete-fast-lock-and-lazy-lock-libraries.patch --]
[-- Type: text/x-patch, Size: 102437 bytes --]

From 7ecfac4412c0f1f126681fc9c99153ab5807e106 Mon Sep 17 00:00:00 2001
From: Stefan Kangas <stefankangas@gmail.com>
Date: Fri, 7 Aug 2020 17:17:08 +0200
Subject: [PATCH] Remove obsolete fast-lock and lazy-lock libraries

These libraries have been obsolete since 22.1.

* lisp/obsolete/fast-lock.el:
* lisp/obsolete/lazy-lock.el: Remove libraries obsolete since 22.1.

* lisp/font-lock.el (font-lock-turn-off-thing-lock)
(font-lock-after-fontify-buffer)
(font-lock-after-unfontify-buffer)
(font-lock-default-fontify-buffer)
(font-lock-default-unfontify-buffer, font-lock-support-mode):
* lisp/mail/rmail.el (rmail-variables):
* lisp/ps-print.el (ps-print-ensure-fontified): Remove support for
'fast-lock' and 'lazy-lock'.

* lisp/font-core.el (font-lock-defaults):
* lisp/font-lock.el (font-lock-inhibit-thing-lock)
(font-lock-keywords, top-level):
* lisp/progmodes/antlr-mode.el (top-level):
* lisp/progmodes/cc-fonts.el (c-font-lock-declarations):
* lisp/progmodes/cperl-mode.el (top-level):
* src/buffer.c (Fset_buffer_modified_p): Doc fixes to remove
references to 'fast-lock' and 'lazy-lock'.

* etc/NEWS: Announce that they have been removed.
---
 etc/NEWS                     |    5 +
 lisp/font-core.el            |    2 +-
 lisp/font-lock.el            |   83 +--
 lisp/mail/rmail.el           |    3 +-
 lisp/obsolete/fast-lock.el   |  841 ---------------------------
 lisp/obsolete/lazy-lock.el   | 1053 ----------------------------------
 lisp/progmodes/antlr-mode.el |    3 -
 lisp/progmodes/cc-fonts.el   |    2 +-
 lisp/progmodes/cperl-mode.el |    2 -
 lisp/ps-print.el             |    5 +-
 src/buffer.c                 |   14 +-
 11 files changed, 41 insertions(+), 1972 deletions(-)
 delete mode 100644 lisp/obsolete/fast-lock.el
 delete mode 100644 lisp/obsolete/lazy-lock.el

diff --git a/etc/NEWS b/etc/NEWS
index 850b166069..d80ef6865e 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -771,6 +771,11 @@ have now been removed.
 ** Some libraries obsolete since Emacs 23 have been removed:
 'ledit.el', 'lmenu.el', 'lucid.el and 'old-whitespace.el'.
 
+---
+** The 'lazy-lock' and 'fast-lock' libraries have been removed.
+They have been obsolete since 22.1.  Use 'jit-lock' instead (the
+default).
+
 \f
 * Lisp Changes in Emacs 28.1
 
diff --git a/lisp/font-core.el b/lisp/font-core.el
index 098253eb16..344d7ee2ad 100644
--- a/lisp/font-core.el
+++ b/lisp/font-core.el
@@ -63,7 +63,7 @@ font-lock-defaults
 `font-lock-syntactic-keywords' and those for buffer-specialized fontification
 functions, `font-lock-fontify-buffer-function',
 `font-lock-unfontify-buffer-function', `font-lock-fontify-region-function',
-`font-lock-unfontify-region-function', and `font-lock-inhibit-thing-lock'.")
+`font-lock-unfontify-region-function'.")
 ;;;###autoload
 (put 'font-lock-defaults 'risky-local-variable t)
 (make-variable-buffer-local 'font-lock-defaults)
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 5cda4a693d..f5adc5b768 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -47,9 +47,7 @@
 ;;
 ;; Fontification for a particular mode may be available in a number of levels
 ;; of decoration.  The higher the level, the more decoration, but the more time
-;; it takes to fontify.  See the variable `font-lock-maximum-decoration', and
-;; also the variable `font-lock-maximum-size'.  Support modes for Font Lock
-;; mode can be used to speed up Font Lock mode.  See `font-lock-support-mode'.
+;; it takes to fontify.  See the variable `font-lock-maximum-decoration'.
 \f
 ;;; How Font Lock mode fontifies:
 
@@ -471,8 +469,7 @@ font-lock-keywords
 These regular expressions can match text which spans lines,
 although it is better to avoid it if possible since updating them
 while editing text is slower, and it is not guaranteed to be
-always correct when using support modes like jit-lock or
-lazy-lock.
+always correct when using jit-lock.
 
 This variable is set by major modes via the variable
 `font-lock-defaults'.  Be careful when composing regexps for this
@@ -608,8 +605,7 @@ font-lock-unfontify-region-function
 
 (defvar font-lock-inhibit-thing-lock nil
   "List of Font Lock mode related modes that should not be turned on.
-Currently, valid mode names are `fast-lock-mode', `jit-lock-mode' and
-`lazy-lock-mode'.  This is normally set via `font-lock-defaults'.")
+This variable is now unused.")
 (make-obsolete-variable 'font-lock-inhibit-thing-lock nil "25.1")
 
 (defvar-local font-lock-multiline nil
@@ -879,25 +875,19 @@ font-lock-remove-keywords
 (defcustom font-lock-support-mode 'jit-lock-mode
   "Support mode for Font Lock mode.
 Support modes speed up Font Lock mode by being choosy about when fontification
-occurs.  The default support mode, Just-in-time Lock mode (symbol
-`jit-lock-mode'), is recommended.
-
-Other, older support modes are Fast Lock mode (symbol `fast-lock-mode') and
-Lazy Lock mode (symbol `lazy-lock-mode').  See those modes for more info.
-However, they are no longer recommended, as Just-in-time Lock mode is better.
+occurs.  The only supported mode is Just-in-time Lock mode (symbol
+`jit-lock-mode').
 
 If nil, means support for Font Lock mode is never performed.
 If a symbol, use that support mode.
 If a list, each element should be of the form (MAJOR-MODE . SUPPORT-MODE),
 where MAJOR-MODE is a symbol or t (meaning the default).  For example:
- ((c-mode . fast-lock-mode) (c++-mode . fast-lock-mode) (t . lazy-lock-mode))
-means that Fast Lock mode is used to support Font Lock mode for buffers in C or
-C++ modes, and Lazy Lock mode is used to support Font Lock mode otherwise.
+ ((c-mode . nil) (t . jit-lock-mode))
+means that no font locking is used for buffers in C or, and Jit
+Lock mode is used to support Font Lock mode otherwise.
 
 The value of this variable is used when Font Lock mode is turned on."
   :type '(choice (const :tag "none" nil)
-		 (const :tag "fast lock" fast-lock-mode)
-		 (const :tag "lazy lock" lazy-lock-mode)
 		 (const :tag "jit lock" jit-lock-mode)
 		 (repeat :menu-tag "mode specific" :tag "mode specific"
 			 :value ((t . jit-lock-mode))
@@ -907,28 +897,15 @@ font-lock-support-mode
 				      (symbol :tag "name"))
 			       (radio :tag "Support"
 				      (const :tag "none" nil)
-				      (const :tag "fast lock" fast-lock-mode)
-				      (const :tag "lazy lock" lazy-lock-mode)
 				      (const :tag "JIT lock" jit-lock-mode)))
 			 ))
   :version "21.1"
   :group 'font-lock)
 
-(defvar fast-lock-mode)
-(defvar lazy-lock-mode)
 (defvar jit-lock-mode)
 
-(declare-function fast-lock-after-fontify-buffer "fast-lock")
-(declare-function fast-lock-after-unfontify-buffer "fast-lock")
-(declare-function fast-lock-mode "fast-lock")
-(declare-function lazy-lock-after-fontify-buffer "lazy-lock")
-(declare-function lazy-lock-after-unfontify-buffer "lazy-lock")
-(declare-function lazy-lock-mode "lazy-lock")
-
 (defun font-lock-turn-on-thing-lock ()
   (pcase (font-lock-value-in-major-mode font-lock-support-mode)
-    ('fast-lock-mode (fast-lock-mode t))
-    ('lazy-lock-mode (lazy-lock-mode t))
     ('jit-lock-mode
      ;; Prepare for jit-lock
      (remove-hook 'after-change-functions
@@ -954,37 +931,29 @@ font-lock-turn-on-thing-lock
                nil t))))
 
 (defun font-lock-turn-off-thing-lock ()
-  (cond ((bound-and-true-p fast-lock-mode)
-	 (fast-lock-mode -1))
-	((bound-and-true-p jit-lock-mode)
+  (cond ((bound-and-true-p jit-lock-mode)
 	 (jit-lock-unregister 'font-lock-fontify-region)
 	 ;; Reset local vars to the non-jit-lock case.
-	 (kill-local-variable 'font-lock-fontify-buffer-function))
-	((bound-and-true-p lazy-lock-mode)
-	 (lazy-lock-mode -1))))
+	 (kill-local-variable 'font-lock-fontify-buffer-function))))
 
 (defun font-lock-after-fontify-buffer ()
-  (cond ((bound-and-true-p fast-lock-mode)
-	 (fast-lock-after-fontify-buffer))
-	;; Useless now that jit-lock intercepts font-lock-fontify-buffer.  -sm
-	;; (jit-lock-mode
-	;;  (jit-lock-after-fontify-buffer))
-	((bound-and-true-p lazy-lock-mode)
-	 (lazy-lock-after-fontify-buffer))))
+  (declare (obsolete "does nothing." "28.1"))
+  ;; Useless now that jit-lock intercepts font-lock-fontify-buffer.  -sm
+  ;; (jit-lock-mode
+  ;;  (jit-lock-after-fontify-buffer))
+  )
 
 (defun font-lock-after-unfontify-buffer ()
-  (cond ((bound-and-true-p fast-lock-mode)
-	 (fast-lock-after-unfontify-buffer))
-	;; Useless as well.  It's only called when:
-	;; - turning off font-lock: it does not matter if we leave spurious
-	;;   `fontified' text props around since jit-lock-mode is also off.
-	;; - font-lock-default-fontify-buffer fails: this is not run
-	;;   any more anyway.   -sm
-	;;
-	;; (jit-lock-mode
-	;;  (jit-lock-after-unfontify-buffer))
-	((bound-and-true-p lazy-lock-mode)
-	 (lazy-lock-after-unfontify-buffer))))
+  (declare (obsolete "does nothing." "28.1"))
+  ;; Useless as well.  It's only called when:
+  ;; - turning off font-lock: it does not matter if we leave spurious
+  ;;   `fontified' text props around since jit-lock-mode is also off.
+  ;; - font-lock-default-fontify-buffer fails: this is not run
+  ;;   any more anyway.   -sm
+  ;;
+  ;; (jit-lock-mode
+  ;;  (jit-lock-after-unfontify-buffer))
+  )
 
 ;;; End of Font Lock Support mode.
 \f
@@ -1141,7 +1110,6 @@ font-lock-default-fontify-buffer
 	    (save-excursion
 	      (save-match-data
 		(font-lock-fontify-region (point-min) (point-max) verbose)
-		(font-lock-after-fontify-buffer)
 		(setq font-lock-fontified t)))
 	  ;; We don't restore the old fontification, so it's best to unfontify.
 	  (quit (font-lock-unfontify-buffer)))))))
@@ -1152,7 +1120,6 @@ font-lock-default-unfontify-buffer
   (save-restriction
     (widen)
     (font-lock-unfontify-region (point-min) (point-max))
-    (font-lock-after-unfontify-buffer)
     (setq font-lock-fontified nil)))
 
 (defvar font-lock-dont-widen nil
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 44cde7cb5a..bbc220cfd1 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -1518,8 +1518,7 @@ rmail-variables
 	'(rmail-font-lock-keywords
 	  t t nil nil
 	  (font-lock-maximum-size . nil)
-          (font-lock-dont-widen . t)
-	  (font-lock-inhibit-thing-lock . (lazy-lock-mode fast-lock-mode))))
+          (font-lock-dont-widen . t)))
   (make-local-variable 'require-final-newline)
   (setq require-final-newline nil)
   (make-local-variable 'version-control)
diff --git a/lisp/obsolete/fast-lock.el b/lisp/obsolete/fast-lock.el
deleted file mode 100644
index 9e0198dd59..0000000000
--- a/lisp/obsolete/fast-lock.el
+++ /dev/null
@@ -1,841 +0,0 @@
-;;; fast-lock.el --- automagic text properties caching for fast Font Lock mode
-
-;; Copyright (C) 1994-1998, 2001-2020 Free Software Foundation, Inc.
-
-;; Author: Simon Marshall <simon@gnu.org>
-;; Maintainer: emacs-devel@gnu.org
-;; Keywords: faces files
-;; Version: 3.14
-;; Obsolete-since: 22.1
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Fast Lock mode is a Font Lock support mode.
-;; It makes visiting a file in Font Lock mode faster by restoring its face text
-;; properties from automatically saved associated Font Lock cache files.
-;;
-;; See caveats and feedback below.
-;; See also the lazy-lock package.  (But don't use the two at the same time!)
-
-;; Installation:
-;;
-;; Put in your ~/.emacs:
-;;
-;; (setq font-lock-support-mode 'fast-lock-mode)
-;;
-;; Start up a new Emacs and use font-lock as usual (except that you can use the
-;; so-called "gaudier" fontification regexps on big files without frustration).
-;;
-;; When you visit a file (which has `font-lock-mode' enabled) that has a
-;; corresponding Font Lock cache file associated with it, the Font Lock cache
-;; will be loaded from that file instead of being generated by Font Lock code.
-
-;; Caveats:
-;;
-;; A cache will be saved when visiting a compressed file using crypt++, but not
-;; be read.  This is a "feature"/"consequence"/"bug" of crypt++.
-;;
-;; Version control packages are likely to stamp all over file modification
-;; times.  Therefore the act of checking out may invalidate a cache.
-\f
-;; History:
-;;
-;; 0.02--1.00:
-;; - Changed name from turbo-prop to fast-lock.  Automagic for font-lock only
-;; - Made `fast-lock-mode' a minor mode, like G. Dinesh Dutt's fss-mode
-;; 1.00--1.01:
-;; - Turn on `fast-lock-mode' only if `buffer-file-name' or `interactive-p'
-;; - Made `fast-lock-file-name' use `buffer-name' if `buffer-file-name' is nil
-;; - Moved save-all conditions to `fast-lock-save-cache'
-;; - Added `fast-lock-save-text-properties' to `kill-buffer-hook'
-;; 1.01--2.00: complete rewrite---not worth the space to document
-;; - Changed structure of text properties cache and threw out file mod checks
-;; 2.00--2.01:
-;; - Made `condition-case' forms understand `quit'.
-;; - Made `fast-lock' require `font-lock'
-;; - Made `fast-lock-cache-name' chase links (from Ben Liblit)
-;; 2.01--3.00:
-;; - Changed structure of cache to include `font-lock-keywords' (from rms)
-;; - Changed `fast-lock-cache-mechanisms' to `fast-lock-cache-directories'
-;; - Removed `fast-lock-read-others'
-;; - Made `fast-lock-read-cache' ignore cache owner
-;; - Made `fast-lock-save-cache-external' create cache directory
-;; - Made `fast-lock-save-cache-external' save `font-lock-keywords'
-;; - Made `fast-lock-cache-data' check `font-lock-keywords'
-;; 3.00--3.01: incorporated port of 2.00 to Lucid, made by Barry Warsaw
-;; - Package now provides itself
-;; - Lucid: Use `font-lock-any-extents-p' for `font-lock-any-properties-p'
-;; - Lucid: Use `list-faces' for `face-list'
-;; - Lucid: Added `set-text-properties'
-;; - Lucid: Made `turn-on-fast-lock' pass 1 not t to `fast-lock-mode'
-;; - Removed test for `fast-lock-mode' from `fast-lock-read-cache'
-;; - Lucid: Added Lucid-specific `fast-lock-get-face-properties'
-;; 3.01--3.02: now works with Lucid Emacs, thanks to Barry Warsaw
-;; - Made `fast-lock-cache-name' map ":" to ";" for OS/2 (from Serganova Vera)
-;; - Made `fast-lock-cache-name' use abbreviated file name (from Barry Warsaw)
-;; - Lucid: Separated handlers for `error' and `quit' for `condition-case'
-;; 3.02--3.03:
-;; - Changed `fast-lock-save-cache-external' to `fast-lock-save-cache-data'
-;; - Lucid: Added Lucid-specific `fast-lock-set-face-properties'
-;; 3.03--3.04:
-;; - Corrected `subrp' test of Lucid code
-;; - Replaced `font-lock-any-properties-p' with `text-property-not-all'
-;; - Lucid: Made `fast-lock-set-face-properties' put `text-prop' on extents
-;; - Made `fast-lock-cache-directories' a regexp alist (from Colin Rafferty)
-;; - Made `fast-lock-cache-directory' to return a usable cache file directory
-;; 3.04--3.05:
-;; - Lucid: Fix for XEmacs 19.11 `text-property-not-all'
-;; - Replaced `subrp' test of Lucid code with `emacs-version' `string-match'
-;; - Made `byte-compile-warnings' omit `unresolved' on compilation
-;; - Made `fast-lock-save-cache-data' use a buffer (from Rick Sladkey)
-;; - Reverted to old `fast-lock-get-face-properties' (from Rick Sladkey)
-;; 3.05--3.06: incorporated hack of 3.03, made by Jonathan Stigelman (Stig)
-;; - Reverted to 3.04 version of `fast-lock-get-face-properties'
-;; - XEmacs: Removed `list-faces' `defalias'
-;; - Made `fast-lock-mode' and `turn-on-fast-lock' succeed `autoload' cookies
-;; - Added `fast-lock-submit-bug-report'
-;; - Renamed `fast-lock-save-size' to `fast-lock-minimum-size'
-;; - Made `fast-lock-save-cache' output a message if no save ever attempted
-;; - Made `fast-lock-save-cache-data' output a message if save attempted
-;; - Made `fast-lock-cache-data' output a message if load attempted
-;; - Made `fast-lock-save-cache-data' do `condition-case' not `unwind-protect'
-;; - Made `fast-lock-save-cache' and `fast-lock-read-cache' return nothing
-;; - Made `fast-lock-save-cache' check `buffer-modified-p' (Stig)
-;; - Added `fast-lock-save-events'
-;; - Added `fast-lock-after-save-hook' to `after-save-hook' (Stig)
-;; - Added `fast-lock-kill-buffer-hook' to `kill-buffer-hook'
-;; - Changed `fast-lock-save-caches' to `fast-lock-kill-emacs-hook'
-;; - Added `fast-lock-kill-emacs-hook' to `kill-emacs-hook'
-;; - Made `fast-lock-save-cache' check `verify-visited-file-modtime' (Stig)
-;; - Made `visited-file-modtime' be the basis of the timestamp (Stig)
-;; - Made `fast-lock-save-cache-1' and `fast-lock-cache-data' use/reformat it
-;; - Added `fast-lock-cache-filename' to keep track of the cache file name
-;; - Added `fast-lock-after-fontify-buffer'
-;; - Added `fast-lock-save-faces' list of faces to save (idea from Stig/Tibor)
-;; - Made `fast-lock-get-face-properties' functions use it
-;; - XEmacs: Made `fast-lock-set-face-properties' do extents the Font Lock way
-;; - XEmacs: Removed fix for `text-property-not-all' (19.11 support dropped)
-;; - Made `fast-lock-mode' ensure `font-lock-mode' is on
-;; - Made `fast-lock-save-cache' do `cdr-safe' not `cdr' (from Dave Foster)
-;; - Made `fast-lock-save-cache' do `set-buffer' first (from Dave Foster)
-;; - Made `fast-lock-save-cache' loop until saved or quit (from Georg Nikodym)
-;; - Made `fast-lock-cache-data' check `buffer-modified-p'
-;; - Made `fast-lock-cache-data' do `font-lock-compile-keywords' if necessary
-;; - XEmacs: Made `font-lock-compile-keywords' `defalias'
-;; 3.06--3.07:
-;; - XEmacs: Add `fast-lock-after-fontify-buffer' to the Font Lock hook
-;; - Made `fast-lock-cache-name' explain the use of `directory-abbrev-alist'
-;; - Made `fast-lock-mode' use `buffer-file-truename' not `buffer-file-name'
-;; 3.07--3.08:
-;; - Made `fast-lock-read-cache' set `fast-lock-cache-filename'
-;; 3.08--3.09:
-;; - Made `fast-lock-save-cache' cope if `fast-lock-minimum-size' is a list
-;; - Made `fast-lock-mode' respect the value of `font-lock-inhibit-thing-lock'
-;; - Added `fast-lock-after-unfontify-buffer'
-;; 3.09--3.10:
-;; - Rewrite for Common Lisp macros
-;; - Made fast-lock.el barf on a crap 8+3 pseudo-OS (Eli Zaretskii help)
-;; - XEmacs: Made `add-minor-mode' succeed `autoload' cookie
-;; - XEmacs: Made `fast-lock-save-faces' default to `font-lock-face-list'
-;; - Made `fast-lock-save-cache' use `font-lock-value-in-major-mode'
-;; - Wrap with `save-buffer-state' (Ray Van Tassle report)
-;; - Made `fast-lock-mode' wrap `font-lock-support-mode'
-;; 3.10--3.11:
-;; - Made `fast-lock-get-face-properties' cope with face lists
-;; - Added `fast-lock-verbose'
-;; - XEmacs: Add `font-lock-value-in-major-mode' if necessary
-;; - Removed `fast-lock-submit-bug-report' and bade farewell
-;; 3.11--3.12:
-;; - Added Custom support (Hrvoje Nikšić help)
-;; - Made `save-buffer-state' wrap `inhibit-point-motion-hooks'
-;; - Made `fast-lock-cache-data' simplify calls of `font-lock-compile-keywords'
-;; 3.12--3.13:
-;; - Removed `byte-*' variables from `eval-when-compile' (Erik Naggum hint)
-;; - Changed structure of cache to include `font-lock-syntactic-keywords'
-;; - Made `fast-lock-save-cache-1' save syntactic fontification data
-;; - Made `fast-lock-cache-data' take syntactic fontification data
-;; - Added `fast-lock-get-syntactic-properties'
-;; - Renamed `fast-lock-set-face-properties' to `fast-lock-add-properties'
-;; - Made `fast-lock-add-properties' add syntactic and face fontification data
-;; 3.13--3.14:
-;; - Made `fast-lock-cache-name' cope with `windowsnt' (Geoff Voelker fix)
-;; - Made `fast-lock-verbose' use `other' widget (Andreas Schwab fix)
-;; - Used `with-temp-message' where possible to make messages temporary.
-\f
-;;; Code:
-
-(require 'font-lock)
-
-(declare-function msdos-long-file-names "msdos.c")
-
-;; Make sure fast-lock.el is supported.
-(if (and (eq system-type 'ms-dos) (not (msdos-long-file-names)))
-    (error "`fast-lock' was written for long file name systems"))
-
-(defvar font-lock-face-list)
-
-(eval-when-compile
- ;; We use this to preserve or protect things when modifying text properties.
- (defmacro save-buffer-state (varlist &rest body)
-   "Bind variables according to VARLIST and eval BODY restoring buffer state."
-   `(let* (,@(append varlist
-                     '((modified (buffer-modified-p)) (buffer-undo-list t)
-                       (inhibit-read-only t) (inhibit-point-motion-hooks t)
-                       (inhibit-modification-hooks t)
-                       deactivate-mark buffer-file-name buffer-file-truename)))
-     ,@body
-     (when (and (not modified) (buffer-modified-p))
-       (set-buffer-modified-p nil))))
- (put 'save-buffer-state 'lisp-indent-function 1)
- ;;
- ;; We use this to verify that a face should be saved.
- (defmacro fast-lock-save-facep (face)
-   "Return non-nil if FACE is one of `fast-lock-save-faces'."
-   `(or (null fast-lock-save-faces)
-     (if (symbolp ,face)
-         (memq ,face fast-lock-save-faces)
-         (let ((faces ,face))
-           (while (unless (memq (car faces) fast-lock-save-faces)
-                    (setq faces (cdr faces))))
-           faces)))))
-
-(defgroup fast-lock nil
-  "Font Lock support mode to cache fontification."
-  :load 'fast-lock
-  :group 'font-lock)
-
-(defvar fast-lock-mode nil)		; Whether we are turned on.
-(defvar fast-lock-cache-timestamp nil)	; For saving/reading.
-(defvar fast-lock-cache-filename nil)	; For deleting.
-\f
-;; User Variables:
-
-(defcustom fast-lock-minimum-size 25600
-  "Minimum size of a buffer for cached fontification.
-Only buffers more than this can have associated Font Lock cache files saved.
-If nil, means cache files are never created.
-If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
-where MAJOR-MODE is a symbol or t (meaning the default).  For example:
- ((c-mode . 25600) (c++-mode . 25600) (rmail-mode . 1048576))
-means that the minimum size is 25K for buffers in C or C++ modes, one megabyte
-for buffers in Rmail mode, and size is irrelevant otherwise."
-  :type '(choice (const :tag "none" nil)
-		 (integer :tag "size")
-		 (repeat :menu-tag "mode specific" :tag "mode specific"
-			 :value ((t . nil))
-			 (cons :tag "Instance"
-			       (radio :tag "Mode"
-				      (const :tag "all" t)
-				      (symbol :tag "name"))
-			       (radio :tag "Size"
-				      (const :tag "none" nil)
-				      (integer :tag "size")))))
-  :group 'fast-lock)
-
-(defcustom fast-lock-cache-directories '("~/.emacs-flc")
-; - `internal', keep each file's Font Lock cache file in the same file.
-; - `external', keep each file's Font Lock cache file in the same directory.
-  "Directories in which Font Lock cache files are saved and read.
-Each item should be either DIR or a cons pair of the form (REGEXP . DIR) where
-DIR is a directory name (relative or absolute) and REGEXP is a regexp.
-
-An attempt will be made to save or read Font Lock cache files using these items
-until one succeeds (i.e., until a readable or writable one is found).  If an
-item contains REGEXP, DIR is used only if the buffer file name matches REGEXP.
-For example:
-
- (let ((home (expand-file-name (abbreviate-file-name (file-truename \"~/\")))))
-   (list (cons (concat \"^\" (regexp-quote home)) \".\") \"~/.emacs-flc\"))
-    =>
- ((\"^/your/true/home/directory/\" . \".\") \"~/.emacs-flc\")
-
-would cause a file's current directory to be used if the file is under your
-home directory hierarchy, or otherwise the absolute directory `~/.emacs-flc'.
-For security reasons, it is not advisable to use the file's current directory
-to avoid the possibility of using the cache of another user."
-  :type '(repeat (radio (directory :tag "directory")
-			(cons :tag "Matching"
-			      (regexp :tag "regexp")
-			      (directory :tag "directory"))))
-  :group 'fast-lock)
-(put 'fast-lock-cache-directories 'risky-local-variable t)
-
-(defcustom fast-lock-save-events '(kill-buffer kill-emacs)
-  "Events under which caches will be saved.
-Valid events are `save-buffer', `kill-buffer' and `kill-emacs'.
-If concurrent editing sessions use the same associated cache file for a file's
-buffer, then you should add `save-buffer' to this list."
-  :type '(set (const :tag "buffer saving" save-buffer)
-	      (const :tag "buffer killing" kill-buffer)
-	      (const :tag "emacs killing" kill-emacs))
-  :group 'fast-lock)
-
-(defcustom fast-lock-save-others t
-  "If non-nil, save Font Lock cache files irrespective of file owner.
-If nil, means only buffer files known to be owned by you can have associated
-Font Lock cache files saved.  Ownership may be unknown for networked files."
-  :type 'boolean
-  :group 'fast-lock)
-
-(defcustom fast-lock-verbose font-lock-verbose
-  "If non-nil, means show status messages for cache processing.
-If a number, only buffers greater than this size have processing messages."
-  :type '(choice (const :tag "never" nil)
-		 (other :tag "always" t)
-		 (integer :tag "size"))
-  :group 'fast-lock)
-
-(defvar fast-lock-save-faces
-  (when (featurep 'xemacs)
-    ;; XEmacs uses extents for everything, so we have to pick the right ones.
-    font-lock-face-list)
-  "Faces that will be saved in a Font Lock cache file.
-If nil, means information for all faces will be saved.")
-\f
-;; User Functions:
-
-;;;###autoload
-(defun fast-lock-mode (&optional arg)
-  "Toggle Fast Lock mode.
-With arg, turn Fast Lock mode on if and only if arg is positive and the buffer
-is associated with a file.  Enable it automatically in your `~/.emacs' by:
-
- (setq font-lock-support-mode \\='fast-lock-mode)
-
-If Fast Lock mode is enabled, and the current buffer does not contain any text
-properties, any associated Font Lock cache is used if its timestamp matches the
-buffer's file, and its `font-lock-keywords' match those that you are using.
-
-Font Lock caches may be saved:
-- When you save the file's buffer.
-- When you kill an unmodified file's buffer.
-- When you exit Emacs, for all unmodified or saved buffers.
-Depending on the value of `fast-lock-save-events'.
-See also the commands `fast-lock-read-cache' and `fast-lock-save-cache'.
-
-Use \\[font-lock-fontify-buffer] to fontify the buffer if the cache is bad.
-
-Various methods of control are provided for the Font Lock cache.  In general,
-see variable `fast-lock-cache-directories' and function `fast-lock-cache-name'.
-For saving, see variables `fast-lock-minimum-size', `fast-lock-save-events',
-`fast-lock-save-others' and `fast-lock-save-faces'."
-  (interactive "P")
-  ;; Only turn on if we are visiting a file.  We could use `buffer-file-name',
-  ;; but many packages temporarily wrap that to nil when doing their own thing.
-  (set (make-local-variable 'fast-lock-mode)
-       (and buffer-file-truename
-	    (not (memq 'fast-lock-mode font-lock-inhibit-thing-lock))
-	    (if arg (> (prefix-numeric-value arg) 0) (not fast-lock-mode))))
-  (if (and fast-lock-mode (not font-lock-mode))
-      ;; Turned on `fast-lock-mode' rather than `font-lock-mode'.
-      (progn
-        (message "Use font-lock-support-mode rather than calling fast-lock-mode")
-        (sit-for 2))
-    ;; Let's get down to business.
-    (set (make-local-variable 'fast-lock-cache-timestamp) nil)
-    (set (make-local-variable 'fast-lock-cache-filename) nil)
-    (when (and fast-lock-mode (not font-lock-fontified))
-      (fast-lock-read-cache))))
-
-(defun fast-lock-read-cache ()
-  "Read the Font Lock cache for the current buffer.
-
-The following criteria must be met for a Font Lock cache file to be read:
-- Fast Lock mode must be turned on in the buffer.
-- The buffer must not be modified.
-- The buffer's `font-lock-keywords' must match the cache's.
-- The buffer file's timestamp must match the cache's.
-- Criteria imposed by `fast-lock-cache-directories'.
-
-See `fast-lock-mode'."
-  (interactive)
-  (let ((directories fast-lock-cache-directories)
-	(modified (buffer-modified-p)) (inhibit-read-only t)
-	(fontified font-lock-fontified))
-    (set (make-local-variable 'font-lock-fontified) nil)
-    ;; Keep trying directories until fontification is turned off.
-    (while (and directories (not font-lock-fontified))
-      (let ((directory (fast-lock-cache-directory (car directories) nil)))
-	(condition-case nil
-	    (when directory
-	      (setq fast-lock-cache-filename (fast-lock-cache-name directory))
-	      (when (file-readable-p fast-lock-cache-filename)
-		(load fast-lock-cache-filename t t t)))
-	  (error nil) (quit nil))
-	(setq directories (cdr directories))))
-    ;; Unset `fast-lock-cache-filename', and restore `font-lock-fontified', if
-    ;; we don't use a cache.  (Note that `fast-lock-cache-data' sets the value
-    ;; of `fast-lock-cache-timestamp'.)
-    (set-buffer-modified-p modified)
-    (unless font-lock-fontified
-      (setq fast-lock-cache-filename nil font-lock-fontified fontified))))
-
-(defun fast-lock-save-cache (&optional buffer)
-  "Save the Font Lock cache of BUFFER or the current buffer.
-
-The following criteria must be met for a Font Lock cache file to be saved:
-- Fast Lock mode must be turned on in the buffer.
-- The event must be one of `fast-lock-save-events'.
-- The buffer must be at least `fast-lock-minimum-size' bytes long.
-- The buffer file must be owned by you, or `fast-lock-save-others' must be t.
-- The buffer must contain at least one `face' text property.
-- The buffer must not be modified.
-- The buffer file's timestamp must be the same as the file's on disk.
-- The on disk file's timestamp must be different than the buffer's cache.
-- Criteria imposed by `fast-lock-cache-directories'.
-
-See `fast-lock-mode'."
-  (interactive)
-  (save-excursion
-    (when buffer
-      (set-buffer buffer))
-    (let ((min-size (font-lock-value-in-major-mode fast-lock-minimum-size))
-	  (file-timestamp (visited-file-modtime)) (saved nil))
-      (when (and fast-lock-mode
-	     ;;
-	     ;; "Only save if the buffer matches the file, the file has
-	     ;; changed, and it was changed by the current emacs session."
-	     ;;
-	     ;; Only save if the buffer is not modified,
-	     ;; (i.e., so we don't save for something not on disk)
-	     (not (buffer-modified-p))
-	     ;; and the file's timestamp is the same as the buffer's,
-	     ;; (i.e., someone else hasn't written the file in the meantime)
-	     (verify-visited-file-modtime (current-buffer))
-	     ;; and the file's timestamp is different from the cache's.
-	     ;; (i.e., a save has occurred since the cache was read)
-	     (not (equal fast-lock-cache-timestamp file-timestamp))
-	     ;;
-	     ;; Only save if user's restrictions are satisfied.
-	     (and min-size (>= (buffer-size) min-size))
-	     (or fast-lock-save-others
-		 (eq (user-uid) (file-attribute-user-id
-				 (file-attributes buffer-file-name))))
-	     ;;
-	     ;; Only save if there are `face' properties to save.
-	     (text-property-not-all (point-min) (point-max) 'face nil))
-	;;
-	;; Try each directory until we manage to save or the user quits.
-	(let ((directories fast-lock-cache-directories))
-	  (while (and directories (memq saved '(nil error)))
-	    (let* ((dir (fast-lock-cache-directory (car directories) t))
-		   (file (and dir (fast-lock-cache-name dir))))
-	      (when (and file (file-writable-p file))
-		(setq saved (fast-lock-save-cache-1 file file-timestamp)))
-	      (setq directories (cdr directories)))))))))
-
-;;;###autoload
-(defun turn-on-fast-lock ()
-  "Unconditionally turn on Fast Lock mode."
-  (fast-lock-mode t))
-\f
-;;; API Functions:
-
-(defun fast-lock-after-fontify-buffer ()
-  ;; Delete the Font Lock cache file used to restore fontification, if any.
-  (when fast-lock-cache-filename
-    (if (file-writable-p fast-lock-cache-filename)
-	(delete-file fast-lock-cache-filename)
-      (message "File %s font lock cache cannot be deleted" (buffer-name))))
-  ;; Flag so that a cache will be saved later even if the file is never saved.
-  (setq fast-lock-cache-timestamp nil))
-
-(defalias 'fast-lock-after-unfontify-buffer
-  'ignore)
-\f
-;; Miscellaneous Functions:
-
-(defun fast-lock-save-cache-after-save-file ()
-  ;; Do `fast-lock-save-cache' if `save-buffer' is on `fast-lock-save-events'.
-  (when (memq 'save-buffer fast-lock-save-events)
-    (fast-lock-save-cache)))
-
-(defun fast-lock-save-cache-before-kill-buffer ()
-  ;; Do `fast-lock-save-cache' if `kill-buffer' is on `fast-lock-save-events'.
-  (when (memq 'kill-buffer fast-lock-save-events)
-    (fast-lock-save-cache)))
-
-(defun fast-lock-save-caches-before-kill-emacs ()
-  ;; Do `fast-lock-save-cache's if `kill-emacs' is on `fast-lock-save-events'.
-  (when (memq 'kill-emacs fast-lock-save-events)
-    (mapcar 'fast-lock-save-cache (buffer-list))))
-
-(defun fast-lock-cache-directory (directory create)
-  "Return usable directory based on DIRECTORY.
-Returns nil if the directory does not exist, or, if CREATE non-nil, cannot be
-created.  DIRECTORY may be a string or a cons pair of the form (REGEXP . DIR).
-See `fast-lock-cache-directories'."
-  (let ((dir
-	 (cond ((not buffer-file-name)
-		;; Should never be nil, but `crypt++' screws it up.
-		nil)
-	       ((stringp directory)
-		;; Just a directory.
-		directory)
-	       (t
-		;; A directory if the file name matches the regexp.
-		(let ((bufile (expand-file-name buffer-file-truename))
-		      (case-fold-search nil))
-		  (when (save-match-data (string-match (car directory) bufile))
-		    (cdr directory)))))))
-    (cond ((not dir)
-	   nil)
-	  ((file-accessible-directory-p dir)
-	   dir)
-	  (create
-	   (condition-case nil
-	       (progn (make-directory dir t) dir)
-	     (error nil))))))
-
-;; If you are wondering why we only hash if the directory is not ".", rather
-;; than if `file-name-absolute-p', it is because if we just appended ".flc" for
-;; relative cache directories (that are not ".") then it is possible that more
-;; than one file would have the same cache name in that directory, if the luser
-;; made a link from one relative cache directory to another.  (Phew!)
-(defun fast-lock-cache-name (directory)
-  "Return full cache file name using caching DIRECTORY.
-If DIRECTORY is `.', the file name is the buffer file name appended with `.flc'.
-Otherwise, the file name is constructed from DIRECTORY and the buffer's true
-abbreviated file name, with all `/' characters in the name replaced with `#'
-characters, and appended with `.flc'.
-
-If the same file has different cache file names when edited on different
-machines, e.g., on one machine the cache file name has the prefix `#home',
-perhaps due to automount, try putting in your `~/.emacs' something like:
-
- (setq directory-abbrev-alist (cons \\='(\"^/home/\" . \"/\") directory-abbrev-alist))
-
-Emacs automagically removes the common `/tmp_mnt' automount prefix by default.
-
-See `fast-lock-cache-directory'."
-  (if (string-equal directory ".")
-      (concat buffer-file-name ".flc")
-    (let* ((bufile (expand-file-name buffer-file-truename))
-	   (chars-alist
-	    (if (memq system-type '(windows-nt cygwin))
-		'((?/ . (?#)) (?# . (?# ?#)) (?: . (?\;)) (?\; . (?\; ?\;)))
-	      '((?/ . (?#)) (?# . (?# ?#)))))
-	   (mapchars
-	    (function (lambda (c) (or (cdr (assq c chars-alist)) (list c))))))
-      (concat
-       (file-name-as-directory (expand-file-name directory))
-       (mapconcat 'char-to-string (apply 'append (mapcar mapchars bufile)) "")
-       ".flc"))))
-\f
-;; Font Lock Cache Processing Functions:
-
-;; The version 3 format of the cache is:
-;;
-;; (fast-lock-cache-data VERSION TIMESTAMP
-;;  font-lock-syntactic-keywords SYNTACTIC-PROPERTIES
-;;  font-lock-keywords FACE-PROPERTIES)
-
-(defun fast-lock-save-cache-1 (file timestamp)
-  ;; Save the FILE with the TIMESTAMP plus fontification data.
-  ;; Returns non-nil if a save was attempted to a writable cache file.
-  (let ((tpbuf (generate-new-buffer " *fast-lock*"))
-	(verbose (if (numberp fast-lock-verbose)
-		     (> (buffer-size) fast-lock-verbose)
-		   fast-lock-verbose))
-	(saved t))
-    (with-temp-message
-	(when verbose
-	  (format "Saving %s font lock cache..." (buffer-name)))
-      (condition-case nil
-	  (save-excursion
-	    (print (list 'fast-lock-cache-data 3
-			 (list 'quote timestamp)
-			 (list 'quote font-lock-syntactic-keywords)
-			 (list 'quote (fast-lock-get-syntactic-properties))
-			 (list 'quote font-lock-keywords)
-			 (list 'quote (fast-lock-get-face-properties)))
-		   tpbuf)
-	    (set-buffer tpbuf)
-	    (write-region (point-min) (point-max) file nil 'quietly)
-	    (setq fast-lock-cache-timestamp timestamp
-		  fast-lock-cache-filename file))
-	(error (setq saved 'error)) (quit (setq saved 'quit)))
-      (kill-buffer tpbuf))
-    (cond ((eq saved 'quit)
-	   (message "Saving %s font lock cache...quit" (buffer-name)))
-	  ((eq saved 'error)
-	   (message "Saving %s font lock cache...failed" (buffer-name))))
-    ;; We return non-nil regardless of whether a failure occurred.
-    saved))
-
-(defun fast-lock-cache-data (version timestamp
-			     syntactic-keywords syntactic-properties
-			     keywords face-properties
-			     &rest ignored)
-  ;; Find value of syntactic keywords in case it is a symbol.
-  (setq font-lock-syntactic-keywords (font-lock-eval-keywords
-				      font-lock-syntactic-keywords))
-  ;; Compile all keywords in case some are and some aren't.
-  (when font-lock-syntactic-keywords
-    (setq font-lock-syntactic-keywords (font-lock-compile-keywords
-					font-lock-syntactic-keywords t)))
-  (when syntactic-keywords
-    (setq syntactic-keywords (font-lock-compile-keywords syntactic-keywords t)))
-  (setq font-lock-keywords (font-lock-compile-keywords font-lock-keywords)
-	keywords (font-lock-compile-keywords keywords))
-  ;; Use the Font Lock cache SYNTACTIC-PROPERTIES and FACE-PROPERTIES if we're
-  ;; using cache VERSION format 3, the current buffer's file timestamp matches
-  ;; the TIMESTAMP, the current buffer's `font-lock-syntactic-keywords' are the
-  ;; same as SYNTACTIC-KEYWORDS, and the current buffer's `font-lock-keywords'
-  ;; are the same as KEYWORDS.
-  (let ((buf-timestamp (visited-file-modtime))
-	(verbose (if (numberp fast-lock-verbose)
-		     (> (buffer-size) fast-lock-verbose)
-		   fast-lock-verbose))
-	(loaded t))
-    (if (or (/= version 3)
-	    (buffer-modified-p)
-	    (not (equal timestamp buf-timestamp))
-	    (not (equal syntactic-keywords font-lock-syntactic-keywords))
-	    (not (equal keywords font-lock-keywords)))
-	(setq loaded nil)
-      (with-temp-message
-	  (when verbose
-	    (format "Loading %s font lock cache..." (buffer-name)))
-	(condition-case nil
-	    (fast-lock-add-properties syntactic-properties face-properties)
-	  (error (setq loaded 'error)) (quit (setq loaded 'quit))))
-      (cond ((eq loaded 'quit)
-	     (message "Loading %s font lock cache...quit" (buffer-name)))
-	    ((eq loaded 'error)
-	     (message "Loading %s font lock cache...failed" (buffer-name)))))
-    (setq font-lock-fontified (eq loaded t)
-	  fast-lock-cache-timestamp (and (eq loaded t) timestamp))))
-\f
-;; Text Properties Processing Functions:
-
-;; This is fast, but fails if adjacent characters have different `face' text
-;; properties.  Maybe that's why I dropped it in the first place?
-;(defun fast-lock-get-face-properties ()
-;  "Return a list of `face' text properties in the current buffer.
-;Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
-;where VALUE is a `face' property value and STARTx and ENDx are positions."
-;  (save-restriction
-;    (widen)
-;    (let ((start (text-property-not-all (point-min) (point-max) 'face nil))
-;	  (limit (point-max)) end properties value cell)
-;      (while start
-;	(setq end (next-single-property-change start 'face nil limit)
-;	      value (get-text-property start 'face))
-;	;; Make, or add to existing, list of regions with same `face'.
-;	(if (setq cell (assq value properties))
-;	    (setcdr cell (cons start (cons end (cdr cell))))
-;	  (setq properties (cons (list value start end) properties)))
-;	(setq start (next-single-property-change end 'face)))
-;      properties)))
-
-;; This is slow, but copes if adjacent characters have different `face' text
-;; properties, but fails if they are lists.
-;(defun fast-lock-get-face-properties ()
-;  "Return a list of `face' text properties in the current buffer.
-;Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
-;where VALUE is a `face' property value and STARTx and ENDx are positions.
-;Only those `face' VALUEs in `fast-lock-save-faces' are returned."
-;  (save-restriction
-;    (widen)
-;    (let ((faces (or fast-lock-save-faces (face-list))) (limit (point-max))
-;	  properties regions face start end)
-;      (while faces
-;	(setq face (car faces) faces (cdr faces) regions () end (point-min))
-;	;; Make a list of start/end regions with `face' property face.
-;	(while (setq start (text-property-any end limit 'face face))
-;	  (setq end (or (text-property-not-all start limit 'face face) limit)
-;		regions (cons start (cons end regions))))
-;	;; Add `face' face's regions, if any, to properties.
-;	(when regions
-;	  (push (cons face regions) properties)))
-;      properties)))
-
-(defun fast-lock-get-face-properties ()
-  "Return a list of `face' text properties in the current buffer.
-Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
-where VALUE is a `face' property value and STARTx and ENDx are positions."
-  (save-restriction
-    (widen)
-    (let ((start (text-property-not-all (point-min) (point-max) 'face nil))
-	  end properties value cell)
-      (while start
-	(setq end (next-single-property-change start 'face nil (point-max))
-	      value (get-text-property start 'face))
-	;; Make, or add to existing, list of regions with same `face'.
-	(cond ((setq cell (assoc value properties))
-	       (setcdr cell (cons start (cons end (cdr cell)))))
-	      ((fast-lock-save-facep value)
-	       (push (list value start end) properties)))
-	(setq start (text-property-not-all end (point-max) 'face nil)))
-      properties)))
-
-(defun fast-lock-get-syntactic-properties ()
-  "Return a list of `syntax-table' text properties in the current buffer.
-See `fast-lock-get-face-properties'."
-  (save-restriction
-    (widen)
-    (let ((start (text-property-not-all (point-min) (point-max) 'syntax-table
-					nil))
-	  end properties value cell)
-      (while start
-	(setq end (next-single-property-change start 'syntax-table nil
-					       (point-max))
-	      value (get-text-property start 'syntax-table))
-	;; Make, or add to existing, list of regions with same `syntax-table'.
-	(if (setq cell (assoc value properties))
-	    (setcdr cell (cons start (cons end (cdr cell))))
-	  (push (list value start end) properties))
-	(setq start (text-property-not-all end (point-max) 'syntax-table nil)))
-      properties)))
-
-(defun fast-lock-add-properties (syntactic-properties face-properties)
-  "Add `syntax-table' and `face' text properties to the current buffer.
-Any existing `syntax-table' and `face' text properties are removed first.
-See `fast-lock-get-face-properties'."
-  (save-buffer-state (plist regions)
-    (save-restriction
-      (widen)
-      (font-lock-unfontify-region (point-min) (point-max))
-      ;;
-      ;; Set the `syntax-table' property for each start/end region.
-      (while syntactic-properties
-	(setq plist (list 'syntax-table (car (car syntactic-properties)))
-	      regions (cdr (car syntactic-properties))
-	      syntactic-properties (cdr syntactic-properties))
-	(while regions
-	  (add-text-properties (nth 0 regions) (nth 1 regions) plist)
-	  (setq regions (nthcdr 2 regions))))
-      ;;
-      ;; Set the `face' property for each start/end region.
-      (while face-properties
-	(setq plist (list 'face (car (car face-properties)))
-	      regions (cdr (car face-properties))
-	      face-properties (cdr face-properties))
-	(while regions
-	  (add-text-properties (nth 0 regions) (nth 1 regions) plist)
-	  (setq regions (nthcdr 2 regions)))))))
-\f
-;; Functions for XEmacs:
-
-(when (featurep 'xemacs)
-  ;;
-  ;; It would be better to use XEmacs' `map-extents' over extents with a
-  ;; `font-lock' property, but `face' properties are on different extents.
-  (defun fast-lock-get-face-properties ()
-    "Return a list of `face' text properties in the current buffer.
-Each element of the list is of the form (VALUE START1 END1 START2 END2 ...)
-where VALUE is a `face' property value and STARTx and ENDx are positions.
-Only those `face' VALUEs in `fast-lock-save-faces' are returned."
-    (save-restriction
-      (widen)
-      (let ((properties ()) cell)
-	(map-extents
-	 (function (lambda (extent ignore)
-	    (let ((value (extent-face extent)))
-	      ;; We're only interested if it's one of `fast-lock-save-faces'.
-	      (when (and value (fast-lock-save-facep value))
-		(let ((start (extent-start-position extent))
-		      (end (extent-end-position extent)))
-		  ;; Make or add to existing list of regions with the same
-		  ;; `face' property value.
-		  (if (setq cell (assoc value properties))
-		      (setcdr cell (cons start (cons end (cdr cell))))
-		    (push (list value start end) properties))))
-	      ;; Return nil to keep `map-extents' going.
-	      nil))))
-	properties)))
-  ;;
-  ;; XEmacs does not support the `syntax-table' text property.
-  (defalias 'fast-lock-get-syntactic-properties
-    'ignore)
-  ;;
-  ;; Make extents just like XEmacs' font-lock.el does.
-  (defun fast-lock-add-properties (syntactic-properties face-properties)
-    "Set `face' text properties in the current buffer.
-Any existing `face' text properties are removed first.
-See `fast-lock-get-face-properties'."
-    (save-restriction
-      (widen)
-      (font-lock-unfontify-region (point-min) (point-max))
-      ;; Set the `face' property, etc., for each start/end region.
-      (while face-properties
-	(let ((face (car (car face-properties)))
-	      (regions (cdr (car face-properties))))
-	  (while regions
-	    (font-lock-set-face (nth 0 regions) (nth 1 regions) face)
-	    (setq regions (nthcdr 2 regions)))
-	  (setq face-properties (cdr face-properties))))
-      ;; XEmacs does not support the `syntax-table' text property.
-      ))
-  ;;
-  ;; XEmacs 19.12 font-lock.el's `font-lock-fontify-buffer' runs a hook.
-  (add-hook 'font-lock-after-fontify-buffer-hook
-	    'fast-lock-after-fontify-buffer))
-
-(unless (boundp 'font-lock-syntactic-keywords)
-  (defvar font-lock-syntactic-keywords nil))
-
-(unless (boundp 'font-lock-inhibit-thing-lock)
-  (defvar font-lock-inhibit-thing-lock nil))
-
-(unless (fboundp 'font-lock-compile-keywords)
-  (defalias 'font-lock-compile-keywords 'identity))
-
-(unless (fboundp 'font-lock-eval-keywords)
-  (defun font-lock-eval-keywords (keywords)
-    (if (symbolp keywords)
-	(font-lock-eval-keywords (if (fboundp keywords)
-				     (funcall keywords)
-				   (eval keywords)))
-      keywords)))
-
-(unless (fboundp 'font-lock-value-in-major-mode)
-  (defun font-lock-value-in-major-mode (alist)
-    (if (consp alist)
-	(cdr (or (assq major-mode alist) (assq t alist)))
-      alist)))
-
-(unless (fboundp 'current-message)
-  (defun current-message ()
-    ""))
-\f
-;; Install ourselves:
-
-(add-hook 'after-save-hook 'fast-lock-save-cache-after-save-file)
-(add-hook 'kill-buffer-hook 'fast-lock-save-cache-before-kill-buffer)
-(unless noninteractive
-  (add-hook 'kill-emacs-hook 'fast-lock-save-caches-before-kill-emacs))
-
-;;;###autoload
-(when (fboundp 'add-minor-mode)
-  (defvar fast-lock-mode nil)
-  (add-minor-mode 'fast-lock-mode nil))
-;;;###dont-autoload
-(unless (assq 'fast-lock-mode minor-mode-alist)
-  (setq minor-mode-alist (append minor-mode-alist '((fast-lock-mode nil)))))
-
-;; Provide ourselves:
-
-(provide 'fast-lock)
-
-;;; fast-lock.el ends here
-
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; End:
diff --git a/lisp/obsolete/lazy-lock.el b/lisp/obsolete/lazy-lock.el
deleted file mode 100644
index 694188ff23..0000000000
--- a/lisp/obsolete/lazy-lock.el
+++ /dev/null
@@ -1,1053 +0,0 @@
-;;; lazy-lock.el --- lazy demand-driven fontification for fast Font Lock mode
-
-;; Copyright (C) 1994-1998, 2001-2020 Free Software Foundation, Inc.
-
-;; Author: Simon Marshall <simon@gnu.org>
-;; Maintainer: emacs-devel@gnu.org
-;; Keywords: faces files
-;; Version: 2.11
-;; Obsolete-since: 22.1
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; Purpose:
-;;
-;; Lazy Lock mode is a Font Lock support mode.
-;; It makes visiting buffers in Font Lock mode faster by making fontification
-;; be demand-driven, deferred and stealthy, so that fontification only occurs
-;; when, and where, necessary.
-;;
-;; See caveats and feedback below.
-;; See also the fast-lock package.  (But don't use them at the same time!)
-
-;; Installation:
-;;
-;; Put in your ~/.emacs:
-;;
-;; (setq font-lock-support-mode 'lazy-lock-mode)
-;;
-;; Start up a new Emacs and use font-lock as usual (except that you can use the
-;; so-called "gaudier" fontification regexps on big files without frustration).
-;;
-;; In a buffer (which has `font-lock-mode' enabled) which is at least
-;; `lazy-lock-minimum-size' characters long, buffer fontification will not
-;; occur and only the visible portion of the buffer will be fontified.  Motion
-;; around the buffer will fontify those visible portions not previously
-;; fontified.  If stealth fontification is enabled, buffer fontification will
-;; occur in invisible parts of the buffer after `lazy-lock-stealth-time'
-;; seconds of idle time.  If on-the-fly fontification is deferred, on-the-fly
-;; fontification will occur after `lazy-lock-defer-time' seconds of idle time.
-
-;; User-visible differences with version 1:
-;;
-;; - Version 2 can defer on-the-fly fontification.  Therefore you need not, and
-;; should not, use defer-lock.el with this version of lazy-lock.el.
-;;
-;; A number of variables have changed meaning:
-;;
-;; - A value of nil for the variable `lazy-lock-minimum-size' means never turn
-;; on demand-driven fontification.  In version 1 this meant always turn on
-;; demand-driven fontification.  If you really want demand-driven fontification
-;; regardless of buffer size, set this variable to 0.
-;;
-;; - The variable `lazy-lock-stealth-lines' cannot have a nil value.  In
-;; version 1 this meant use `window-height' as the maximum number of lines to
-;; fontify as a stealth chunk.  This makes no sense; stealth fontification is
-;; of a buffer, not a window.
-
-;; Implementation differences with version 1:
-;;
-;; - Version 1 of lazy-lock.el is a bit of a hack.  Version 1 demand-driven
-;; fontification, the core feature of lazy-lock.el, is implemented by placing a
-;; function on `post-command-hook'.  This function fontifies where necessary,
-;; i.e., where a window scroll has occurred.  However, there are a number of
-;; problems with using `post-command-hook':
-;;
-;; (a) As the name suggests, `post-command-hook' is run after every command,
-;;     i.e., frequently and regardless of whether scrolling has occurred.
-;; (b) Scrolling can occur during a command, when `post-command-hook' is not
-;;     run, i.e., it is not necessarily run after scrolling has occurred.
-;; (c) When `post-command-hook' is run, there is nothing to suggest where
-;;     scrolling might have occurred, i.e., which windows have scrolled.
-;;
-;; Thus lazy-lock.el's function is called almost as often as possible, usually
-;; when it need not be called, yet it is not always called when it is needed.
-;; Also, lazy-lock.el's function must check each window to see if a scroll has
-;; occurred there.  Worse still, lazy-lock.el's function must fontify a region
-;; twice as large as necessary to make sure the window is completely fontified.
-;; Basically, `post-command-hook' is completely inappropriate for lazy-lock.el.
-;;
-;; Ideally, we want to attach lazy-lock.el's function to a hook that is run
-;; only when scrolling occurs, e.g., `window-start' has changed, and tells us
-;; as much information as we need, i.e., the window and its new buffer region.
-;; Richard Stallman implemented a `window-scroll-functions' for Emacs 19.30.
-;; Functions on it are run when `window-start' has changed, and are supplied
-;; with the window and the window's new `window-start' position.  (It would be
-;; better if it also supplied the window's new `window-end' position, but that
-;; is calculated as part of the redisplay process, and the functions on
-;; `window-scroll-functions' are run before redisplay has finished.)  Thus, the
-;; hook deals with the above problems (a), (b) and (c).
-;;
-;; If only life was that easy.  Version 2 demand-driven fontification is mostly
-;; implemented by placing a function on `window-scroll-functions'.  However,
-;; not all scrolling occurs when `window-start' has changed.  A change in
-;; window size, e.g., via C-x 1, or a significant deletion, e.g., of a number
-;; of lines, causes text previously invisible (i.e., after `window-end') to
-;; become visible without changing `window-start'.  Arguably, these events are
-;; not scrolling events, but fontification must occur for lazy-lock.el to work.
-;; Hooks `window-size-change-functions' and `redisplay-end-trigger-functions'
-;; were added for these circumstances.
-;;
-;; (Ben Wing thinks these hooks are "horribly horribly kludgy", and implemented
-;; a `pre-idle-hook', a `mother-of-all-post-command-hooks', for XEmacs 19.14.
-;; He then hacked up a version 1 lazy-lock.el to use `pre-idle-hook' rather
-;; than `post-command-hook'.  Whereas functions on `post-command-hook' are
-;; called almost as often as possible, functions on `pre-idle-hook' really are
-;; called as often as possible, even when the mouse moves and, on some systems,
-;; while XEmacs is idle.  Thus, the hook deals with the above problem (b), but
-;; unfortunately it makes (a) worse and does not address (c) at all.
-;;
-;; I freely admit that `redisplay-end-trigger-functions' and, to a much lesser
-;; extent, `window-size-change-functions' are not pretty.  However, I feel that
-;; a `window-scroll-functions' feature is cleaner than a `pre-idle-hook', and
-;; the result is faster and smaller, less intrusive and more targeted, code.
-;; Since `pre-idle-hook' is pretty much like `post-command-hook', there is no
-;; point in making this version of lazy-lock.el work with it.  Anyway, that's
-;; Lit 30 of my humble opinion.
-;;
-;; - Version 1 stealth fontification is also implemented by placing a function
-;; on `post-command-hook'.  This function waits for a given amount of time,
-;; and, if Emacs remains idle, fontifies where necessary.  Again, there are a
-;; number of problems with using `post-command-hook':
-;;
-;; (a) Functions on `post-command-hook' are run sequentially, so this function
-;;     can interfere with other functions on the hook, and vice versa.
-;; (b) This function waits for a given amount of time, so it can interfere with
-;;     various features that are dealt with by Emacs after a command, e.g.,
-;;     region highlighting, asynchronous updating and keystroke echoing.
-;; (c) Fontification may be required during a command, when `post-command-hook'
-;;     is not run.  (Version 2 deferred fontification only.)
-;;
-;; Again, `post-command-hook' is completely inappropriate for lazy-lock.el.
-;; Richard Stallman and Morten Welinder implemented internal Timers and Idle
-;; Timers for Emacs 19.31.  Functions can be run independently at given times
-;; or after given amounts of idle time.  Thus, the feature deals with the above
-;; problems (a), (b) and (c).  Version 2 deferral and stealth are implemented
-;; by functions on Idle Timers.  (A function on XEmacs' `pre-idle-hook' is
-;; similar to an Emacs Idle Timer function with a fixed zero second timeout.)
-
-;; - Version 1 has the following problems (relative to version 2):
-;;
-;; (a) It is slow when it does its job.
-;; (b) It does not always do its job when it should.
-;; (c) It slows all interaction (when it doesn't need to do its job).
-;; (d) It interferes with other package functions on `post-command-hook'.
-;; (e) It interferes with Emacs things within the read-eval loop.
-;;
-;; Ben's hacked-up lazy-lock.el 1.14 almost solved (b) but made (c) worse.
-;;
-;; - Version 2 has the following additional features (relative to version 1):
-;;
-;; (a) It can defer fontification (both on-the-fly and on-scrolling).
-;; (b) It can fontify contextually (syntactically true on-the-fly).
-
-;; Caveats:
-;;
-;; Lazy Lock mode does not work efficiently with Outline mode.
-;; This is because when in Outline mode, although text may be not visible to
-;; you in the window, the text is visible to Emacs Lisp code (not surprisingly)
-;; and Lazy Lock fontifies it mercilessly.  Maybe it will be fixed one day.
-;;
-;; Because buffer text is not necessarily fontified, other packages that expect
-;; buffer text to be fontified in Font Lock mode either might not work as
-;; expected, or might not display buffer text as expected.  An example of the
-;; latter is `occur', which copies lines of buffer text into another buffer.
-;;
-;; In Emacs 19.30, Lazy Lock mode does not ensure that an existing buffer is
-;; fontified if it is made visible via a minibuffer-less command that replaces
-;; an existing window's buffer (e.g., via the Buffers menu).  Upgrade!
-;;
-;; In Emacs 19.30, Lazy Lock mode does not work well with Transient Mark mode
-;; or modes based on Comint mode (e.g., Shell mode), and also interferes with
-;; the echoing of keystrokes in the minibuffer.  This is because of the way
-;; deferral and stealth have to be implemented for Emacs 19.30.  Upgrade!
-;;
-;; Currently XEmacs does not have the features to support this version of
-;; lazy-lock.el.  Maybe it will one day.
-\f
-;; History:
-;;
-;; 1.15--2.00:
-;; - Rewrite for Emacs 19.30 and the features rms added to support lazy-lock.el
-;;   so that it could work correctly and efficiently.
-;; - Many thanks to those who reported bugs, fixed bugs, made suggestions or
-;;   otherwise contributed in the version 1 cycle; Jari Aalto, Kevin Broadey,
-;;   Ulrik Dickow, Bill Dubuque, Bob Glickstein, Boris Goldowsky,
-;;   Jonas Jarnestrom, David Karr, Michael Kifer, Erik Naggum, Rick Sladkey,
-;;   Jim Thompson, Ben Wing, Ilya Zakharevich, and Richard Stallman.
-;; 2.00--2.01:
-;; - Made `lazy-lock-fontify-after-command' always `sit-for' and so redisplay
-;; - Use `buffer-name' not `buffer-live-p' (Bill Dubuque hint)
-;; - Made `lazy-lock-install' do `add-to-list' not `setq' of `current-buffer'
-;; - Made `lazy-lock-fontify-after-install' loop over buffer list
-;; - Made `lazy-lock-arrange-before-change' to arrange `window-end' triggering
-;; - Made `lazy-lock-let-buffer-state' wrap both `befter-change-functions'
-;; - Made `lazy-lock-fontify-region' do `condition-case' (Hyman Rosen report)
-;; 2.01--2.02:
-;; - Use `buffer-live-p' as `buffer-name' can barf (Richard Stanton report)
-;; - Made `lazy-lock-install' set `font-lock-fontified' (Kevin Davidson report)
-;; - Made `lazy-lock-install' add hooks only if needed
-;; - Made `lazy-lock-unstall' add `font-lock-after-change-function' if needed
-;; 2.02--2.03:
-;; - Made `lazy-lock-fontify-region' do `condition-case' for `quit' too
-;; - Made `lazy-lock-mode' respect the value of `font-lock-inhibit-thing-lock'
-;; - Added `lazy-lock-after-unfontify-buffer'
-;; - Removed `lazy-lock-fontify-after-install' hack
-;; - Made `lazy-lock-fontify-after-scroll' not `set-buffer' to `window-buffer'
-;; - Made `lazy-lock-fontify-after-trigger' not `set-buffer' to `window-buffer'
-;; - Made `lazy-lock-fontify-after-idle' be interruptible (Scott Burson hint)
-;; 2.03--2.04:
-;; - Rewrite for Emacs 19.31 idle timers
-;; - Renamed `buffer-windows' to `get-buffer-window-list'
-;; - Removed `buffer-live-p'
-;; - Made `lazy-lock-defer-after-change' always save `current-buffer'
-;; - Made `lazy-lock-fontify-after-defer' just process buffers
-;; - Made `lazy-lock-install-hooks' add hooks correctly (Kevin Broadey report)
-;; - Made `lazy-lock-install' cope if `lazy-lock-defer-time' is a list
-;; 2.04--2.05:
-;; - Rewrite for Common Lisp macros
-;; - Added `do-while' macro
-;; - Renamed `lazy-lock-let-buffer-state' macro to `save-buffer-state'
-;; - Returned `lazy-lock-fontify-after-install' hack (Darren Hall hint)
-;; - Added `lazy-lock-defer-on-scrolling' functionality (Scott Byer hint)
-;; - Made `lazy-lock-mode' wrap `font-lock-support-mode'
-;; 2.05--2.06:
-;; - Made `lazy-lock-fontify-after-defer' swap correctly (Scott Byer report)
-;; 2.06--2.07:
-;; - Added `lazy-lock-stealth-load' functionality (Rob Hooft hint)
-;; - Made `lazy-lock-unstall' call `lazy-lock-fontify-region' if needed
-;; - Made `lazy-lock-mode' call `lazy-lock-unstall' only if needed
-;; - Made `lazy-lock-defer-after-scroll' do `set-window-redisplay-end-trigger'
-;; - Added `lazy-lock-defer-contextually' functionality
-;; - Added `lazy-lock-defer-on-the-fly' from `lazy-lock-defer-time'
-;; - Renamed `lazy-lock-defer-driven' to `lazy-lock-defer-on-scrolling'
-;; - Removed `lazy-lock-submit-bug-report' and bade farewell
-;; 2.07--2.08:
-;; - Made `lazy-lock-fontify-conservatively' fontify around `window-point'
-;; - Made `save-buffer-state' wrap `inhibit-point-motion-hooks'
-;; - Added Custom support
-;; 2.08--2.09:
-;; - Removed `byte-*' variables from `eval-when-compile' (Erik Naggum hint)
-;; - Made various wrapping `inhibit-point-motion-hooks' (Vinicius Latorre hint)
-;; - Made `lazy-lock-fontify-after-idle' wrap `minibuffer-auto-raise'
-;; - Made `lazy-lock-fontify-after-defer' paranoid about deferred buffers
-;; 2.09--2.10:
-;; - Use `window-end' UPDATE arg for Emacs 20.4 and later.
-;; - Made deferral `widen' before unfontifying (Dan Nicolaescu report)
-;; - Use `lazy-lock-fontify-after-visage' for hideshow.el (Dan Nicolaescu hint)
-;; - Use `other' widget where possible (Andreas Schwab fix)
-;; 2.10--2.11:
-;; - Used `with-temp-message' where possible to make messages temporary.
-\f
-;;; Code:
-
-(require 'font-lock)
-(eval-when-compile (require 'cl-lib))
-
-(eval-when-compile
- ;; We use this to preserve or protect things when modifying text properties.
- (defmacro save-buffer-state (varlist &rest body)
-   "Bind variables according to VARLIST and eval BODY restoring buffer state."
-   `(let* (,@(append varlist
-		   '((modified (buffer-modified-p))
-		     (buffer-undo-list t)
-		     (inhibit-read-only t)
-		     (inhibit-point-motion-hooks t)
-		     (inhibit-modification-hooks t)
-		     deactivate-mark
-		     buffer-file-name
-		     buffer-file-truename)))
-     ,@body
-     (when (and (not modified) (buffer-modified-p))
-       (restore-buffer-modified-p nil))))
- (put 'save-buffer-state 'lisp-indent-function 1)
- ;;
- ;; We use this for clarity and speed.  Naughty but nice.
- (defmacro do-while (test &rest body)
-   "(do-while TEST BODY...): eval BODY... and repeat if TEST yields non-nil.
-The order of execution is thus BODY, TEST, BODY, TEST and so on
-until TEST returns nil."
-   `(while (progn ,@body ,test)))
- (put 'do-while 'lisp-indent-function (get 'while 'lisp-indent-function)))
-
-(defgroup lazy-lock nil
-  "Font Lock support mode to fontify lazily."
-  :group 'font-lock)
-
-(defvar lazy-lock-mode nil)			; Whether we are turned on.
-(defvar lazy-lock-buffers nil)			; For deferral.
-(defvar lazy-lock-timers (cons nil nil))	; For deferral and stealth.
-\f
-;; User Variables:
-
-(defcustom lazy-lock-minimum-size 25600
-  "Minimum size of a buffer for demand-driven fontification.
-On-demand fontification occurs if the buffer size is greater than this value.
-If nil, means demand-driven fontification is never performed.
-If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
-where MAJOR-MODE is a symbol or t (meaning the default).  For example:
- ((c-mode . 25600) (c++-mode . 25600) (rmail-mode . 1048576))
-means that the minimum size is 25K for buffers in C or C++ modes, one megabyte
-for buffers in Rmail mode, and size is irrelevant otherwise.
-
-The value of this variable is used when Lazy Lock mode is turned on."
-  :type '(choice (const :tag "none" nil)
-		 (integer :tag "size")
-		 (repeat :menu-tag "mode specific" :tag "mode specific"
-			 :value ((t . nil))
-			 (cons :tag "Instance"
-			       (radio :tag "Mode"
-				      (const :tag "all" t)
-				      (symbol :tag "name"))
-			       (radio :tag "Size"
-				      (const :tag "none" nil)
-				      (integer :tag "size")))))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-defer-on-the-fly t
-  "If non-nil, means fontification after a change should be deferred.
-If nil, means on-the-fly fontification is performed.  This means when changes
-occur in the buffer, those areas are immediately fontified.
-If a list, it should be a list of `major-mode' symbol names for which deferred
-fontification should occur.  The sense of the list is negated if it begins with
-`not'.  For example:
- (c-mode c++-mode)
-means that on-the-fly fontification is deferred for buffers in C and C++ modes
-only, and deferral does not occur otherwise.
-
-The value of this variable is used when Lazy Lock mode is turned on."
-  :type '(choice (const :tag "never" nil)
-		 (const :tag "always" t)
-		 (set :menu-tag "mode specific" :tag "modes"
-		      :value (not)
-		      (const :tag "Except" not)
-		      (repeat :inline t (symbol :tag "mode"))))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-defer-on-scrolling nil
-  "If non-nil, means fontification after a scroll should be deferred.
-If nil, means demand-driven fontification is performed.  This means when
-scrolling into unfontified areas of the buffer, those areas are immediately
-fontified.  Thus scrolling never presents unfontified areas.  However, since
-fontification occurs during scrolling, scrolling may be slow.
-If t, means defer-driven fontification is performed.  This means fontification
-of those areas is deferred.  Thus scrolling may present momentarily unfontified
-areas.  However, since fontification does not occur during scrolling, scrolling
-will be faster than demand-driven fontification.
-If any other value, e.g., `eventually', means demand-driven fontification is
-performed until the buffer is fontified, then buffer fontification becomes
-defer-driven.  Thus scrolling never presents unfontified areas until the buffer
-is first fontified, after which subsequent scrolling may present future buffer
-insertions momentarily unfontified.  However, since fontification does not
-occur during scrolling after the buffer is first fontified, scrolling will
-become faster.  (But, since contextual changes continually occur, such a value
-makes little sense if `lazy-lock-defer-contextually' is non-nil.)
-
-The value of this variable is used when Lazy Lock mode is turned on."
-  :type '(choice (const :tag "never" nil)
-		 (const :tag "always" t)
-		 (other :tag "eventually" eventually))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-defer-contextually 'syntax-driven
-  "If non-nil, means deferred fontification should be syntactically true.
-If nil, means deferred fontification occurs only on those lines modified.  This
-means where modification on a line causes syntactic change on subsequent lines,
-those subsequent lines are not refontified to reflect their new context.
-If t, means deferred fontification occurs on those lines modified and all
-subsequent lines.  This means those subsequent lines are refontified to reflect
-their new syntactic context, either immediately or when scrolling into them.
-If any other value, e.g., `syntax-driven', means deferred syntactically true
-fontification occurs only if syntactic fontification is performed using the
-buffer mode's syntax table, i.e., only if `font-lock-keywords-only' is nil.
-
-The value of this variable is used when Lazy Lock mode is turned on."
-  :type '(choice (const :tag "never" nil)
-		 (const :tag "always" t)
-		 (other :tag "syntax-driven" syntax-driven))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-defer-time 0.25
-  "Time in seconds to delay before beginning deferred fontification.
-Deferred fontification occurs if there is no input within this time.
-If nil, means fontification is never deferred, regardless of the values of the
-variables `lazy-lock-defer-on-the-fly', `lazy-lock-defer-on-scrolling' and
-`lazy-lock-defer-contextually'.
-
-The value of this variable is used when Lazy Lock mode is turned on."
-  :type '(choice (const :tag "never" nil)
-		 (number :tag "seconds"))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-stealth-time 30
-  "Time in seconds to delay before beginning stealth fontification.
-Stealth fontification occurs if there is no input within this time.
-If nil, means stealth fontification is never performed.
-
-The value of this variable is used when Lazy Lock mode is turned on."
-  :type '(choice (const :tag "never" nil)
-		 (number :tag "seconds"))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-stealth-lines (if font-lock-maximum-decoration 100 250)
-  "Maximum size of a chunk of stealth fontification.
-Each iteration of stealth fontification can fontify this number of lines.
-To speed up input response during stealth fontification, at the cost of stealth
-taking longer to fontify, you could reduce the value of this variable."
-  :type '(integer :tag "lines")
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-stealth-load
-  (if (condition-case nil (load-average) (error)) 200)
-  "Load in percentage above which stealth fontification is suspended.
-Stealth fontification pauses when the system short-term load average (as
-returned by the function `load-average' if supported) goes above this level,
-thus reducing the demand that stealth fontification makes on the system.
-If nil, means stealth fontification is never suspended.
-To reduce machine load during stealth fontification, at the cost of stealth
-taking longer to fontify, you could reduce the value of this variable.
-See also `lazy-lock-stealth-nice'."
-  :type (if (condition-case nil (load-average) (error))
-	    '(choice (const :tag "never" nil)
-		     (integer :tag "load"))
-	  '(const :format "%t: unsupported\n" nil))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-stealth-nice 0.125
-  "Time in seconds to pause between chunks of stealth fontification.
-Each iteration of stealth fontification is separated by this amount of time,
-thus reducing the demand that stealth fontification makes on the system.
-If nil, means stealth fontification is never paused.
-To reduce machine load during stealth fontification, at the cost of stealth
-taking longer to fontify, you could increase the value of this variable.
-See also `lazy-lock-stealth-load'."
-  :type '(choice (const :tag "never" nil)
-		 (number :tag "seconds"))
-  :group 'lazy-lock)
-
-(defcustom lazy-lock-stealth-verbose
-  (and (not lazy-lock-defer-contextually) (not (null font-lock-verbose)))
-  "If non-nil, means stealth fontification should show status messages."
-  :type 'boolean
-  :group 'lazy-lock)
-\f
-;; User Functions:
-
-;;;###autoload
-(defun lazy-lock-mode (&optional arg)
-  "Toggle Lazy Lock mode.
-With arg, turn Lazy Lock mode on if and only if arg is positive.  Enable it
-automatically in your `~/.emacs' by:
-
- (setq font-lock-support-mode \\='lazy-lock-mode)
-
-For a newer font-lock support mode with similar functionality, see
-`jit-lock-mode'.  Eventually, Lazy Lock mode will be deprecated in
-JIT Lock's favor.
-
-When Lazy Lock mode is enabled, fontification can be lazy in a number of ways:
-
-- Demand-driven buffer fontification if `lazy-lock-minimum-size' is non-nil.
-  This means initial fontification does not occur if the buffer is greater than
-  `lazy-lock-minimum-size' characters in length.  Instead, fontification occurs
-  when necessary, such as when scrolling through the buffer would otherwise
-  reveal unfontified areas.  This is useful if buffer fontification is too slow
-  for large buffers.
-
-- Deferred scroll fontification if `lazy-lock-defer-on-scrolling' is non-nil.
-  This means demand-driven fontification does not occur as you scroll.
-  Instead, fontification is deferred until after `lazy-lock-defer-time' seconds
-  of Emacs idle time, while Emacs remains idle.  This is useful if
-  fontification is too slow to keep up with scrolling.
-
-- Deferred on-the-fly fontification if `lazy-lock-defer-on-the-fly' is non-nil.
-  This means on-the-fly fontification does not occur as you type.  Instead,
-  fontification is deferred until after `lazy-lock-defer-time' seconds of Emacs
-  idle time, while Emacs remains idle.  This is useful if fontification is too
-  slow to keep up with your typing.
-
-- Deferred context fontification if `lazy-lock-defer-contextually' is non-nil.
-  This means fontification updates the buffer corresponding to true syntactic
-  context, after `lazy-lock-defer-time' seconds of Emacs idle time, while Emacs
-  remains idle.  Otherwise, fontification occurs on modified lines only, and
-  subsequent lines can remain fontified corresponding to previous syntactic
-  contexts.  This is useful where strings or comments span lines.
-
-- Stealthy buffer fontification if `lazy-lock-stealth-time' is non-nil.
-  This means remaining unfontified areas of buffers are fontified if Emacs has
-  been idle for `lazy-lock-stealth-time' seconds, while Emacs remains idle.
-  This is useful if any buffer has any deferred fontification.
-
-Basic Font Lock mode on-the-fly fontification behavior fontifies modified
-lines only.  Thus, if `lazy-lock-defer-contextually' is non-nil, Lazy Lock mode
-on-the-fly fontification may fontify differently, albeit correctly.  In any
-event, to refontify some lines you can use \\[font-lock-fontify-block].
-
-Stealth fontification only occurs while the system remains unloaded.
-If the system load rises above `lazy-lock-stealth-load' percent, stealth
-fontification is suspended.  Stealth fontification intensity is controlled via
-the variable `lazy-lock-stealth-nice' and `lazy-lock-stealth-lines', and
-verbosity is controlled via the variable `lazy-lock-stealth-verbose'."
-  (interactive "P")
-  (let* ((was-on lazy-lock-mode)
-	 (now-on (unless (memq 'lazy-lock-mode font-lock-inhibit-thing-lock)
-		   (if arg (> (prefix-numeric-value arg) 0) (not was-on)))))
-    (cond ((and now-on (not font-lock-mode))
-	   ;; Turned on `lazy-lock-mode' rather than `font-lock-mode'.
-           (message "Use font-lock-support-mode rather than calling lazy-lock-mode")
-           (sit-for 2))
-	  (now-on
-	   ;; Turn ourselves on.
-	   (set (make-local-variable 'lazy-lock-mode) t)
-	   (lazy-lock-install))
-	  (was-on
-	   ;; Turn ourselves off.
-	   (set (make-local-variable 'lazy-lock-mode) nil)
-	   (lazy-lock-unstall)))))
-
-;;;###autoload
-(defun turn-on-lazy-lock ()
-  "Unconditionally turn on Lazy Lock mode."
-  (lazy-lock-mode t))
-
-(defun lazy-lock-install ()
-  (let ((min-size (font-lock-value-in-major-mode lazy-lock-minimum-size))
-	(defer-change (and lazy-lock-defer-time lazy-lock-defer-on-the-fly))
-	(defer-scroll (and lazy-lock-defer-time lazy-lock-defer-on-scrolling))
-	(defer-context (and lazy-lock-defer-time lazy-lock-defer-contextually
-			    (or (eq lazy-lock-defer-contextually t)
-				(null font-lock-keywords-only)))))
-    ;;
-    ;; Tell Font Lock whether Lazy Lock will do fontification.
-    (make-local-variable 'font-lock-fontified)
-    (setq font-lock-fontified (and min-size (>= (buffer-size) min-size)))
-    ;;
-    ;; Add the text properties and fontify.
-    (if (not font-lock-fontified)
-	(lazy-lock-after-fontify-buffer)
-      ;; Make sure we fontify in any existing windows showing the buffer.
-      (let ((windows (get-buffer-window-list (current-buffer) 'nomini t)))
-	(lazy-lock-after-unfontify-buffer)
-	(while windows
-	  (lazy-lock-fontify-conservatively (car windows))
-	  (setq windows (cdr windows)))))
-    ;;
-    ;; Add the fontification hooks.
-    (lazy-lock-install-hooks
-     font-lock-fontified
-     (cond ((eq (car-safe defer-change) 'not)
-	    (not (memq major-mode (cdr defer-change))))
-	   ((listp defer-change)
-	    (memq major-mode defer-change))
-	   (t
-	    defer-change))
-     (eq defer-scroll t)
-     defer-context)
-    ;;
-    ;; Add the fontification timers.
-    (lazy-lock-install-timers
-     (if (or defer-change defer-scroll defer-context) lazy-lock-defer-time)
-     lazy-lock-stealth-time)))
-
-(defun lazy-lock-install-hooks (fontifying
-				defer-change defer-scroll defer-context)
-  ;;
-  ;; Add hook if lazy-lock.el is fontifying on scrolling or is deferring.
-  (when (or fontifying defer-change defer-scroll defer-context)
-    (add-hook 'window-scroll-functions (if defer-scroll
-					   'lazy-lock-defer-after-scroll
-					 'lazy-lock-fontify-after-scroll)
-	      nil t))
-  ;;
-  ;; Add hook if lazy-lock.el is fontifying and is not deferring changes.
-  (when (and fontifying (not defer-change) (not defer-context))
-    (add-hook 'before-change-functions 'lazy-lock-arrange-before-change nil t))
-  ;;
-  ;; Replace Font Lock mode hook.
-  (remove-hook 'after-change-functions 'font-lock-after-change-function t)
-  (add-hook 'after-change-functions
-	    (cond ((and defer-change defer-context)
-		   'lazy-lock-defer-rest-after-change)
-		  (defer-change
-		   'lazy-lock-defer-line-after-change)
-		  (defer-context
-		   'lazy-lock-fontify-rest-after-change)
-		  (t
-		   'lazy-lock-fontify-line-after-change))
-	    nil t)
-  ;;
-  ;; Add package-specific hook.
-  (add-hook 'outline-view-change-hook 'lazy-lock-fontify-after-visage nil t)
-  (add-hook 'hs-hide-hook 'lazy-lock-fontify-after-visage nil t))
-
-(defun lazy-lock-install-timers (dtime stime)
-  ;; Schedule or re-schedule the deferral and stealth timers.
-  ;; The layout of `lazy-lock-timers' is:
-  ;;  ((DEFER-TIME . DEFER-TIMER) (STEALTH-TIME . STEALTH-TIMER)
-  ;; If an idle timeout has changed, cancel the existing idle timer (if there
-  ;; is one) and schedule a new one (if the new idle timeout is non-nil).
-  (unless (eq dtime (car (car lazy-lock-timers)))
-    (let ((defer (car lazy-lock-timers)))
-      (when (cdr defer)
-	(cancel-timer (cdr defer)))
-      (setcar lazy-lock-timers (cons dtime (and dtime
-	      (run-with-idle-timer dtime t 'lazy-lock-fontify-after-defer))))))
-  (unless (eq stime (car (cdr lazy-lock-timers)))
-    (let ((stealth (cdr lazy-lock-timers)))
-      (when (cdr stealth)
-	(cancel-timer (cdr stealth)))
-      (setcdr lazy-lock-timers (cons stime (and stime
-	      (run-with-idle-timer stime t 'lazy-lock-fontify-after-idle)))))))
-
-(defun lazy-lock-unstall ()
-  ;;
-  ;; If Font Lock mode is still enabled, make sure that the buffer is
-  ;; fontified, and reinstall its hook.  We must do this first.
-  (when font-lock-mode
-    (when (lazy-lock-unfontified-p)
-      (let ((verbose (if (numberp font-lock-verbose)
-			 (> (buffer-size) font-lock-verbose)
-		       font-lock-verbose)))
-	(with-temp-message
-	    (when verbose
-	      (format "Fontifying %s..." (buffer-name)))
-	  ;; Make sure we fontify etc. in the whole buffer.
-	  (save-restriction
-	    (widen)
-	    (lazy-lock-fontify-region (point-min) (point-max))))))
-    (add-hook 'after-change-functions 'font-lock-after-change-function nil t))
-  ;;
-  ;; Remove the text properties.
-  (lazy-lock-after-unfontify-buffer)
-  ;;
-  ;; Remove the fontification hooks.
-  (remove-hook 'window-scroll-functions 'lazy-lock-fontify-after-scroll t)
-  (remove-hook 'window-scroll-functions 'lazy-lock-defer-after-scroll t)
-  (remove-hook 'before-change-functions 'lazy-lock-arrange-before-change t)
-  (remove-hook 'after-change-functions 'lazy-lock-fontify-line-after-change t)
-  (remove-hook 'after-change-functions 'lazy-lock-fontify-rest-after-change t)
-  (remove-hook 'after-change-functions 'lazy-lock-defer-line-after-change t)
-  (remove-hook 'after-change-functions 'lazy-lock-defer-rest-after-change t)
-  (remove-hook 'outline-view-change-hook 'lazy-lock-fontify-after-visage t)
-  (remove-hook 'hs-hide-hook 'lazy-lock-fontify-after-visage t))
-\f
-;; Hook functions.
-
-;; Lazy Lock mode intervenes when (1) a previously invisible buffer region
-;; becomes visible, i.e., for demand- or defer-driven on-the-scroll
-;; fontification, (2) a buffer modification occurs, i.e., for defer-driven
-;; on-the-fly fontification, (3) Emacs becomes idle, i.e., for fontification of
-;; deferred fontification and stealth fontification, and (4) other special
-;; occasions.
-
-;; 1.  There are three ways whereby this can happen.
-;;
-;; (a) Scrolling the window, either explicitly (e.g., `scroll-up') or
-;;     implicitly (e.g., `search-forward').  Here, `window-start' changes.
-;;     Fontification occurs by adding `lazy-lock-fontify-after-scroll' (for
-;;     demand-driven fontification) or `lazy-lock-defer-after-scroll' (for
-;;     defer-driven fontification) to the hook `window-scroll-functions'.
-
-(defun lazy-lock-fontify-after-scroll (window window-start)
-  ;; Called from `window-scroll-functions'.
-  ;; Fontify WINDOW from WINDOW-START following the scroll.
-  (let ((inhibit-point-motion-hooks t))
-    (lazy-lock-fontify-region window-start (window-end window t)))
-  ;; A prior deletion that did not cause scrolling, followed by a scroll, would
-  ;; result in an unnecessary trigger after this if we did not cancel it now.
-  (set-window-redisplay-end-trigger window nil))
-
-(defun lazy-lock-defer-after-scroll (window window-start)
-  ;; Called from `window-scroll-functions'.
-  ;; Defer fontification following the scroll.  Save the current buffer so that
-  ;; we subsequently fontify in all windows showing the buffer.
-  (unless (memq (current-buffer) lazy-lock-buffers)
-    (push (current-buffer) lazy-lock-buffers))
-  ;; A prior deletion that did not cause scrolling, followed by a scroll, would
-  ;; result in an unnecessary trigger after this if we did not cancel it now.
-  (set-window-redisplay-end-trigger window nil))
-
-;; (b) Resizing the window, either explicitly (e.g., `enlarge-window') or
-;;     implicitly (e.g., `delete-other-windows').  Here, `window-end' changes.
-;;     Fontification occurs by adding `lazy-lock-fontify-after-resize' to the
-;;     hook `window-size-change-functions'.
-
-(defun lazy-lock-fontify-after-resize (frame)
-  ;; Called from `window-size-change-functions'.
-  ;; Fontify windows in FRAME following the resize.  We cannot use
-  ;; `window-start' or `window-end' so we fontify conservatively.
-  (save-excursion
-    (save-selected-window
-      (select-frame frame)
-      (walk-windows (function (lambda (window)
-		       (set-buffer (window-buffer window))
-		       (when lazy-lock-mode
-			 (lazy-lock-fontify-conservatively window))
-		       (set-window-redisplay-end-trigger window nil)))
-		    'nomini frame))))
-
-;; (c) Deletion in the buffer.  Here, a `window-end' marker can become visible.
-;;     Fontification occurs by adding `lazy-lock-arrange-before-change' to
-;;     `before-change-functions' and `lazy-lock-fontify-after-trigger' to the
-;;     hook `redisplay-end-trigger-functions'.  Before every deletion, the
-;;     marker `window-redisplay-end-trigger' position is set to the soon-to-be
-;;     changed `window-end' position.  If the marker becomes visible,
-;;     `lazy-lock-fontify-after-trigger' gets called.  Ouch.  Note that we only
-;;     have to deal with this eventuality if there is no on-the-fly deferral.
-
-(defun lazy-lock-arrange-before-change (beg end)
-  ;; Called from `before-change-functions'.
-  ;; Arrange that if text becomes visible it will be fontified (if a deletion
-  ;; is pending, text might become visible at the bottom).
-  (unless (eq beg end)
-    (let ((windows (get-buffer-window-list (current-buffer) 'nomini t)) window)
-      (while windows
-	(setq window (car windows))
-	(unless (markerp (window-redisplay-end-trigger window))
-	  (set-window-redisplay-end-trigger window (make-marker)))
-	(set-marker (window-redisplay-end-trigger window) (window-end window))
-	(setq windows (cdr windows))))))
-
-(defun lazy-lock-fontify-after-trigger (window trigger-point)
-  ;; Called from `redisplay-end-trigger-functions'.
-  ;; Fontify WINDOW from TRIGGER-POINT following the redisplay.
-  ;; We could probably just use `lazy-lock-fontify-after-scroll' without loss:
-  ;;  (inline (lazy-lock-fontify-after-scroll window (window-start window)))
-  (let ((inhibit-point-motion-hooks t))
-    (lazy-lock-fontify-region trigger-point (window-end window t))))
-
-;; 2.  Modified text must be marked as unfontified so it can be identified and
-;;     fontified later when Emacs is idle.  Deferral occurs by adding one of
-;;     `lazy-lock-fontify-*-after-change' (for on-the-fly fontification) or
-;;     `lazy-lock-defer-*-after-change' (for deferred fontification) to the
-;;     hook `after-change-functions'.
-
-(defalias 'lazy-lock-fontify-line-after-change
-  ;; Called from `after-change-functions'.
-  ;; Fontify the current change.
-  'font-lock-after-change-function)
-
-(defun lazy-lock-fontify-rest-after-change (beg end old-len)
-  ;; Called from `after-change-functions'.
-  ;; Fontify the current change and defer fontification of the rest of the
-  ;; buffer.  Save the current buffer so that we subsequently fontify in all
-  ;; windows showing the buffer.
-  (lazy-lock-fontify-line-after-change beg end old-len)
-  (save-buffer-state nil
-    (unless (memq (current-buffer) lazy-lock-buffers)
-      (push (current-buffer) lazy-lock-buffers))
-    (save-restriction
-      (widen)
-      (remove-text-properties end (point-max) '(lazy-lock nil)))))
-
-(defun lazy-lock-defer-line-after-change (beg end old-len)
-  ;; Called from `after-change-functions'.
-  ;; Defer fontification of the current change.  Save the current buffer so
-  ;; that we subsequently fontify in all windows showing the buffer.
-  (save-buffer-state nil
-    (unless (memq (current-buffer) lazy-lock-buffers)
-      (push (current-buffer) lazy-lock-buffers))
-    (remove-text-properties (max (1- beg) (point-min))
-			    (min (1+ end) (point-max))
-			    '(lazy-lock nil))))
-
-(defun lazy-lock-defer-rest-after-change (beg end old-len)
-  ;; Called from `after-change-functions'.
-  ;; Defer fontification of the rest of the buffer.  Save the current buffer so
-  ;; that we subsequently fontify in all windows showing the buffer.
-  (save-buffer-state nil
-    (unless (memq (current-buffer) lazy-lock-buffers)
-      (push (current-buffer) lazy-lock-buffers))
-    (save-restriction
-      (widen)
-      (remove-text-properties (max (1- beg) (point-min))
-			      (point-max)
-			      '(lazy-lock nil)))))
-
-;; 3.  Deferred fontification and stealth fontification are done from these two
-;;     functions.  They are set up as Idle Timers.
-
-(defun lazy-lock-fontify-after-defer ()
-  ;; Called from `timer-idle-list'.
-  ;; Fontify all windows where deferral has occurred for its buffer.
-  (save-excursion
-    (while (and lazy-lock-buffers (not (input-pending-p)))
-      (let ((buffer (car lazy-lock-buffers)) windows)
-	;; Paranoia: check that the buffer is still live and Lazy Lock mode on.
-	(when (buffer-live-p buffer)
-	  (set-buffer buffer)
-	  (when lazy-lock-mode
-	    (setq windows (get-buffer-window-list buffer 'nomini t))
-	    (while windows
-	      (lazy-lock-fontify-window (car windows))
-	      (setq windows (cdr windows)))))
-	(setq lazy-lock-buffers (cdr lazy-lock-buffers)))))
-  ;; Add hook if fontification should now be defer-driven in this buffer.
-  (when (and lazy-lock-mode lazy-lock-defer-on-scrolling
-	     (memq 'lazy-lock-fontify-after-scroll window-scroll-functions)
-	     (not (or (input-pending-p) (lazy-lock-unfontified-p))))
-    (remove-hook 'window-scroll-functions 'lazy-lock-fontify-after-scroll t)
-    (add-hook 'window-scroll-functions 'lazy-lock-defer-after-scroll nil t)))
-
-(defun lazy-lock-fontify-after-idle ()
-  ;; Called from `timer-idle-list'.
-  ;; Fontify all buffers that need it, stealthily while idle.
-  (unless (or executing-kbd-macro (window-minibuffer-p (selected-window)))
-    ;; Loop over all buffers, fontify stealthily for each if necessary.
-    (let ((buffers (buffer-list)) (continue t)
-	  message message-log-max minibuffer-auto-raise)
-      (save-excursion
-	(do-while (and buffers continue)
-	  (set-buffer (car buffers))
-	  (if (not (and lazy-lock-mode (lazy-lock-unfontified-p)))
-	      (setq continue (not (input-pending-p)))
-	    ;; Fontify regions in this buffer while there is no input.
-	    (with-temp-message
-		(when lazy-lock-stealth-verbose
-		  "Fontifying stealthily...")
-	      (do-while (and (lazy-lock-unfontified-p) continue)
-		(if (and lazy-lock-stealth-load
-			 (> (car (load-average)) lazy-lock-stealth-load))
-		    ;; Wait a while before continuing with the loop.
-		    (progn
-		      (when message
-			(message "Fontifying stealthily...suspended")
-			(setq message nil))
-		      (setq continue (sit-for (or lazy-lock-stealth-time 30))))
-		  ;; Fontify a chunk.
-		  (when lazy-lock-stealth-verbose
-		    (if message
-			(message "Fontifying stealthily... %2d%% of %s"
-				 (lazy-lock-percent-fontified) (buffer-name))
-		      (message "Fontifying stealthily...")
-		      (setq message t)))
-		  ;; Current buffer may have changed during `sit-for'.
-		  (set-buffer (car buffers))
-		  (lazy-lock-fontify-chunk)
-		  (setq continue (sit-for (or lazy-lock-stealth-nice 0)))))))
-	  (setq buffers (cdr buffers)))))))
-
-;; 4.  Special circumstances.
-
-(defun lazy-lock-fontify-after-visage ()
-  ;; Called from `outline-view-change-hook' and `hs-hide-hook'.
-  ;; Fontify windows showing the current buffer, as its visibility has changed.
-  ;; This is a conspiracy hack between lazy-lock.el, outline.el and
-  ;; hideshow.el.
-  (let ((windows (get-buffer-window-list (current-buffer) 'nomini t)))
-    (while windows
-      (lazy-lock-fontify-conservatively (car windows))
-      (setq windows (cdr windows)))))
-
-(defun lazy-lock-after-fontify-buffer ()
-  ;; Called from `font-lock-after-fontify-buffer'.
-  ;; Mark the current buffer as fontified.
-  ;; This is a conspiracy hack between lazy-lock.el and font-lock.el.
-  (save-buffer-state nil
-    (add-text-properties (point-min) (point-max) '(lazy-lock t))))
-
-(defun lazy-lock-after-unfontify-buffer ()
-  ;; Called from `font-lock-after-unfontify-buffer'.
-  ;; Mark the current buffer as unfontified.
-  ;; This is a conspiracy hack between lazy-lock.el and font-lock.el.
-  (save-buffer-state nil
-    (remove-text-properties (point-min) (point-max) '(lazy-lock nil))))
-\f
-;; Fontification functions.
-
-;; If packages want to ensure that some region of the buffer is fontified, they
-;; should use this function.  For an example, see ps-print.el.
-(defun lazy-lock-fontify-region (beg end)
-  ;; Fontify between BEG and END, where necessary, in the current buffer.
-  (save-restriction
-    (widen)
-    (when (setq beg (text-property-any beg end 'lazy-lock nil))
-      (save-excursion
-	(save-match-data
-	  (save-buffer-state
-	   (next)
-	   ;; Find successive unfontified regions between BEG and END.
-	   (condition-case data
-	       (do-while beg
-			 (setq next (or (text-property-any beg end 'lazy-lock t) end))
-	  ;; Make sure the region end points are at beginning of line.
-			 (goto-char beg)
-			 (unless (bolp)
-			   (beginning-of-line)
-			   (setq beg (point)))
-			 (goto-char next)
-			 (unless (bolp)
-			   (forward-line)
-			   (setq next (point)))
-		     ;; Fontify the region, then flag it as fontified.
-			 (font-lock-fontify-region beg next)
-			 (add-text-properties beg next '(lazy-lock t))
-			 (setq beg (text-property-any next end 'lazy-lock nil)))
-	     ((error quit) (message "Fontifying region...%s" data)))))))))
-
-(defun lazy-lock-fontify-chunk ()
-  ;; Fontify the nearest chunk, for stealth, in the current buffer.
-  (let ((inhibit-point-motion-hooks t))
-    (save-excursion
-      (save-restriction
-	(widen)
-	;; Move to end of line in case the character at point is not fontified.
-	(end-of-line)
-	;; Find where the previous (next) unfontified regions end (begin).
-	(let ((prev (previous-single-property-change (point) 'lazy-lock))
-	      (next (text-property-any (point) (point-max) 'lazy-lock nil)))
-	  ;; Fontify from the nearest unfontified position.
-	  (if (or (null prev) (and next (< (- next (point)) (- (point) prev))))
-	      ;; The next, or neither, region is the nearest not fontified.
-	      (lazy-lock-fontify-region
-	       (progn (goto-char (or next (point-min)))
-		      (beginning-of-line)
-		      (point))
-	       (progn (goto-char (or next (point-min)))
-		      (forward-line lazy-lock-stealth-lines)
-		      (point)))
-	    ;; The previous region is the nearest not fontified.
-	    (lazy-lock-fontify-region
-	     (progn (goto-char prev)
-		    (forward-line (- lazy-lock-stealth-lines))
-		    (point))
-	     (progn (goto-char prev)
-		    (forward-line)
-		    (point)))))))))
-
-(defun lazy-lock-fontify-window (window)
-  ;; Fontify in WINDOW between `window-start' and `window-end'.
-  ;; We can only do this when we can use `window-start' and `window-end'.
-  (with-current-buffer (window-buffer window)
-    (lazy-lock-fontify-region (window-start window) (window-end window))))
-
-(defun lazy-lock-fontify-conservatively (window)
-  ;; Fontify in WINDOW conservatively around point.
-  ;; Where we cannot use `window-start' and `window-end' we do `window-height'
-  ;; lines around point.  That way we guarantee to have done enough.
-  (with-current-buffer (window-buffer window)
-    (let ((inhibit-point-motion-hooks t))
-      (lazy-lock-fontify-region
-       (save-excursion
-	 (goto-char (window-point window))
-	 (vertical-motion (- (window-height window)) window) (point))
-       (save-excursion
-	 (goto-char (window-point window))
-	 (vertical-motion (window-height window) window) (point))))))
-
-(defun lazy-lock-unfontified-p ()
-  ;; Return non-nil if there is anywhere still to be fontified.
-  (save-restriction
-    (widen)
-    (text-property-any (point-min) (point-max) 'lazy-lock nil)))
-
-(defun lazy-lock-percent-fontified ()
-  ;; Return the percentage (of characters) of the buffer that are fontified.
-  (save-restriction
-    (widen)
-    (let ((beg (point-min)) (size 0) next)
-      ;; Find where the next fontified region begins.
-      (while (setq beg (text-property-any beg (point-max) 'lazy-lock t))
-	(setq next (or (text-property-any beg (point-max) 'lazy-lock nil)
-		       (point-max)))
-	(cl-incf size (- next beg))
-	(setq beg next))
-      ;; Float because using integer multiplication will frequently overflow.
-      (truncate (* (/ (float size) (point-max)) 100)))))
-\f
-;; Version dependent workarounds and fixes.
-
-(when (consp lazy-lock-defer-time)
-  ;;
-  ;; In 2.06.04 and below, `lazy-lock-defer-time' could specify modes and time.
-  (with-output-to-temp-buffer "*Help*"
-    (princ "The value of the variable `lazy-lock-defer-time' was\n ")
-    (princ lazy-lock-defer-time)
-    (princ "\n")
-    (princ "This variable cannot now be a list of modes and time,\n")
-    (princ "so instead use ")
-    (princ (substitute-command-keys "\\[customize-option]"))
-    (princ " to modify the variables, or put the forms:\n")
-    (princ " (setq lazy-lock-defer-time ")
-    (princ (cdr lazy-lock-defer-time))
-    (princ ")\n")
-    (princ " (setq lazy-lock-defer-on-the-fly '")
-    (princ (car lazy-lock-defer-time))
-    (princ ")\n")
-    (princ "in your ~/.emacs.  ")
-    (princ "The above forms have been evaluated for this editor session,\n")
-    (princ "but you should use ")
-    (princ (substitute-command-keys "\\[customize-option]"))
-    (princ " or change your ~/.emacs now."))
-  (setq lazy-lock-defer-on-the-fly (car lazy-lock-defer-time)
-	lazy-lock-defer-time (cdr lazy-lock-defer-time)))
-
-(when (boundp 'lazy-lock-defer-driven)
-  ;;
-  ;; In 2.06.04 and below, `lazy-lock-defer-driven' was the variable name.
-  (with-output-to-temp-buffer "*Help*"
-    (princ "The value of the variable `lazy-lock-defer-driven' is set to ")
-    (if (memq lazy-lock-defer-driven '(nil t))
-	(princ lazy-lock-defer-driven)
-      (princ "`")
-      (princ lazy-lock-defer-driven)
-      (princ "'"))
-    (princ ".\n")
-    (princ "This variable is now called `lazy-lock-defer-on-scrolling',\n")
-    (princ "so instead use ")
-    (princ (substitute-command-keys "\\[customize-option]"))
-    (princ " to modify the variable, or put the form:\n")
-    (princ " (setq lazy-lock-defer-on-scrolling ")
-    (unless (memq lazy-lock-defer-driven '(nil t))
-      (princ "'"))
-    (princ lazy-lock-defer-driven)
-    (princ ")\n")
-    (princ "in your ~/.emacs.  ")
-    (princ "The above form has been evaluated for this editor session,\n")
-    (princ "but you should use ")
-    (princ (substitute-command-keys "\\[customize-option]"))
-    (princ " or change your ~/.emacs now."))
-  (setq lazy-lock-defer-on-scrolling lazy-lock-defer-driven))
-\f
-;; Install ourselves:
-
-(add-hook 'window-size-change-functions 'lazy-lock-fontify-after-resize)
-(add-hook 'redisplay-end-trigger-functions 'lazy-lock-fontify-after-trigger)
-
-(unless (assq 'lazy-lock-mode minor-mode-alist)
-  (setq minor-mode-alist (append minor-mode-alist '((lazy-lock-mode nil)))))
-
-;; Provide ourselves:
-
-(provide 'lazy-lock)
-
-;; Local Variables:
-;; byte-compile-warnings: (not obsolete)
-;; End:
-
-;;; lazy-lock.el ends here
diff --git a/lisp/progmodes/antlr-mode.el b/lisp/progmodes/antlr-mode.el
index bf56a7ee49..7864485895 100644
--- a/lisp/progmodes/antlr-mode.el
+++ b/lisp/progmodes/antlr-mode.el
@@ -75,9 +75,6 @@
 ;;   (add-hook 'speedbar-load-hook  ; would be too late in antlr-mode.el
 ;;	       (lambda () (speedbar-add-supported-extension ".g")))
 
-;; I strongly recommend to use font-lock with a support mode like fast-lock,
-;; lazy-lock or better jit-lock (Emacs-21.1+) / lazy-shot (XEmacs).
-
 ;; To customize, use menu item "Antlr" -> "Customize Antlr".
 
 ;;; Code:
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 386cc2f16f..15f303c756 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -1430,7 +1430,7 @@ c-font-lock-declarations
 	     ))
 
 	;; Below we fontify a whole declaration even when it crosses the limit,
-	;; to avoid gaps when jit/lazy-lock fontifies the file a block at a
+	;; to avoid gaps when jit-lock fontifies the file a block at a
 	;; time.  That is however annoying during editing, e.g. the following is
 	;; a common situation while the first line is being written:
 	;;
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 6122caf518..648fbf43c3 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -49,8 +49,6 @@
 ;; `cperl-praise', `cperl-speed'.				   <<<<<<
 
 ;; The mode information (on C-h m) provides some customization help.
-;; If you use font-lock feature of this mode, it is advisable to use
-;; either lazy-lock-mode or fast-lock-mode.  I prefer lazy-lock.
 
 ;; Faces used now: three faces for first-class and second-class keywords
 ;; and control flow words, one for each: comments, string, labels,
diff --git a/lisp/ps-print.el b/lisp/ps-print.el
index ace3001781..367495f5bd 100644
--- a/lisp/ps-print.el
+++ b/lisp/ps-print.el
@@ -6331,14 +6331,11 @@ ps-screen-to-bit-face
 
 
 (declare-function jit-lock-fontify-now "jit-lock" (&optional start end))
-(declare-function lazy-lock-fontify-region "lazy-lock" (beg end))
 
 ;; to avoid compilation gripes
 (defun ps-print-ensure-fontified (start end)
   (cond ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode))
-	 (jit-lock-fontify-now start end))
-	((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode))
-	 (lazy-lock-fontify-region start end))))
+	 (jit-lock-fontify-now start end))))
 
 
 (defun ps-generate-postscript-with-faces (from to)
diff --git a/src/buffer.c b/src/buffer.c
index 241f2d43a9..e4eb6d6741 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1398,13 +1398,13 @@ DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
 {
   Frestore_buffer_modified_p (flag);
 
-  /* Set update_mode_lines only if buffer is displayed in some window.
-     Packages like jit-lock or lazy-lock preserve a buffer's modified
-     state by recording/restoring the state around blocks of code.
-     Setting update_mode_lines makes redisplay consider all windows
-     (on all frames).  Stealth fontification of buffers not displayed
-     would incur additional redisplay costs if we'd set
-     update_modes_lines unconditionally.
+  /* Set update_mode_lines only if buffer is displayed in some
+     window. Packages like jit-lock preserve a buffer's modified state
+     by recording/restoring the state around blocks of code. Setting
+     update_mode_lines makes redisplay consider all windows (on all
+     frames).  Stealth fontification of buffers not displayed would
+     incur additional redisplay costs if we'd set update_modes_lines
+     unconditionally.
 
      Ideally, I think there should be another mechanism for fontifying
      buffers without "modifying" buffers, or redisplay should be
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-05-16 13:18     ` Delete variables obsolete since Emacs 23 Stefan Kangas
  2020-05-16 15:49       ` Paul Eggert
  2020-05-17  2:52       ` Stefan Monnier
@ 2020-08-08  0:28       ` Stefan Kangas
  2020-08-14 11:11         ` Stefan Kangas
  2020-08-14 15:42         ` Stefan Kangas
  2 siblings, 2 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-08-08  0:28 UTC (permalink / raw)
  To: Stefan Monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1111 bytes --]

Stefan Kangas <stefankangas@gmail.com> writes:

> Other than that, does the attached patch look okay for master?

I have looked this all over again, and I'm attaching a (hopefully) final
patch here. I found some places where the documentation needed updating,
and one or two uses that I had missed previously. There have been
relatively minor changes since last time, but I want to give everyone a
chance to comment before pushing.

If someone wants to take a stab at it, we still have to remove the below
items. I left them alone for now simply because they were a bit tricky
to untangle:

 * lisp/net/newst-backend.el (newsticker-cache-filename)
 * lisp/subr.el (translation-table-for-input)
 * lisp/subr.el (define-key-rebound-commands)
 * lisp/subr.el (redisplay-end-trigger-functions)
 * lisp/subr.el (window-redisplay-end-trigger)
 * lisp/subr.el (set-window-redisplay-end-trigger)

(The last four above should be easier to remove when the fast-lock and
lazy-lock libraries are removed.)

Besides that, the next step here would be to remove variables obsoleted
in 23.{2,3,4}.

Best regards,
Stefan Kangas

[-- Attachment #2: 0001-Remove-many-items-obsolete-since-Emacs-23.1.patch --]
[-- Type: text/x-diff, Size: 54202 bytes --]

From e8ac1ab0495684bec64c5a18226d9f61299523b2 Mon Sep 17 00:00:00 2001
From: Stefan Kangas <stefankangas@gmail.com>
Date: Sat, 16 May 2020 14:16:24 +0200
Subject: [PATCH] Remove many items obsolete since Emacs 23.1

Emacs 23.1 was five major releases and over a decade ago.
This list can be reviewed before to the next release, but for now
hopefully this motivates any needed external updates.
Ref: https://lists.gnu.org/archive/html/emacs-devel/2020-05/msg02198.html

* lisp/abbrev.el (pre-abbrev-expand-hook):
* lisp/bookmark.el (bookmark-read-annotation-text-func)
(bookmark-jump-noselect):
* lisp/buff-menu.el (buffer-menu-mode-hook):
* lisp/cus-edit.el (custom-mode-hook, custom-mode):
* lisp/dirtrack.el (dirtrack-debug-toggle, dirtrack-debug):
* lisp/emacs-lisp/crm.el (crm-minibuffer-complete)
(crm-minibuffer-completion-help)
(crm-minibuffer-complete-and-exit):
* lisp/emacs-lisp/easymenu.el
(easy-menu-precalculate-equivalent-keybindings):
* lisp/emacs-lisp/lisp-mode.el (lisp-mode-auto-fill):
* lisp/epa.el (epa-display-verify-result):
* lisp/epg.el (epg-passphrase-callback-function):
* lisp/eshell/eshell.el (eshell-report-bug):
* lisp/ffap.el (ffap-bug, ffap-submit-bug):
* lisp/files.el (locate-file-completion):
* lisp/hi-lock.el (hi-lock-face-history, hi-lock-regexp-history):
* lisp/hilit-chg.el (highlight-changes-initial-state)
(highlight-changes-active-string)
(highlight-changes-passive-string, global-highlight-changes):
* lisp/international/mule-cmds.el (nonascii-insert-offset)
(nonascii-translation-table):
* lisp/international/mule-diag.el (non-iso-charset-alist):
* lisp/international/mule-util.el (detect-coding-with-priority):
* lisp/international/mule.el (charset-id, charset-bytes)
(charset-list, char-valid-p, generic-char-p)
(char-coding-system-table, make-coding-system)
(set-coding-priority)
* lisp/mail/rmail.el (rmail-message-filter):
* lisp/minibuffer.el (complete-in-turn, dynamic-completion-table)
(completion-common-substring)
(minibuffer-local-must-match-filename-map):
* lisp/mouse.el (mouse-major-mode-menu, mouse-popup-menubar)
(mouse-popup-menubar-stuff):
* lisp/net/newst-treeview.el (newsticker-groups-filename):
* lisp/obsolete/tpu-edt.el (tpu-have-ispell, GOLD-map):
* lisp/password-cache.el (password-read-and-add):
* lisp/shell.el (shell-dirtrack-toggle):
* lisp/subr.el (forward-point, redisplay-end-trigger-functions)
(process-filter-multibyte-p, set-process-filter-multibyte):
* lisp/t-mouse.el (t-mouse-mode):
* lisp/term/w32-win.el (w32-focus-frame, w32-select-font):
* lisp/textmodes/ispell.el (ispell-aspell-supports-utf8):
* lisp/textmodes/remember.el (remember-buffer):
* lisp/tooltip.el (tooltip-hook):
* lisp/url/url-util.el (url-generate-unique-filename):
* lisp/url/url-vars.el (url-temporary-directory):
* lisp/vc/vc-hooks.el (vc-workfile-version)
(vc-default-working-revision):
* lisp/vc/vc-mtn.el (vc-mtn-command):
* lisp/vc/vc.el (vc-revert-buffer):
* lisp/vcursor.el (vcursor-toggle-vcursor-map):
Remove items, obsolete since Emacs 23.1.
* lisp/abbrev.el (expand-abbrev):
* lisp/epg.el (epg-context): Change
'epg-passphrase-callback-function' call to 'epa-' alternative.
* lisp/eshell/em-rebind.el (eshell-cannot-leave-input-list): Don't
refer to removed function 'forward-point'.
* test/manual/etags/c-src/abbrev.c (Fexpand_abbrev):
(syms_of_abbrev): Don't run removed hook 'pre-abbrev-expand-hook'.
* lisp/international/mule.el (transform-make-coding-system-args):
Declare obsolete.
* lisp/progmodes/idlwave.el:
Update reference to removed function 'char-valid-p'.
* lisp/gnus/mml2015.el (epg-encrypt-string):
* lisp/gnus/mml1991.el (epg-make-context):
* lisp/gnus/mml-smime.el (autoload):
Remove autoload of removed 'epg-passphrase-callback-function'.
* lisp/minibuffer.el (completion-extra-properties):
Remove support for `completion-common-substring'.
* lisp/obsolete/tpu-edt.el (tpu-toggle-overwrite-mode)
Remove support for removed `spell' package.
* src/coding.c (syms_of_coding):
* doc/misc/efaq.texi:
* doc/emacs/frames.texi (Menu Mouse Clicks):
* doc/misc/url.texi (Customization): Doc fixes.
; * etc/NEWS: List removed items.
---
 doc/emacs/custom.texi            |   1 +
 doc/emacs/frames.texi            |   8 +-
 doc/misc/efaq.texi               |   2 +-
 doc/misc/url.texi                |   2 -
 etc/NEWS                         |  34 ++++++++
 lisp/abbrev.el                   |  10 ---
 lisp/bookmark.el                 |  13 ---
 lisp/buff-menu.el                |   3 -
 lisp/cus-edit.el                 |   4 -
 lisp/dirtrack.el                 |   3 -
 lisp/emacs-lisp/crm.el           |   6 --
 lisp/emacs-lisp/easymenu.el      |  10 ---
 lisp/emacs-lisp/lisp-mode.el     |   2 -
 lisp/epa.el                      |   4 -
 lisp/epg.el                      |  17 +---
 lisp/eshell/em-rebind.el         |   1 -
 lisp/eshell/eshell.el            |   9 ---
 lisp/ffap.el                     |   6 --
 lisp/files.el                    |   8 --
 lisp/gnus/mml-smime.el           |   1 -
 lisp/gnus/mml1991.el             |   1 -
 lisp/gnus/mml2015.el             |   1 -
 lisp/hi-lock.el                  |   6 --
 lisp/hilit-chg.el                |  16 ----
 lisp/international/mule-cmds.el  |   5 --
 lisp/international/mule-diag.el  |   4 -
 lisp/international/mule-util.el  |   9 ---
 lisp/international/mule.el       | 135 +------------------------------
 lisp/mail/rmail.el               |  19 -----
 lisp/minibuffer.el               |  18 +----
 lisp/mouse.el                    |  28 -------
 lisp/net/newst-treeview.el       |  30 +------
 lisp/obsolete/tpu-edt.el         |  12 +--
 lisp/password-cache.el           |  16 ----
 lisp/progmodes/idlwave.el        |   2 -
 lisp/shell.el                    |   3 -
 lisp/subr.el                     |   7 --
 lisp/t-mouse.el                  |   2 -
 lisp/term/w32-win.el             |   4 -
 lisp/textmodes/ispell.el         |   9 ---
 lisp/textmodes/remember.el       |   3 -
 lisp/tooltip.el                  |   2 -
 lisp/url/url-util.el             |  25 ------
 lisp/url/url-vars.el             |   7 --
 lisp/vc/vc-hooks.el              |   8 --
 lisp/vc/vc-mtn.el                |   1 -
 lisp/vc/vc.el                    |   3 -
 lisp/vcursor.el                  |   3 -
 src/coding.c                     |   3 +-
 test/manual/etags/c-src/abbrev.c |  14 ----
 50 files changed, 50 insertions(+), 490 deletions(-)

diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi
index acd7fb13ae..a512fd14c8 100644
--- a/doc/emacs/custom.texi
+++ b/doc/emacs/custom.texi
@@ -2605,6 +2605,7 @@ Init Examples
 (if (fboundp 'blink-cursor-mode)
     (blink-cursor-mode 0))
 
+@c FIXME: Find better example since `set-coding-priority' is removed.
 (if (boundp 'coding-category-utf-8)
     (set-coding-priority '(coding-category-utf-8)))
 @end example
diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi
index b99d8ab145..b74887612b 100644
--- a/doc/emacs/frames.texi
+++ b/doc/emacs/frames.texi
@@ -366,9 +366,13 @@ Menu Mouse Clicks
 @kbd{mouse-3} by adding the following line to your init file
 (@pxref{Init Rebinding}):
 
-@c FIXME: `mouse-popup-menubar-stuff' is obsolete since 23.1.
 @smallexample
-(global-set-key [mouse-3] 'mouse-popup-menubar-stuff)
+(global-set-key [mouse-3]
+  '(menu-item "Menu Bar" ignore
+    :filter (lambda (_)
+              (if (zerop (or (frame-parameter nil 'menu-bar-lines) 0))
+                  (mouse-menu-bar-map)
+                (mouse-menu-major-mode-map)))))
 @end smallexample
 
 @node Mode Line Mouse
diff --git a/doc/misc/efaq.texi b/doc/misc/efaq.texi
index 82467048a0..62dcc0b753 100644
--- a/doc/misc/efaq.texi
+++ b/doc/misc/efaq.texi
@@ -4192,7 +4192,7 @@ SPC no longer completes file names
 (define-key minibuffer-local-filename-completion-map (kbd "SPC")
   'minibuffer-complete-word)
 
-(define-key minibuffer-local-must-match-filename-map (kbd "SPC")
+(define-key minibuffer-local-filename-must-match-map (kbd "SPC")
   'minibuffer-complete-word)
 @end lisp
 
diff --git a/doc/misc/url.texi b/doc/misc/url.texi
index 8d9b102407..0304ff4b9f 100644
--- a/doc/misc/url.texi
+++ b/doc/misc/url.texi
@@ -1312,8 +1312,6 @@ Customization
 @end defopt
 @defopt url-max-password-attempts
 @end defopt
-@defopt url-temporary-directory
-@end defopt
 @defopt url-show-status
 @end defopt
 @defopt url-confirmation-func
diff --git a/etc/NEWS b/etc/NEWS
index 850b166069..68fffef197 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -771,6 +771,40 @@ have now been removed.
 ** Some libraries obsolete since Emacs 23 have been removed:
 'ledit.el', 'lmenu.el', 'lucid.el and 'old-whitespace.el'.
 
+---
+** Some functions and variables obsolete since Emacs 23 have been removed:
+
+'GOLD-map', 'bookmark-jump-noselect',
+'bookmark-read-annotation-text-func', 'buffer-menu-mode-hook',
+'char-coding-system-table', 'char-valid-p', 'charset-bytes',
+'charset-id', 'charset-list' (function), 'complete-in-turn',
+'completion-common-substring', 'crm-minibuffer-complete',
+'crm-minibuffer-complete-and-exit', 'crm-minibuffer-completion-help',
+'custom-mode', 'custom-mode-hook', 'detect-coding-with-priority',
+'dirtrack-debug' (function), 'dirtrack-debug-toggle',
+'dynamic-completion-table',
+'easy-menu-precalculate-equivalent-keybindings',
+'epa-display-verify-result', 'epg-passphrase-callback-function',
+'eshell-report-bug', 'ffap-bug', 'ffap-submit-bug', 'forward-point',
+'generic-char-p', 'global-highlight-changes', 'hi-lock-face-history',
+'hi-lock-regexp-history', 'highlight-changes-active-string',
+'highlight-changes-initial-state', 'highlight-changes-passive-string',
+'ispell-aspell-supports-utf8', 'lisp-mode-auto-fill',
+'locate-file-completion', 'make-coding-system',
+'minibuffer-local-must-match-filename-map', 'mouse-major-mode-menu',
+'mouse-popup-menubar', 'mouse-popup-menubar-stuff',
+'newsticker-groups-filename', 'non-iso-charset-alist',
+'nonascii-insert-offset', 'nonascii-translation-table',
+'password-read-and-add', 'pre-abbrev-expand-hook',
+'process-filter-multibyte-p', 'remember-buffer' (function),
+'rmail-message-filter', 'set-coding-priority',
+'set-process-filter-multibyte', 'shell-dirtrack-toggle',
+'t-mouse-mode', 'tooltip-hook', 'tpu-have-ispell',
+'url-generate-unique-filename', 'url-temporary-directory',
+'vc-arch-command', 'vc-default-working-revision' (variable),
+'vc-mtn-command', 'vc-revert-buffer', 'vc-workfile-version',
+'vcursor-toggle-vcursor-map', 'w32-focus-frame', 'w32-select-font'.
+
 \f
 * Lisp Changes in Emacs 28.1
 
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index 2d61a96010..468b0d995b 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -517,14 +517,6 @@ last-abbrev-location
 ;;   "Local (mode-specific) abbrev table of current buffer.")
 ;; (make-variable-buffer-local 'local-abbrev-table)
 
-(defcustom pre-abbrev-expand-hook nil
-  "Function or functions to be called before abbrev expansion is done.
-This is the first thing that `expand-abbrev' does, and so this may change
-the current abbrev table before abbrev lookup happens."
-  :type 'hook
-  :group 'abbrev-mode)
-(make-obsolete-variable 'pre-abbrev-expand-hook 'abbrev-expand-function "23.1")
-
 (defun clear-abbrev-table (table)
   "Undefine all abbrevs in abbrev table TABLE, leaving it empty."
   (setq abbrevs-changed t)
@@ -836,12 +828,10 @@ abbrev-expand-function
 (defun expand-abbrev ()
   "Expand the abbrev before point, if there is an abbrev there.
 Effective when explicitly called even when `abbrev-mode' is nil.
-Before doing anything else, runs `pre-abbrev-expand-hook'.
 Calls the value of `abbrev-expand-function' with no argument to do
 the work, and returns whatever it does.  (That return value should
 be the abbrev symbol if expansion occurred, else nil.)"
   (interactive)
-  (run-hooks 'pre-abbrev-expand-hook)
   (funcall abbrev-expand-function))
 
 (defun abbrev--default-expand ()
diff --git a/lisp/bookmark.el b/lisp/bookmark.el
index de7d60f97e..12b8c145fe 100644
--- a/lisp/bookmark.el
+++ b/lisp/bookmark.el
@@ -922,8 +922,6 @@ bookmark-default-annotation-text
 	  "#  Date:    " (current-time-string) "\n"))
 
 
-(define-obsolete-variable-alias 'bookmark-read-annotation-text-func
-  'bookmark-edit-annotation-text-func "23.1")
 (defvar bookmark-edit-annotation-text-func 'bookmark-default-annotation-text
   "Function to return default text to use for a bookmark annotation.
 It takes one argument, the name of the bookmark, as a string.")
@@ -1142,17 +1140,6 @@ bookmark-jump-other-frame
   (let ((pop-up-frames t))
     (bookmark-jump-other-window bookmark)))
 
-(defun bookmark-jump-noselect (bookmark)
-  "Return the location pointed to by BOOKMARK (see `bookmark-jump').
-The return value has the form (BUFFER . POINT).
-
-Note: this function is deprecated and is present for Emacs 22
-compatibility only."
-  (declare (obsolete bookmark-handle-bookmark "23.1"))
-  (save-excursion
-    (bookmark-handle-bookmark bookmark)
-    (cons (current-buffer) (point))))
-
 (defun bookmark-handle-bookmark (bookmark-name-or-record)
   "Call BOOKMARK-NAME-OR-RECORD's handler or `bookmark-default-handler'
 if it has none.  This changes current buffer and point and returns nil,
diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el
index 9fe0dbae38..324646dc3c 100644
--- a/lisp/buff-menu.el
+++ b/lisp/buff-menu.el
@@ -214,9 +214,6 @@ Buffer-menu-mode-map
     map)
   "Local keymap for `Buffer-menu-mode' buffers.")
 
-(define-obsolete-variable-alias 'buffer-menu-mode-hook
-  'Buffer-menu-mode-hook "23.1")
-
 (define-derived-mode Buffer-menu-mode tabulated-list-mode "Buffer Menu"
   "Major mode for Buffer Menu buffers.
 The Buffer Menu is invoked by the commands \\[list-buffers],
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 16695967df..5ec5799f80 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -4868,8 +4868,6 @@ Custom-goto-parent
 	       (parent (downcase (widget-get  button :tag))))
 	  (customize-group parent)))))
 
-(define-obsolete-variable-alias 'custom-mode-hook 'Custom-mode-hook "23.1")
-
 (defcustom Custom-mode-hook nil
   "Hook called when entering Custom mode."
   :type 'hook
@@ -4940,8 +4938,6 @@ Custom-mode
 
 (put 'Custom-mode 'mode-class 'special)
 
-(define-obsolete-function-alias 'custom-mode 'Custom-mode "23.1")
-
 ;;; The End.
 
 (provide 'cus-edit)
diff --git a/lisp/dirtrack.el b/lisp/dirtrack.el
index 3a0bbd2c9c..ad0c18d1b3 100644
--- a/lisp/dirtrack.el
+++ b/lisp/dirtrack.el
@@ -196,9 +196,6 @@ dirtrack-mode
     (remove-hook 'comint-preoutput-filter-functions 'dirtrack t)))
 
 
-(define-obsolete-function-alias 'dirtrack-debug-toggle 'dirtrack-debug-mode
-  "23.1")
-(define-obsolete-variable-alias 'dirtrack-debug 'dirtrack-debug-mode "23.1")
 (define-minor-mode dirtrack-debug-mode
   "Toggle Dirtrack debugging."
   nil nil nil
diff --git a/lisp/emacs-lisp/crm.el b/lisp/emacs-lisp/crm.el
index 65483d0813..89d106ee48 100644
--- a/lisp/emacs-lisp/crm.el
+++ b/lisp/emacs-lisp/crm.el
@@ -270,12 +270,6 @@ completing-read-multiple
     (remove-hook 'choose-completion-string-functions
 		 'crm--choose-completion-string)))
 
-(define-obsolete-function-alias 'crm-minibuffer-complete 'crm-complete "23.1")
-(define-obsolete-function-alias
-  'crm-minibuffer-completion-help 'crm-completion-help "23.1")
-(define-obsolete-function-alias
-  'crm-minibuffer-complete-and-exit 'crm-complete-and-exit "23.1")
-
 ;; testing and debugging
 ;; (defun crm-init-test-environ ()
 ;;   "Set up some variables for testing."
diff --git a/lisp/emacs-lisp/easymenu.el b/lisp/emacs-lisp/easymenu.el
index 6ba8b997f8..73dabef3fa 100644
--- a/lisp/emacs-lisp/easymenu.el
+++ b/lisp/emacs-lisp/easymenu.el
@@ -29,16 +29,6 @@
 
 ;;; Code:
 
-(defvar easy-menu-precalculate-equivalent-keybindings nil
-  "Determine when equivalent key bindings are computed for easy-menu menus.
-It can take some time to calculate the equivalent key bindings that are shown
-in a menu.  If the variable is on, then this calculation gives a (maybe
-noticeable) delay when a mode is first entered.  If the variable is off, then
-this delay will come when a menu is displayed the first time.  If you never use
-menus, turn this variable off, otherwise it is probably better to keep it on.")
-(make-obsolete-variable
- 'easy-menu-precalculate-equivalent-keybindings nil "23.1")
-
 (defsubst easy-menu-intern (s)
   (if (stringp s) (intern s) s))
 
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index 1311d94cb0..d0c28ec5dc 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -785,8 +785,6 @@ lisp-comment-indent
             nil)))
       (comment-indent-default)))
 
-(define-obsolete-function-alias 'lisp-mode-auto-fill 'do-auto-fill "23.1")
-
 (defcustom lisp-indent-offset nil
   "If non-nil, indent second line of expressions that many more columns."
   :group 'lisp
diff --git a/lisp/epa.el b/lisp/epa.el
index 3c7dd8309a..beefc71ddf 100644
--- a/lisp/epa.el
+++ b/lisp/epa.el
@@ -644,10 +644,6 @@ epa-display-error
 	  (goto-char (point-min)))
 	(display-buffer buffer)))))
 
-(defun epa-display-verify-result (verify-result)
-  (declare (obsolete epa-display-info "23.1"))
-  (epa-display-info (epg-verify-result-to-string verify-result)))
-
 (defun epa-passphrase-callback-function (context key-id handback)
   (if (eq key-id 'SYM)
       (read-passwd
diff --git a/lisp/epg.el b/lisp/epg.el
index 5b90bc290a..dd19f73eb1 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -180,6 +180,8 @@ 'epg-error
   (file nil :read-only t)
   (string nil :read-only t))
 
+(declare-function epa-passphrase-callback-function "epa.el")
+
 (cl-defstruct (epg-context
                (:constructor nil)
                (:constructor epg-context--make
@@ -204,7 +206,7 @@ 'epg-error
   cipher-algorithm
   digest-algorithm
   compress-algorithm
-  (passphrase-callback (list #'epg-passphrase-callback-function))
+  (passphrase-callback (list #'epa-passphrase-callback-function))
   progress-callback
   edit-callback
   signers
@@ -1234,19 +1236,6 @@ epg--status-IMPORT_RES
 			     (epg-context-result-for context 'import-status)))
     (epg-context-set-result-for context 'import-status nil)))
 
-(defun epg-passphrase-callback-function (context key-id _handback)
-  (declare (obsolete epa-passphrase-callback-function "23.1"))
-  (if (eq key-id 'SYM)
-      (read-passwd "Passphrase for symmetric encryption: "
-		   (eq (epg-context-operation context) 'encrypt))
-    (read-passwd
-     (if (eq key-id 'PIN)
-	"Passphrase for PIN: "
-       (let ((entry (assoc key-id epg-user-id-alist)))
-	 (if entry
-	     (format "Passphrase for %s %s: " key-id (cdr entry))
-	   (format "Passphrase for %s: " key-id)))))))
-
 (defun epg--list-keys-1 (context name mode)
   (let ((args (append (if (epg-context-home-directory context)
 			  (list "--homedir"
diff --git a/lisp/eshell/em-rebind.el b/lisp/eshell/em-rebind.el
index bf5a4bf1af..7991c63177 100644
--- a/lisp/eshell/em-rebind.el
+++ b/lisp/eshell/em-rebind.el
@@ -114,7 +114,6 @@ eshell-cannot-leave-input-list
     backward-list
     forward-page
     backward-page
-    forward-point
     forward-paragraph
     backward-paragraph
     backward-prefix-chars
diff --git a/lisp/eshell/eshell.el b/lisp/eshell/eshell.el
index 5ffb159b57..6698ca45de 100644
--- a/lisp/eshell/eshell.el
+++ b/lisp/eshell/eshell.el
@@ -384,15 +384,6 @@ eshell-command-result
 	      (set status-var eshell-last-command-status))
 	  (cadr result))))))
 
-;;;_* Reporting bugs
-;;
-;; If you do encounter a bug, on any system, please report
-;; it -- in addition to any particular oddities in your configuration
-;; -- so that the problem may be corrected for the benefit of others.
-
-;;;###autoload
-(define-obsolete-function-alias 'eshell-report-bug 'report-emacs-bug "23.1")
-
 ;;; Code:
 
 (defun eshell-unload-all-modules ()
diff --git a/lisp/ffap.el b/lisp/ffap.el
index ceba9d2622..4a506207d5 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1824,12 +1824,6 @@ ffap-literally
 
 (defalias 'find-file-literally-at-point 'ffap-literally)
 
-\f
-;;; Bug Reporter:
-
-(define-obsolete-function-alias 'ffap-bug 'report-emacs-bug "23.1")
-(define-obsolete-function-alias 'ffap-submit-bug 'report-emacs-bug "23.1")
-
 \f
 ;;; Hooks for Gnus, VM, Rmail:
 ;;
diff --git a/lisp/files.el b/lisp/files.el
index 1909669346..dd48c151e3 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -979,14 +979,6 @@ locate-file-completion-table
       (completion-table-with-context
        string-dir names string-file pred action)))))
 
-(defun locate-file-completion (string path-and-suffixes action)
-  "Do completion for file names passed to `locate-file'.
-PATH-AND-SUFFIXES is a pair of lists, (DIRECTORIES . SUFFIXES)."
-  (declare (obsolete locate-file-completion-table "23.1"))
-  (locate-file-completion-table (car path-and-suffixes)
-                                (cdr path-and-suffixes)
-                                string nil action))
-
 (defvar locate-dominating-stop-dir-regexp
   (purecopy "\\`\\(?:[\\/][\\/][^\\/]+[\\/]\\|/\\(?:net\\|afs\\|\\.\\.\\.\\)/\\)\\'")
   "Regexp of directory names that stop the search in `locate-dominating-file'.
diff --git a/lisp/gnus/mml-smime.el b/lisp/gnus/mml-smime.el
index 4754f37a2d..acddb30033 100644
--- a/lisp/gnus/mml-smime.el
+++ b/lisp/gnus/mml-smime.el
@@ -329,7 +329,6 @@ password-cache-expiry
   (autoload 'epg-verify-string "epg")
   (autoload 'epg-sign-string "epg")
   (autoload 'epg-encrypt-string "epg")
-  (autoload 'epg-passphrase-callback-function "epg")
   (autoload 'epg-context-set-passphrase-callback "epg")
   (autoload 'epg-sub-key-fingerprint "epg")
   (autoload 'epg-configuration "epg-config")
diff --git a/lisp/gnus/mml1991.el b/lisp/gnus/mml1991.el
index 8be1b84e52..88864ea357 100644
--- a/lisp/gnus/mml1991.el
+++ b/lisp/gnus/mml1991.el
@@ -242,7 +242,6 @@ mml1991-pgg-encrypt
 (defvar epg-user-id-alist)
 
 (autoload 'epg-make-context "epg")
-(autoload 'epg-passphrase-callback-function "epg")
 (autoload 'epa-select-keys "epa")
 (autoload 'epg-list-keys "epg")
 (autoload 'epg-context-set-armor "epg")
diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el
index d1d150ad2e..45c9bbfe90 100644
--- a/lisp/gnus/mml2015.el
+++ b/lisp/gnus/mml2015.el
@@ -712,7 +712,6 @@ inhibit-redisplay
 (autoload 'epg-verify-string "epg")
 (autoload 'epg-sign-string "epg")
 (autoload 'epg-encrypt-string "epg")
-(autoload 'epg-passphrase-callback-function "epg")
 (autoload 'epg-context-set-passphrase-callback "epg")
 (autoload 'epg-key-sub-key-list "epg")
 (autoload 'epg-sub-key-capability "epg")
diff --git a/lisp/hi-lock.el b/lisp/hi-lock.el
index 33ca40f8de..0ffe77d276 100644
--- a/lisp/hi-lock.el
+++ b/lisp/hi-lock.el
@@ -237,17 +237,11 @@ hi-lock-interactive-lighters
   "Human-readable lighters for `hi-lock-interactive-patterns'.")
 (put 'hi-lock-interactive-lighters 'permanent-local t)
 
-(define-obsolete-variable-alias 'hi-lock-face-history
-                                'hi-lock-face-defaults "23.1")
 (defvar hi-lock-face-defaults
   '("hi-yellow" "hi-pink" "hi-green" "hi-blue" "hi-salmon" "hi-aquamarine"
     "hi-black-b" "hi-blue-b" "hi-red-b" "hi-green-b" "hi-black-hb")
   "Default faces for hi-lock interactive functions.")
 
-(define-obsolete-variable-alias 'hi-lock-regexp-history
-                                'regexp-history
-                                "23.1")
-
 (defvar hi-lock-file-patterns-prefix "Hi-lock"
   "String used to identify hi-lock patterns at the start of files.")
 
diff --git a/lisp/hilit-chg.el b/lisp/hilit-chg.el
index 04a5ccd8d5..ae97bb008a 100644
--- a/lisp/hilit-chg.el
+++ b/lisp/hilit-chg.el
@@ -224,9 +224,6 @@ highlight-changes-colors
 ;; When you invoke highlight-changes-mode, should highlight-changes-visible-mode
 ;; be on or off?
 
-(define-obsolete-variable-alias 'highlight-changes-initial-state
-  'highlight-changes-visibility-initial-state "23.1")
-
 (defcustom highlight-changes-visibility-initial-state t
   "Controls whether changes are initially visible in Highlight Changes mode.
 
@@ -236,13 +233,7 @@ highlight-changes-visibility-initial-state
   :type 'boolean
   :group 'highlight-changes)
 
-;; highlight-changes-global-initial-state has been removed
-
-
-
 ;; These are the strings displayed in the mode-line for the minor mode:
-(define-obsolete-variable-alias 'highlight-changes-active-string
-  'highlight-changes-visible-string "23.1")
 
 (defcustom highlight-changes-visible-string " +Chg"
   "The string used when in Highlight Changes mode and changes are visible.
@@ -252,9 +243,6 @@ highlight-changes-visible-string
 		 (const :tag "None"  nil))
   :group 'highlight-changes)
 
-(define-obsolete-variable-alias 'highlight-changes-passive-string
-  'highlight-changes-invisible-string "23.1")
-
 (defcustom highlight-changes-invisible-string " -Chg"
   "The string used when in Highlight Changes mode and changes are hidden.
 This should be set to nil if no indication is desired, or to
@@ -957,10 +945,6 @@ hilit-chg-get-diff-list-hk
 (define-globalized-minor-mode global-highlight-changes-mode
   highlight-changes-mode highlight-changes-mode-turn-on)
 
-(define-obsolete-function-alias
- 'global-highlight-changes
-  'global-highlight-changes-mode "23.1")
-
 (defun highlight-changes-mode-turn-on ()
   "See if Highlight Changes mode should be turned on for this buffer.
 This is called when `global-highlight-changes-mode' is turned on."
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 7714a778fc..5fe931dd9b 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -2968,11 +2968,6 @@ unify-8859-on-decoding-mode
 ;; Doc said "obsolete" in 23.1, this statement only added in 24.1.
 (make-obsolete 'unify-8859-on-decoding-mode "don't use it." "23.1")
 
-(defvar nonascii-insert-offset 0)
-(make-obsolete-variable 'nonascii-insert-offset "do not use it." "23.1")
-(defvar nonascii-translation-table nil)
-(make-obsolete-variable 'nonascii-translation-table "do not use it." "23.1")
-
 (defvar ucs-names nil
   "Hash table of cached CHAR-NAME keys to CHAR-CODE values.")
 
diff --git a/lisp/international/mule-diag.el b/lisp/international/mule-diag.el
index 80e78ef787..b13bde58ca 100644
--- a/lisp/international/mule-diag.el
+++ b/lisp/international/mule-diag.el
@@ -200,10 +200,6 @@ list-character-sets-2
 ;;;		   (charset-iso-graphic-plane charset)
 		   (charset-description charset)))))
 
-(defvar non-iso-charset-alist nil
-  "Obsolete.")
-(make-obsolete-variable 'non-iso-charset-alist "no longer relevant." "23.1")
-
 ;; A variable to hold charset input history.
 (defvar charset-history nil)
 
diff --git a/lisp/international/mule-util.el b/lisp/international/mule-util.el
index 5cc10b1315..660ac58e02 100644
--- a/lisp/international/mule-util.el
+++ b/lisp/international/mule-util.el
@@ -274,15 +274,6 @@ with-coding-priority
 ;;;###autoload(put 'with-coding-priority 'lisp-indent-function 1)
 (put 'with-coding-priority 'edebug-form-spec t)
 
-;;;###autoload
-(defmacro detect-coding-with-priority (from to priority-list)
-  "Detect a coding system of the text between FROM and TO with PRIORITY-LIST.
-PRIORITY-LIST is an alist of coding categories vs the corresponding
-coding systems ordered by priority."
-  (declare (obsolete with-coding-priority "23.1"))
-  `(with-coding-priority (mapcar #'cdr ,priority-list)
-     (detect-coding-region ,from ,to)))
-
 ;;;###autoload
 (defun detect-coding-with-language-environment (from to lang-env)
   "Detect a coding system for the text between FROM and TO with LANG-ENV.
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index df71205d51..092abc09b0 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -408,16 +408,6 @@ charset-info
 ;; because that makes a bootstrapping problem
 ;; if you need to recompile all the Lisp files using interpreted code.
 
-(defun charset-id (_charset)
-  "Always return 0.  This is provided for backward compatibility."
-  (declare (obsolete nil "23.1"))
-  0)
-
-(defmacro charset-bytes (_charset)
-  "Always return 0.  This is provided for backward compatibility."
-  (declare (obsolete nil "23.1"))
-  0)
-
 (defun get-charset-property (charset propname)
   "Return the value of CHARSET's PROPNAME property.
 This is the last value stored with
@@ -463,19 +453,8 @@ charset-long-name
   "Return long name of CHARSET."
   (plist-get (charset-plist charset) :long-name))
 
-(defun charset-list ()
-  "Return list of all charsets ever defined."
-  (declare (obsolete charset-list "23.1"))
-  charset-list)
-
 \f
 ;;; CHARACTER
-(define-obsolete-function-alias 'char-valid-p 'characterp "23.1")
-
-(defun generic-char-p (_char)
-  "Always return nil.  This is provided for backward compatibility."
-  (declare (obsolete nil "23.1"))
-  nil)
 
 (defun make-char-internal (charset-id &optional code1 code2)
   (let ((charset (aref emacs-mule-charset-table charset-id)))
@@ -1085,14 +1064,11 @@ coding-system-list
 	      (setq codings (cons alias codings))))))
     codings))
 
-(defconst char-coding-system-table nil
-  "It exists just for backward compatibility, and the value is always nil.")
-(make-obsolete-variable 'char-coding-system-table nil "23.1")
-
 (defun transform-make-coding-system-args (name type &optional doc-string props)
   "For internal use only.
 Transform XEmacs style args for `make-coding-system' to Emacs style.
 Value is a list of transformed arguments."
+  (declare (obsolete nil "28.1"))
   (let ((mnemonic (string-to-char (or (plist-get props 'mnemonic) "?")))
 	(eol-type (plist-get props 'eol-type))
 	properties tmp)
@@ -1170,106 +1146,6 @@ transform-make-coding-system-args
       (error "unsupported XEmacs style make-coding-style arguments: %S"
 	     `(,name ,type ,doc-string ,props))))))
 
-(defun make-coding-system (coding-system type mnemonic doc-string
-					 &optional
-					 flags
-					 properties
-					 eol-type)
-  "Define a new coding system CODING-SYSTEM (symbol).
-This function is provided for backward compatibility."
-  (declare (obsolete define-coding-system "23.1"))
-  ;; For compatibility with XEmacs, we check the type of TYPE.  If it
-  ;; is a symbol, perhaps, this function is called with XEmacs-style
-  ;; arguments.  Here, try to transform that kind of arguments to
-  ;; Emacs style.
-  (if (symbolp type)
-      (let ((args (transform-make-coding-system-args coding-system type
-						     mnemonic doc-string)))
-	(setq coding-system (car args)
-	      type (nth 1 args)
-	      mnemonic (nth 2 args)
-	      doc-string (nth 3 args)
-	      flags (nth 4 args)
-	      properties (nth 5 args)
-	      eol-type (nth 6 args))))
-
-  (setq type
-	(cond ((eq type 0) 'emacs-mule)
-	      ((eq type 1) 'shift-jis)
-	      ((eq type 2) 'iso2022)
-	      ((eq type 3) 'big5)
-	      ((eq type 4) 'ccl)
-	      ((eq type 5) 'raw-text)
-	      (t
-	       (error "Invalid coding system type: %s" type))))
-
-  (setq properties
-	(let ((plist nil) key)
-	  (dolist (elt properties)
-	    (setq key (car elt))
-	    (cond ((eq key 'post-read-conversion)
-		   (setq key :post-read-conversion))
-		  ((eq key 'pre-write-conversion)
-		   (setq key :pre-write-conversion))
-		  ((eq key 'translation-table-for-decode)
-		   (setq key :decode-translation-table))
-		  ((eq key 'translation-table-for-encode)
-		   (setq key :encode-translation-table))
-		  ((eq key 'safe-charsets)
-		   (setq key :charset-list))
-		  ((eq key 'mime-charset)
-		   (setq key :mime-charset))
-		  ((eq key 'valid-codes)
-		   (setq key :valids)))
-	    (setq plist (plist-put plist key (cdr elt))))
-	  plist))
-  (setq properties (plist-put properties :mnemonic mnemonic))
-  (plist-put properties :coding-type type)
-  (cond ((eq eol-type 0) (setq eol-type 'unix))
-	((eq eol-type 1) (setq eol-type 'dos))
-	((eq eol-type 2) (setq eol-type 'mac))
-	((vectorp eol-type) (setq eol-type nil)))
-  (plist-put properties :eol-type eol-type)
-
-  (cond
-   ((eq type 'iso2022)
-    (plist-put properties :flags
-	       (list (and (or (consp (nth 0 flags))
-			      (consp (nth 1 flags))
-			      (consp (nth 2 flags))
-			      (consp (nth 3 flags))) 'designation)
-		     (or (nth 4 flags) 'long-form)
-		     (and (nth 5 flags) 'ascii-at-eol)
-		     (and (nth 6 flags) 'ascii-at-cntl)
-		     (and (nth 7 flags) '7-bit)
-		     (and (nth 8 flags) 'locking-shift)
-		     (and (nth 9 flags) 'single-shift)
-		     (and (nth 10 flags) 'use-roman)
-		     (and (nth 11 flags) 'use-oldjis)
-		     (or (nth 12 flags) 'direction)
-		     (and (nth 13 flags) 'init-at-bol)
-		     (and (nth 14 flags) 'designate-at-bol)
-		     (and (nth 15 flags) 'safe)
-		     (and (nth 16 flags) 'latin-extra)))
-    (plist-put properties :designation
-	       (let ((vec (make-vector 4 nil)))
-		 (dotimes (i 4)
-		   (let ((spec (nth i flags)))
-		     (if (eq spec t)
-			 (aset vec i '(94 96))
-		     (if (consp spec)
-			 (progn
-			   (if (memq t spec)
-			       (setq spec (append (delq t spec) '(94 96))))
-			   (aset vec i spec))))))
-		 vec)))
-
-   ((eq type 'ccl)
-    (plist-put properties :ccl-decoder (car flags))
-    (plist-put properties :ccl-encoder (cdr flags))))
-
-  (apply 'define-coding-system coding-system doc-string properties))
-
 (defun merge-coding-systems (first second)
   "Fill in any unspecified aspects of coding system FIRST from SECOND.
 Return the resulting coding system."
@@ -1616,15 +1492,6 @@ set-next-selection-coding-system
 
   (setq next-selection-coding-system coding-system))
 
-(defun set-coding-priority (arg)
-  "Set priority of coding categories according to ARG.
-ARG is a list of coding categories ordered by priority.
-
-This function is provided for backward compatibility."
-  (declare (obsolete set-coding-system-priority "23.1"))
-  (apply 'set-coding-system-priority
-	 (mapcar #'(lambda (x) (symbol-value x)) arg)))
-
 ;;; X selections
 
 (defvar ctext-non-standard-encodings-alist
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 44cde7cb5a..312baffb90 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -521,25 +521,6 @@ rmail-mmdf-delim1
 (defvar rmail-mmdf-delim2 "^\001\001\001\001\n"
   "Regexp marking the end of an mmdf message.")
 
-;; FIXME Post-mbox, this is now unused.
-;; In Emacs-22, this was called:
-;;  i) the very first time a message was shown.
-;; ii) when toggling the headers to the normal state, every time.
-;; It's not clear what it should do now, since there is nothing that
-;; records when a message is shown for the first time (unseen is not
-;; necessarily the same thing).
-;; See https://lists.gnu.org/r/emacs-devel/2009-03/msg00013.html
-(defcustom rmail-message-filter nil
-  "If non-nil, a filter function for new messages in RMAIL.
-Called with region narrowed to the message, including headers,
-before obeying `rmail-ignored-headers'."
-  :group 'rmail-headers
-  :type '(choice (const nil) function))
-
-(make-obsolete-variable 'rmail-message-filter
-			"it is not used (try `rmail-show-message-hook')."
-			"23.1")
-
 (defcustom rmail-automatic-folder-directives nil
   "List of directives specifying how to automatically file messages.
 Whenever Rmail shows a message in the folder that `rmail-file-name'
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index d2c3f9045e..0d99f4687c 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -685,13 +685,6 @@ completion--twq-all
                completions)
        qboundary))))
 
-;; (defmacro complete-in-turn (a b) `(completion-table-in-turn ,a ,b))
-;; (defmacro dynamic-completion-table (fun) `(completion-table-dynamic ,fun))
-(define-obsolete-function-alias
-  'complete-in-turn #'completion-table-in-turn "23.1")
-(define-obsolete-function-alias
-  'dynamic-completion-table #'completion-table-dynamic "23.1")
-
 ;;; Minibuffer completion
 
 (defgroup minibuffer nil
@@ -1770,9 +1763,6 @@ completion--insert-strings
 			      ;; Round up to a whole number of columns.
 			      (* colwidth (ceiling length colwidth))))))))))))
 
-(defvar completion-common-substring nil)
-(make-obsolete-variable 'completion-common-substring nil "23.1")
-
 (defvar completion-setup-hook nil
   "Normal hook run at the end of setting up a completion list buffer.
 When this hook is run, the current buffer is the one in which the
@@ -1864,11 +1854,7 @@ display-completion-list
         (insert "Possible completions are:\n")
         (completion--insert-strings completions))))
 
-  ;; The hilit used to be applied via completion-setup-hook, so there
-  ;; may still be some code that uses completion-common-substring.
-  (with-no-warnings
-    (let ((completion-common-substring common-substring))
-      (run-hooks 'completion-setup-hook)))
+  (run-hooks 'completion-setup-hook)
   nil)
 
 (defvar completion-extra-properties nil
@@ -2374,8 +2360,6 @@ minibuffer-local-filename-completion-map
 Gets combined either with `minibuffer-local-completion-map' or
 with `minibuffer-local-must-match-map'.")
 
-(define-obsolete-variable-alias 'minibuffer-local-must-match-filename-map
-  'minibuffer-local-filename-must-match-map "23.1")
 (defvar minibuffer-local-filename-must-match-map (make-sparse-keymap))
 (make-obsolete-variable 'minibuffer-local-filename-must-match-map nil "24.1")
 
diff --git a/lisp/mouse.el b/lisp/mouse.el
index d369545f18..a06ca2a56c 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -274,34 +274,6 @@ mouse-menu-bar-map
            local-menu
            minor-mode-menus)))
 
-(defun mouse-major-mode-menu (event &optional prefix)
-  "Pop up a mode-specific menu of mouse commands.
-Default to the Edit menu if the major mode doesn't define a menu."
-  (declare (obsolete mouse-menu-major-mode-map "23.1"))
-  (interactive "@e\nP")
-  (run-hooks 'activate-menubar-hook 'menu-bar-update-hook)
-  (popup-menu (mouse-menu-major-mode-map) event prefix))
-
-(defun mouse-popup-menubar (event prefix)
-  "Pop up a menu equivalent to the menu bar for keyboard EVENT with PREFIX.
-The contents are the items that would be in the menu bar whether or
-not it is actually displayed."
-  (declare (obsolete mouse-menu-bar-map "23.1"))
-  (interactive "@e \nP")
-  (run-hooks 'activate-menubar-hook 'menu-bar-update-hook)
-  (popup-menu (mouse-menu-bar-map) (unless (integerp event) event) prefix))
-
-(defun mouse-popup-menubar-stuff (event prefix)
-  "Popup a menu like either `mouse-major-mode-menu' or `mouse-popup-menubar'.
-Use the former if the menu bar is showing, otherwise the latter."
-  (declare (obsolete nil "23.1"))
-  (interactive "@e\nP")
-  (run-hooks 'activate-menubar-hook 'menu-bar-update-hook)
-  (popup-menu
-   (if (zerop (or (frame-parameter nil 'menu-bar-lines) 0))
-       (mouse-menu-bar-map)
-     (mouse-menu-major-mode-map))
-   event prefix))
 \f
 ;; Commands that operate on windows.
 
diff --git a/lisp/net/newst-treeview.el b/lisp/net/newst-treeview.el
index 1bed61f3e7..ff8a447c7c 100644
--- a/lisp/net/newst-treeview.el
+++ b/lisp/net/newst-treeview.el
@@ -131,14 +131,6 @@ newsticker-groups
 Example: (\"Topmost group\" \"feed1\" (\"subgroup1\" \"feed 2\")
 \"feed3\")")
 
-(defcustom newsticker-groups-filename
-  nil
-  "Name of the newsticker groups settings file."
-  :version "25.1"                       ; changed default value to nil
-  :type '(choice (const nil) string)
-  :group 'newsticker-treeview)
-(make-obsolete-variable 'newsticker-groups-filename 'newsticker-dir "23.1")
-
 ;; ======================================================================
 ;;; internal variables
 ;; ======================================================================
@@ -1265,29 +1257,9 @@ newsticker-treeview-save
 (defun newsticker--treeview-load ()
   "Load treeview settings."
   (let* ((coding-system-for-read 'utf-8)
-         (filename
-          (or (and newsticker-groups-filename
-                   (not (string=
-                         (expand-file-name newsticker-groups-filename)
-                         (expand-file-name (concat newsticker-dir "/groups"))))
-                   (file-exists-p newsticker-groups-filename)
-                   (y-or-n-p
-                    (format-message
-                     (concat "Obsolete variable `newsticker-groups-filename' "
-                             "points to existing file \"%s\".\n"
-                             "Read it? ")
-                     newsticker-groups-filename))
-                   newsticker-groups-filename)
-              (concat newsticker-dir "/groups")))
+         (filename (concat newsticker-dir "/groups"))
          (buf (and (file-exists-p filename)
                    (find-file-noselect filename))))
-    (and newsticker-groups-filename
-         (file-exists-p newsticker-groups-filename)
-	 (y-or-n-p (format-message
-                    (concat "Delete the file \"%s\",\nto which the obsolete "
-                            "variable `newsticker-groups-filename' points ? ")
-                    newsticker-groups-filename))
-	 (delete-file newsticker-groups-filename))
     (when buf
       (set-buffer buf)
       (goto-char (point-min))
diff --git a/lisp/obsolete/tpu-edt.el b/lisp/obsolete/tpu-edt.el
index d71f79c87b..0de7aa096d 100644
--- a/lisp/obsolete/tpu-edt.el
+++ b/lisp/obsolete/tpu-edt.el
@@ -287,14 +287,6 @@ tpu-version
 ;;;
 ;;;  User Configurable Variables
 ;;;
-(defcustom tpu-have-ispell t
-  "Non-nil means `tpu-spell-check' uses `ispell-region' for spell checking.
-Otherwise, use `spell-region'."
-  :type 'boolean
-  :group 'tpu)
-(make-obsolete-variable 'tpu-have-ispell "the `spell' package is obsolete."
-                        "23.1")
-
 (defcustom tpu-kill-buffers-silently nil
   "If non-nil, TPU-edt kills modified buffers without asking."
   :type 'boolean
@@ -315,7 +307,6 @@ tpu-pan-columns
 ;;;  Global Keymaps
 ;;;
 
-(define-obsolete-variable-alias 'GOLD-map 'tpu-gold-map "23.1")
 (defvar tpu-gold-map
   (let ((map (make-keymap)))
     ;; Previously we used escape sequences here.  We now instead presume
@@ -892,8 +883,7 @@ tpu-spell-check
 if no region is selected."
   (interactive)
   (let ((m (tpu-mark)))
-    (apply (if tpu-have-ispell 'ispell-region
-             'spell-region)
+    (apply 'ispell-region
            (if m
                (if (> m (point)) (list (point) m)
                  (list m (point)))
diff --git a/lisp/password-cache.el b/lisp/password-cache.el
index f5007579a8..2443f374a8 100644
--- a/lisp/password-cache.el
+++ b/lisp/password-cache.el
@@ -94,22 +94,6 @@ password-read
   (or (password-read-from-cache key)
       (read-passwd prompt)))
 
-(defun password-read-and-add (prompt &optional key)
-  "Read password, for use with KEY, from user, or from cache if wanted.
-Then store the password in the cache.  Uses `password-read' and
-`password-cache-add'.  Custom variables `password-cache' and
-`password-cache-expiry' regulate cache behavior.
-
-Warning: the password is cached without checking that it is
-correct.  It is better to check the password before caching.  If
-you must use this function, take care to check passwords and
-remove incorrect ones from the cache."
-  (declare (obsolete password-read "23.1"))
-  (let ((password (password-read prompt key)))
-    (when (and password key)
-      (password-cache-add key password))
-    password))
-
 (defun password-cache-remove (key)
   "Remove password indexed by KEY from password cache.
 This is typically run by a timer setup from `password-cache-add',
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index 3092d4c45b..55acb77425 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -159,8 +159,6 @@
   (defalias 'line-beginning-position 'point-at-bol))
 (unless (fboundp 'line-end-position)
   (defalias 'line-end-position 'point-at-eol))
-(unless (fboundp 'char-valid-p)
-  (defalias 'char-valid-p 'characterp))
 (unless (fboundp 'match-string-no-properties)
   (defalias 'match-string-no-properties 'match-string))
 
diff --git a/lisp/shell.el b/lisp/shell.el
index dc528412a6..39f2b4ce0f 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -985,9 +985,6 @@ shell-dirtrack-mode
       (add-hook 'comint-input-filter-functions #'shell-directory-tracker nil t)
     (remove-hook 'comint-input-filter-functions #'shell-directory-tracker t)))
 
-(define-obsolete-function-alias 'shell-dirtrack-toggle #'shell-dirtrack-mode
-  "23.1")
-
 (defun shell-cd (dir)
   "Do normal `cd' to DIR, and set `list-buffers-directory'."
   (cd dir)
diff --git a/lisp/subr.el b/lisp/subr.el
index 6bd06a0b82..8eb4cf452d 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1583,11 +1583,6 @@ posn-object-width-height
 (make-obsolete 'string-as-multibyte "use `decode-coding-string'." "26.1")
 (make-obsolete 'string-make-multibyte "use `decode-coding-string'." "26.1")
 
-(defun forward-point (n)
-  "Return buffer position N characters after (before if N negative) point."
-  (declare (obsolete "use (+ (point) N) instead." "23.1"))
-  (+ (point) n))
-
 (defun log10 (x)
   "Return (log X 10), the log base 10 of X."
   (declare (obsolete log "24.4"))
@@ -1612,8 +1607,6 @@ log10
 (make-obsolete 'set-window-redisplay-end-trigger nil "23.1")
 
 (make-obsolete 'run-window-configuration-change-hook nil "27.1")
-(make-obsolete 'process-filter-multibyte-p nil "23.1")
-(make-obsolete 'set-process-filter-multibyte nil "23.1")
 
 (make-obsolete-variable 'command-debug-status
                         "expect it to be removed in a future version." "25.2")
diff --git a/lisp/t-mouse.el b/lisp/t-mouse.el
index a1af53d8c4..4feab71401 100644
--- a/lisp/t-mouse.el
+++ b/lisp/t-mouse.el
@@ -62,8 +62,6 @@ gpm-mouse-disable
     (gpm-mouse-stop))
   (set-terminal-parameter nil 'gpm-mouse-active nil))
 
-;;;###autoload
-(define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
 ;;;###autoload
 (define-minor-mode gpm-mouse-mode
   "Toggle mouse support in GNU/Linux consoles (GPM Mouse mode).
diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el
index 5901e0295e..e866fdc36c 100644
--- a/lisp/term/w32-win.el
+++ b/lisp/term/w32-win.el
@@ -78,12 +78,8 @@
 (require 'dnd)
 (require 'w32-vars)
 
-;; Keep an obsolete alias for w32-focus-frame and w32-select-font in case
-;; they are used by code outside Emacs.
-(define-obsolete-function-alias 'w32-focus-frame 'x-focus-frame "23.1")
 (declare-function x-select-font "w32font.c"
                   (&optional frame exclude-proportional))
-(define-obsolete-function-alias 'w32-select-font 'x-select-font "23.1")
 
 (defvar w32-color-map) ;; defined in w32fns.c
 (make-obsolete 'w32-default-color-map nil "24.1")
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 65f61644b6..ffcdb9bd16 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -621,15 +621,6 @@ ispell-encoding8-command
 Earlier Aspell versions do not consistently support charset encoding.  Handling
 this would require some extra guessing in `ispell-aspell-find-dictionary'.")
 
-(defvar ispell-aspell-supports-utf8 nil
-  "Non-nil if Aspell has consistent command line UTF-8 support.  Obsolete.
-ispell.el and flyspell.el will use for this purpose the more generic
-variable `ispell-encoding8-command' for both Aspell and Hunspell.  Is left
-here just for backwards compatibility.")
-
-(make-obsolete-variable 'ispell-aspell-supports-utf8
-                        'ispell-encoding8-command "23.1")
-
 (defvar ispell-dicts-name2locale-equivs-alist
   '(("american"      "en_US")
     ("brasileiro"    "pt_BR")
diff --git a/lisp/textmodes/remember.el b/lisp/textmodes/remember.el
index 279dbb4450..7bc7dc1762 100644
--- a/lisp/textmodes/remember.el
+++ b/lisp/textmodes/remember.el
@@ -487,9 +487,6 @@ remember-finalize
   (interactive)
   (remember-region (point-min) (point-max)))
 
-;; Org needs this
-(define-obsolete-function-alias 'remember-buffer 'remember-finalize "23.1")
-
 (defun remember-destroy ()
   "Destroy the current *Remember* buffer."
   (interactive)
diff --git a/lisp/tooltip.el b/lisp/tooltip.el
index f35f6b9a03..5f5a4788b2 100644
--- a/lisp/tooltip.el
+++ b/lisp/tooltip.el
@@ -167,8 +167,6 @@ tooltip-resize-echo-area
 \f
 ;;; Variables that are not customizable.
 
-(define-obsolete-variable-alias 'tooltip-hook 'tooltip-functions "23.1")
-
 (defvar tooltip-functions nil
   "Functions to call to display tooltips.
 Each function is called with one argument EVENT which is a copy
diff --git a/lisp/url/url-util.el b/lisp/url/url-util.el
index 6dd7a9c2aa..0a7e7e205e 100644
--- a/lisp/url/url-util.el
+++ b/lisp/url/url-util.el
@@ -569,31 +569,6 @@ url-get-url-at-point
 	  (setq url nil))
       url)))
 
-(defun url-generate-unique-filename (&optional fmt)
-  "Generate a unique filename in `url-temporary-directory'."
-  (declare (obsolete make-temp-file "23.1"))
-  ;; This variable is obsolete, but so is this function.
-  (let ((tempdir (with-no-warnings url-temporary-directory)))
-    (if (not fmt)
-	(let ((base (format "url-tmp.%d" (user-real-uid)))
-	      (fname "")
-	      (x 0))
-	  (setq fname (format "%s%d" base x))
-	  (while (file-exists-p
-		  (expand-file-name fname tempdir))
-	    (setq x (1+ x)
-		  fname (concat base (int-to-string x))))
-	  (expand-file-name fname tempdir))
-      (let ((base (concat "url" (int-to-string (user-real-uid))))
-	    (fname "")
-	    (x 0))
-	(setq fname (format fmt (concat base (int-to-string x))))
-	(while (file-exists-p
-		(expand-file-name fname tempdir))
-	  (setq x (1+ x)
-		fname (format fmt (concat base (int-to-string x)))))
-	(expand-file-name fname tempdir)))))
-
 (defun url-extract-mime-headers ()
   "Set `url-current-mime-headers' in current buffer."
   (save-excursion
diff --git a/lisp/url/url-vars.el b/lisp/url/url-vars.el
index d9277cf6f4..e35823ab9a 100644
--- a/lisp/url/url-vars.el
+++ b/lisp/url/url-vars.el
@@ -312,13 +312,6 @@ url-max-password-attempts
   :type 'integer
   :group 'url)
 
-(defcustom url-temporary-directory (or (getenv "TMPDIR") "/tmp")
-  "Where temporary files go."
-  :type 'directory
-  :group 'url-file)
-(make-obsolete-variable 'url-temporary-directory
-			'temporary-file-directory "23.1")
-
 (defcustom url-show-status t
   "Whether to show a running total of bytes transferred.
 Can cause a large hit if using a remote X display over a slow link, or
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index ce72a49b95..f09ceddcb3 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -505,14 +505,6 @@ vc-working-revision
                            (vc-call-backend
                             backend 'working-revision file))))))
 
-;; Backward compatibility.
-(define-obsolete-function-alias
-  'vc-workfile-version 'vc-working-revision "23.1")
-(defun vc-default-working-revision (backend file)
-  (message
-   "`working-revision' not found: using the old `workfile-version' instead")
-  (vc-call-backend backend 'workfile-version file))
-
 (defun vc-default-registered (backend file)
   "Check if FILE is registered in BACKEND using vc-BACKEND-master-templates."
   (let ((sym (vc-make-backend-sym backend 'master-templates)))
diff --git a/lisp/vc/vc-mtn.el b/lisp/vc/vc-mtn.el
index 092d8b5396..3c26ffc0e5 100644
--- a/lisp/vc/vc-mtn.el
+++ b/lisp/vc/vc-mtn.el
@@ -60,7 +60,6 @@ vc-mtn-annotate-switches
   :version "25.1"
   :group 'vc-mtn)
 
-(define-obsolete-variable-alias 'vc-mtn-command 'vc-mtn-program "23.1")
 (defcustom vc-mtn-program "mtn"
   "Name of the monotone executable."
   :type 'string
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 65775f8e46..5561292d8c 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -2709,9 +2709,6 @@ vc-revert
       (vc-revert-file file)
       (message "Reverting %s...done" (vc-delistify files)))))
 
-;;;###autoload
-(define-obsolete-function-alias 'vc-revert-buffer 'vc-revert "23.1")
-
 ;;;###autoload
 (defun vc-pull (&optional arg)
   "Update the current fileset or branch.
diff --git a/lisp/vcursor.el b/lisp/vcursor.el
index fa0cbb74b0..3601abcd6e 100644
--- a/lisp/vcursor.el
+++ b/lisp/vcursor.el
@@ -1132,9 +1132,6 @@ vcursor-copy-line
     (vcursor-copy (if (or (= count 0) arg) (1+ count) count)))
   )
 
-(define-obsolete-function-alias
-  'vcursor-toggle-vcursor-map 'vcursor-use-vcursor-map "23.1")
-
 (defun vcursor-post-command ()
   (and vcursor-auto-disable (not vcursor-last-command)
        vcursor-overlay
diff --git a/src/coding.c b/src/coding.c
index 071124b4ef..1d79c703a3 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -11829,8 +11829,7 @@ syms_of_coding (void)
 This variable is given to `completing-read' as COLLECTION argument.
 
 Do not alter the value of this variable manually.  This variable should be
-updated by the functions `make-coding-system' and
-`define-coding-system-alias'.  */);
+updated by `define-coding-system-alias'.  */);
   Vcoding_system_alist = Qnil;
 
   DEFVAR_LISP ("coding-category-list", Vcoding_category_list,
diff --git a/test/manual/etags/c-src/abbrev.c b/test/manual/etags/c-src/abbrev.c
index 03b9f0e65b..44563d6046 100644
--- a/test/manual/etags/c-src/abbrev.c
+++ b/test/manual/etags/c-src/abbrev.c
@@ -78,9 +78,6 @@
 
 int last_abbrev_point;
 
-/* Hook to run before expanding any abbrev.  */
-
-Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;
 \f
 DEFUN ("make-abbrev-table", Fmake_abbrev_table, Smake_abbrev_table, 0, 0, 0,
   "Create a new, empty abbrev table object.")
@@ -232,9 +229,6 @@ DEFUN ("expand-abbrev", Fexpand_abbrev, Sexpand_abbrev, 0, 0, "",
 
   value = Qnil;
 
-  if (!NILP (Vrun_hooks))
-    call1 (Vrun_hooks, Qpre_abbrev_expand_hook);
-
   wordstart = 0;
   if (!(BUFFERP (Vabbrev_start_location_buffer)
 	&& XBUFFER (Vabbrev_start_location_buffer) == current_buffer))
@@ -595,14 +589,6 @@ syms_of_abbrev ()
     "*Set non-nil means expand multi-word abbrevs all caps if abbrev was so.");
   abbrev_all_caps = 0;
 
-  DEFVAR_LISP ("pre-abbrev-expand-hook", &Vpre_abbrev_expand_hook,
-    "Function or functions to be called before abbrev expansion is done.\n\
-This is the first thing that `expand-abbrev' does, and so this may change\n\
-the current abbrev table before abbrev lookup happens.");
-  Vpre_abbrev_expand_hook = Qnil;
-  Qpre_abbrev_expand_hook = intern ("pre-abbrev-expand-hook");
-  staticpro (&Qpre_abbrev_expand_hook);
-
   defsubr (&Smake_abbrev_table);
   defsubr (&Sclear_abbrev_table);
   defsubr (&Sdefine_abbrev);
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: [PATCH] Remove obsolete fast-lock and lazy-lock libraries
  2020-08-07 15:42       ` [PATCH] Remove obsolete fast-lock and lazy-lock libraries (was: Re: Deleting old `:version` from defcustoms) Stefan Kangas
@ 2020-08-08  2:19         ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-08-08  2:19 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Emacs developers

>> There are also these two libraries:
>> ./lisp/obsolete/fast-lock.el9:;; Obsolete-since: 22.1
>> ./lisp/obsolete/lazy-lock.el9:;; Obsolete-since: 22.1
> I have attached a patch to remove them below.

LGTM.

>  ;; to avoid compilation gripes
>  (defun ps-print-ensure-fontified (start end)
>    (cond ((and (boundp 'jit-lock-mode) (symbol-value 'jit-lock-mode))
> -	 (jit-lock-fontify-now start end))
> -	((and (boundp 'lazy-lock-mode) (symbol-value 'lazy-lock-mode))
> -	 (lazy-lock-fontify-region start end))))
> +	 (jit-lock-fontify-now start end))))

I think this can be replaced by `font-lock-ensure`, but it probably
requires additional tests to be sure, so maybe keep the code as is and
just add a FIXME.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-08-07 10:53                 ` Philip K.
@ 2020-08-08 23:54                   ` Juri Linkov
  2021-05-12 20:38                   ` Lars Ingebrigtsen
  1 sibling, 0 replies; 838+ messages in thread
From: Juri Linkov @ 2020-08-08 23:54 UTC (permalink / raw)
  To: Philip K.; +Cc: 41438, larsi

> But there are a few general issues I noticed:
>
> 1. windmove-display-{same-window,new-{frame,tab}} can disturb regular
>    input when the modifier is set to shift or none. Possible solutions
>    could be to prohibit using these modifiers or to add a prefix key and
>    generate a warning when eg. "S-t" or "t" would be rebound.

Perhaps displaying a warning should be sufficient.

> 2. The new function windmove--unbind works with the global-map, so when
>    someone sets a prefix to none, and then changes it to something else,
>    the arrow keys are left undefined. I could either see this being
>    fixed by using a separate map or by somehow memorising what the
>    previous key was (eg. by using the property list of the windmove
>    command's symbol).

I'm not sure whether such complication is necessary.  Usually
users will try to customize the option and then restart Emacs.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-08  0:28       ` Stefan Kangas
@ 2020-08-14 11:11         ` Stefan Kangas
  2020-08-14 15:42         ` Stefan Kangas
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-08-14 11:11 UTC (permalink / raw)
  To: Stefan Monnier, emacs-devel

Stefan Kangas <stefankangas@gmail.com> writes:

> I have looked this all over again, and I'm attaching a (hopefully) final
> patch here. I found some places where the documentation needed updating,
> and one or two uses that I had missed previously. There have been
> relatively minor changes since last time, but I want to give everyone a
> chance to comment before pushing.

No further comments within a week.  Pushed to master as commit
874ba85363e.

Best regards,
Stefan Kangas



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-08  0:28       ` Stefan Kangas
  2020-08-14 11:11         ` Stefan Kangas
@ 2020-08-14 15:42         ` Stefan Kangas
  2020-08-14 18:56           ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-08-14 15:42 UTC (permalink / raw)
  To: Stefan Monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 432 bytes --]

Stefan Kangas <stefankangas@gmail.com> writes:

> Besides that, the next step here would be to remove variables obsoleted
> in 23.{2,3,4}.

I'm attaching a patch to remove most things declared obsolete in 23.2
and 23.3.  (Nothing was declared obsolete in 23.4 AFAICT.)

There are still some items obsoleted in 23.x left to delete in Semantic.
I intend to do that in a separate patch.

Comments welcome.

Best regards,
Stefan Kangas

[-- Attachment #2: 0001-Remove-many-items-obsolete-since-Emacs-23.2-and-23.3.patch --]
[-- Type: text/x-diff, Size: 36276 bytes --]

From 7f3f615b3547ee902461f752ba420ffc705c20d1 Mon Sep 17 00:00:00 2001
From: Stefan Kangas <stefankangas@gmail.com>
Date: Sat, 8 Aug 2020 05:32:37 +0200
Subject: [PATCH] Remove many items obsolete since Emacs 23.2 and 23.3

* lisp/allout.el (allout-init):
* lisp/emacs-lisp/shadow.el (shadows-compare-text-p):
* lisp/ffap.el (ffap-version):
* lisp/filecache.el (file-cache-choose-completion):
* lisp/help.el (print-help-return-message):
* lisp/image-mode.el (image-mode-maybe):
* lisp/imenu.el (imenu-example--name-and-position):
* lisp/international/mule-cmds.el (princ-list):
* lisp/mail/rmail.el (rmail-highlight-face):
* lisp/minibuffer.el (read-file-name-predicate):
* lisp/mouse.el (mouse-choose-completion):
* lisp/progmodes/cc-cmds.el (c-forward-into-nomenclature):
* lisp/progmodes/xscheme.el
(advertised-xscheme-send-previous-expression):
* lisp/simple.el (completion-base-size)
(choose-completion-delete-max-match, exchange-dot-and-mark):
* lisp/subr.el (eval-next-after-load, interactive-p):
* lisp/term.el (term-dynamic-simple-complete):
Remove items, obsolete since Emacs 23.2 and 23.3.
* doc/misc/cc-mode.texi (Movement Commands): Doc fix.
* doc/lispref/help.texi (Accessing Documentation):
* lisp/emacs-lisp/edebug.el (edebug-wrap-def-body):
* lisp/cedet/data-debug.el:
* lisp/simple.el (append-next-kill):
* test/manual/cedet/cedet-utests.el (cedet-utest, pulse-test):
* test/manual/cedet/semantic-tests.el
(semantic-symref-test-count-hits-in-tag)
(semantic-lex-spp-write-utest): Use 'called-interactively-p'
instead of 'interactive-p'.
* lisp/comint.el (comint-dynamic-list-completions):
* lisp/progmodes/idlwave.el (idlwave-make-modified-completion-map-xemacs)
(idlwave-make-modified-completion-map-emacs):
* lisp/progmodes/vhdl-mode.el:
* lisp/term.el (term-dynamic-list-completions):
Remove references to 'mouse-choose-completion'.
* lisp/image-mode.el (image-mode-to-text):
Remove reference to 'image-mode-maybe'.
* lisp/mail/rmail.el (rmail-highlight-headers):
Use 'rmail-highlight' face instead of 'rmail-highlight-face'.
* lisp/progmodes/antlr-mode.el (antlr-mode-map, antlr-mode-menu):
Remove reference to 'c-forward-into-nomenclature'.
* lisp/simple.el (choose-completion, choose-completion-string)
(completion-list-mode, completion-setup-function): Don't use
'completion-base-size'.
; * etc/NEWS: List removed items.
---
 doc/lispref/help.texi               |  3 +-
 doc/misc/cc-mode.texi               |  2 --
 etc/NEWS                            | 49 ++++++++++++++++-------------
 lisp/allout.el                      | 15 +--------
 lisp/cedet/data-debug.el            |  2 +-
 lisp/comint.el                      |  2 +-
 lisp/emacs-lisp/edebug.el           |  2 +-
 lisp/emacs-lisp/shadow.el           |  3 --
 lisp/ffap.el                        |  2 --
 lisp/filecache.el                   |  3 --
 lisp/help.el                        |  1 -
 lisp/image-mode.el                  |  4 +--
 lisp/imenu.el                       | 22 -------------
 lisp/international/mule-cmds.el     |  6 ----
 lisp/mail/rmail.el                  | 22 ++-----------
 lisp/minibuffer.el                  |  5 ---
 lisp/mouse.el                       |  3 --
 lisp/progmodes/antlr-mode.el        |  4 +--
 lisp/progmodes/cc-cmds.el           | 13 --------
 lisp/progmodes/idlwave.el           | 11 ++-----
 lisp/progmodes/vhdl-mode.el         |  4 ---
 lisp/progmodes/xscheme.el           |  2 --
 lisp/simple.el                      | 43 +++----------------------
 lisp/subr.el                        | 30 ------------------
 lisp/term.el                        | 49 +----------------------------
 test/manual/cedet/cedet-utests.el   | 12 +++----
 test/manual/cedet/semantic-tests.el |  4 +--
 27 files changed, 55 insertions(+), 263 deletions(-)

diff --git a/doc/lispref/help.texi b/doc/lispref/help.texi
index 9b3c4fcb23..d4505d5c3f 100644
--- a/doc/lispref/help.texi
+++ b/doc/lispref/help.texi
@@ -220,7 +220,8 @@ Accessing Documentation
 
 @group
     ;; @r{Display the data.}
-    (help-setup-xref (list 'describe-symbols pattern) (interactive-p))
+    (help-setup-xref (list 'describe-symbols pattern)
+                 (called-interactively-p 'interactive))
     (with-help-window (help-buffer)
       (mapcar describe-func (sort sym-list 'string<)))))
 @end group
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index 10bbf8ff09..adc233d99d 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -1024,9 +1024,7 @@ Movement Commands
 preprocessor statements.
 
 @item @kbd{M-x c-backward-into-nomenclature}
-@itemx @kbd{M-x c-forward-into-nomenclature}
 @findex c-backward-into-nomenclature
-@findex c-forward-into-nomenclature
 @findex backward-into-nomenclature @r{(c-)}
 @findex forward-into-nomenclature @r{(c-)}
 A popular programming style, especially for object-oriented languages
diff --git a/etc/NEWS b/etc/NEWS
index 91add027e4..ef9a11c521 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -910,35 +910,42 @@ have now been removed.
 
 ---
 ** Some functions and variables obsolete since Emacs 23 have been removed:
-
-'GOLD-map', 'bookmark-jump-noselect',
+'GOLD-map', 'advertised-xscheme-send-previous-expression',
+'allout-init', 'bookmark-jump-noselect',
 'bookmark-read-annotation-text-func', 'buffer-menu-mode-hook',
-'char-coding-system-table', 'char-valid-p', 'charset-bytes',
-'charset-id', 'charset-list' (function), 'complete-in-turn',
-'completion-common-substring', 'crm-minibuffer-complete',
-'crm-minibuffer-complete-and-exit', 'crm-minibuffer-completion-help',
-'custom-mode', 'custom-mode-hook', 'detect-coding-with-priority',
-'dirtrack-debug' (function), 'dirtrack-debug-toggle',
-'dynamic-completion-table',
+'c-forward-into-nomenclature', 'char-coding-system-table',
+'char-valid-p', 'charset-bytes', 'charset-id', 'charset-list'
+(function), 'choose-completion-delete-max-match', 'complete-in-turn',
+'completion-base-size', 'completion-common-substring',
+'crm-minibuffer-complete', 'crm-minibuffer-complete-and-exit',
+'crm-minibuffer-completion-help', 'custom-mode', 'custom-mode-hook',
+'detect-coding-with-priority', 'dirtrack-debug' (function),
+'dirtrack-debug-toggle', 'dynamic-completion-table',
 'easy-menu-precalculate-equivalent-keybindings',
 'epa-display-verify-result', 'epg-passphrase-callback-function',
-'eshell-report-bug', 'ffap-bug', 'ffap-submit-bug', 'forward-point',
-'generic-char-p', 'global-highlight-changes', 'hi-lock-face-history',
+'eshell-report-bug', 'eval-next-after-load', 'exchange-dot-and-mark',
+'ffap-bug', 'ffap-submit-bug', 'ffap-version',
+'file-cache-choose-completion', 'forward-point', 'generic-char-p',
+'global-highlight-changes', 'hi-lock-face-history',
 'hi-lock-regexp-history', 'highlight-changes-active-string',
 'highlight-changes-initial-state', 'highlight-changes-passive-string',
-'ispell-aspell-supports-utf8', 'lisp-mode-auto-fill',
+'image-mode-maybe', 'imenu-example--name-and-position',
+'interactive-p', 'ispell-aspell-supports-utf8', 'lisp-mode-auto-fill',
 'locate-file-completion', 'make-coding-system',
-'minibuffer-local-must-match-filename-map', 'mouse-major-mode-menu',
-'mouse-popup-menubar', 'mouse-popup-menubar-stuff',
-'newsticker-groups-filename', 'non-iso-charset-alist',
-'nonascii-insert-offset', 'nonascii-translation-table',
-'password-read-and-add', 'pre-abbrev-expand-hook',
-'process-filter-multibyte-p', 'remember-buffer' (function),
+'minibuffer-local-must-match-filename-map', 'mouse-choose-completion',
+'mouse-major-mode-menu', 'mouse-popup-menubar',
+'mouse-popup-menubar-stuff', 'newsticker-groups-filename',
+'non-iso-charset-alist', 'nonascii-insert-offset',
+'nonascii-translation-table', 'password-read-and-add',
+'pre-abbrev-expand-hook', 'princ-list', 'print-help-return-message',
+'process-filter-multibyte-p', 'read-file-name-predicate',
+'remember-buffer' (function), 'rmail-highlight-face',
 'rmail-message-filter', 'set-coding-priority',
-'set-process-filter-multibyte', 'shell-dirtrack-toggle',
-'t-mouse-mode', 'tooltip-hook', 'tpu-have-ispell',
+'set-process-filter-multibyte', 'shadows-compare-text-p',
+'shell-dirtrack-toggle', 't-mouse-mode',
+'term-dynamic-simple-complete', 'tooltip-hook', 'tpu-have-ispell',
 'url-generate-unique-filename', 'url-temporary-directory',
-'vc-arch-command', 'vc-default-working-revision' (variable),
+'vc-arch-command', 'vc-default-working-revision (variable)',
 'vc-mtn-command', 'vc-revert-buffer', 'vc-workfile-version',
 'vcursor-toggle-vcursor-map', 'w32-focus-frame', 'w32-select-font'.
 
diff --git a/lisp/allout.el b/lisp/allout.el
index 05d9153a31..955b7000cb 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -62,8 +62,7 @@
 ;; The outline menubar additions provide quick reference to many of the
 ;; features.  See the docstring of the variables `allout-layout' and
 ;; `allout-auto-activation' for details on automatic activation of
-;; `allout-mode' as a minor mode.  (`allout-init' is deprecated in favor of
-;; a purely customization-based method.)
+;; `allout-mode' as a minor mode.
 ;;
 ;; Note -- the lines beginning with `;;;_' are outline topic headers.
 ;;        Customize `allout-auto-activation' to enable, then revisit this
@@ -1627,18 +1626,6 @@ allout-explicitly-deactivated
   "If t, `allout-mode's last deactivation was deliberate.
 So `allout-post-command-business' should not reactivate it...")
 (make-variable-buffer-local 'allout-explicitly-deactivated)
-;;;_  > allout-init (mode)
-(defun allout-init (mode)
-  "DEPRECATED - configure allout activation by customizing
-`allout-auto-activation'.  This function remains around, limited
-from what it did before, for backwards compatibility.
-
-MODE is the activation mode - see `allout-auto-activation' for
-valid values."
-  (declare (obsolete allout-auto-activation "23.3"))
-  (customize-set-variable 'allout-auto-activation (format "%s" mode))
-  (format "%s" mode))
-
 ;;;_  > allout-setup-menubar ()
 (defun allout-setup-menubar ()
   "Populate the current buffer's menubar with `allout-mode' stuff."
diff --git a/lisp/cedet/data-debug.el b/lisp/cedet/data-debug.el
index 604fc40926..44cce389cb 100644
--- a/lisp/cedet/data-debug.el
+++ b/lisp/cedet/data-debug.el
@@ -38,7 +38,7 @@
 ;;   "Calculate something complicated at point, and return it."
 ;;   (interactive) ;; function not normally interactive
 ;;   (let ((stuff (do-stuff)))
-;;     (when (interactive-p)
+;;     (when (called-interactively-p 'interactive)
 ;;       (data-debug-show-stuff stuff "myStuff"))
 ;;     stuff))
 
diff --git a/lisp/comint.el b/lisp/comint.el
index df4937a7d6..9460009bf4 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -3442,7 +3442,7 @@ comint-dynamic-list-completions
 		 (eq (window-buffer (posn-window (event-start first)))
 		     (get-buffer "*Completions*"))
 		 (memq (key-binding key)
-                       '(mouse-choose-completion choose-completion))))
+                       '(choose-completion))))
 	  ;; If the user does choose-completion with the mouse,
 	  ;; execute the command, then delete the completion window.
 	  (progn
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index d9bbf6129c..7ff6d68c3e 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -1229,7 +1229,7 @@ edebug-wrap-def-body
   "Wrap the FORMS of a definition body."
   (if edebug-def-interactive
       `(let ((,(edebug-interactive-p-name)
-	      (interactive-p)))
+	      (called-interactively-p 'interactive)))
 	 ,(edebug-make-enter-wrapper forms))
     (edebug-make-enter-wrapper forms)))
 
diff --git a/lisp/emacs-lisp/shadow.el b/lisp/emacs-lisp/shadow.el
index 4ff129e367..dd614dd792 100644
--- a/lisp/emacs-lisp/shadow.el
+++ b/lisp/emacs-lisp/shadow.el
@@ -55,9 +55,6 @@ lisp-shadow
   :prefix "load-path-shadows-"
   :group 'lisp)
 
-(define-obsolete-variable-alias 'shadows-compare-text-p
-  'load-path-shadows-compare-text "23.3")
-
 (defcustom load-path-shadows-compare-text nil
   "If non-nil, then shadowing files are reported only if their text differs.
 This is slower, but filters out some innocuous shadowing."
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 4a506207d5..97e55df65c 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -110,8 +110,6 @@
 (require 'url-parse)
 (require 'thingatpt)
 
-(define-obsolete-variable-alias 'ffap-version 'emacs-version "23.2")
-
 (defgroup ffap nil
   "Find file or URL at point."
   :group 'matching
diff --git a/lisp/filecache.el b/lisp/filecache.el
index 3c07a49420..113d28cf75 100644
--- a/lisp/filecache.el
+++ b/lisp/filecache.el
@@ -614,9 +614,6 @@ file-cache-choose-completion
     (select-window (active-minibuffer-window))
     (file-cache-minibuffer-complete nil)))
 
-(define-obsolete-function-alias 'file-cache-mouse-choose-completion
-  #'file-cache-choose-completion "23.2")
-
 (defun file-cache-complete  ()
   "Complete the word at point, using the filecache."
   (interactive)
diff --git a/lisp/help.el b/lisp/help.el
index b7d867eb70..1b0149616f 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -131,7 +131,6 @@ help-return-method
  (WINDOW . quit-window)    do quit-window, then select WINDOW.
  (WINDOW BUF START POINT)  display BUF at START, POINT, then select WINDOW.")
 
-(define-obsolete-function-alias 'print-help-return-message 'help-print-return-message "23.2")
 (defun help-print-return-message (&optional function)
   "Display or return message saying how to restore windows after help command.
 This function assumes that `standard-output' is the help buffer.
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index 948e62e10d..534609932c 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -709,7 +709,7 @@ image-mode-to-text
 displays an image file as text."
   ;; image-mode-as-text = normal-mode + image-minor-mode
   (let ((previous-image-type image-type)) ; preserve `image-type'
-    (major-mode-restore '(image-mode image-mode-maybe image-mode-as-text))
+    (major-mode-restore '(image-mode image-mode-as-text))
     ;; Restore `image-type' after `kill-all-local-variables' in `normal-mode'.
     (setq image-type previous-image-type)
     ;; Enable image minor mode with `C-c C-c'.
@@ -759,8 +759,6 @@ image-mode-as-text
                  (if (image-get-display-property)
                      "text" "an image or hex") ".")))
 
-(define-obsolete-function-alias 'image-mode-maybe 'image-mode "23.2")
-
 (defun image-toggle-display-text ()
   "Show the image file as text.
 Remove text properties that display the image."
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 1949f2f48f..3a16dcb9ac 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -316,28 +316,6 @@ imenu-progress-message
 )
 
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;;
-;;;; Some examples of functions utilizing the framework of this
-;;;; package.
-;;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; FIXME: This was the only imenu-example-* definition actually used,
-;; by cperl-mode.el.  Now cperl-mode has its own copy, so these can
-;; all be removed.
-(defun imenu-example--name-and-position ()
-  "Return the current/previous sexp and its (beginning) location.
-Don't move point."
-  (declare (obsolete "use your own function instead." "23.2"))
-  (save-excursion
-    (forward-sexp -1)
-    ;; [ydi] modified for imenu-use-markers
-    (let ((beg (if imenu-use-markers (point-marker) (point)))
-	  (end (progn (forward-sexp) (point))))
-      (cons (buffer-substring beg end)
-	    beg))))
-
 ;;;
 ;;; Lisp
 ;;;
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 5fe931dd9b..02dacaf0a2 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -2070,12 +2070,6 @@ set-language-environment-unibyte
   "Do various unibyte-mode setups for language environment LANGUAGE-NAME."
   (set-display-table-and-terminal-coding-system language-name))
 
-(defun princ-list (&rest args)
-  "Print all arguments with `princ', then print \"\\n\"."
-  (declare (obsolete "use mapc and princ instead." "23.3"))
-  (mapc #'princ args)
-  (princ "\n"))
-
 (put 'describe-specified-language-support 'apropos-inhibit t)
 
 ;; Print language-specific information such as input methods,
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 312baffb90..f14025a93a 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -417,20 +417,6 @@ rmail-highlight
   :group 'rmail-headers
   :version "22.1")
 
-;; This was removed in Emacs 23.1 with no notification, an unnecessary
-;; incompatible change.
-(defcustom rmail-highlight-face 'rmail-highlight
-  "Face used by Rmail for highlighting headers."
-  ;; Note that nil doesn't actually mean use the default face, it
-  ;; means use either bold or highlight. It's not worth fixing this
-  ;; now that this is obsolete.
-  :type '(choice (const :tag "Default" nil)
-		 face)
-  :group 'rmail-headers)
-(make-obsolete-variable 'rmail-highlight-face
-			"customize the face `rmail-highlight' instead."
-			"23.2")
-
 (defface rmail-header-name
   '((t (:inherit font-lock-function-name-face)))
   "Face to use for highlighting the header names.
@@ -3012,7 +2998,7 @@ rmail-redecode-body
 
 (defun rmail-highlight-headers ()
   "Highlight the headers specified by `rmail-highlighted-headers'.
-Uses the face specified by `rmail-highlight-face'."
+Uses the face `rmail-highlight'."
   (if rmail-highlighted-headers
       (save-excursion
 	(search-forward "\n\n" nil 'move)
@@ -3020,11 +3006,7 @@ rmail-highlight-headers
 	  (narrow-to-region (point-min) (point))
 	  (let ((case-fold-search t)
 		(inhibit-read-only t)
-		;; When rmail-highlight-face is removed, just
-		;; use 'rmail-highlight here.
-		(face (or rmail-highlight-face
-			  (if (face-differs-from-default-p 'bold)
-			      'bold 'highlight)))
+		(face 'rmail-highlight)
 		;; List of overlays to reuse.
 		(overlays rmail-overlay-list))
 	    (goto-char (point-min))
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 641a2e5315..1f2dcc4755 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -2539,11 +2539,6 @@ completion-file-name-table
               all))))))
     (file-error nil)))               ;PCM often calls with invalid directories.
 
-(defvar read-file-name-predicate nil
-  "Current predicate used by `read-file-name-internal'.")
-(make-obsolete-variable 'read-file-name-predicate
-                        "use the regular PRED argument" "23.2")
-
 (defun completion--sifn-requote (upos qstr)
   ;; We're looking for `qpos' such that:
   ;; (equal (substring (substitute-in-file-name qstr) 0 upos)
diff --git a/lisp/mouse.el b/lisp/mouse.el
index a06ca2a56c..06fdca12b9 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -2303,9 +2303,6 @@ mouse-buffer-menu-split
     ;; Few buffers--put them all in one pane.
     (list (cons title alist))))
 \f
-(define-obsolete-function-alias
-  'mouse-choose-completion 'choose-completion "23.2")
-
 ;; Font selection.
 
 (defun font-menu-add-default ()
diff --git a/lisp/progmodes/antlr-mode.el b/lisp/progmodes/antlr-mode.el
index bf56a7ee49..24e1f8831a 100644
--- a/lisp/progmodes/antlr-mode.el
+++ b/lisp/progmodes/antlr-mode.el
@@ -695,7 +695,7 @@ antlr-mode-map
     (define-key map "\e\C-e" 'antlr-end-of-rule)
     (define-key map "\C-c\C-a" 'antlr-beginning-of-body)
     (define-key map "\C-c\C-e" 'antlr-end-of-body)
-    (define-key map "\C-c\C-f" 'c-forward-into-nomenclature)
+    (define-key map "\C-c\C-f" 'subword-forward)
     (define-key map "\C-c\C-b" 'c-backward-into-nomenclature)
     (define-key map "\C-c\C-c" 'comment-region)
     (define-key map "\C-c\C-v" 'antlr-hide-actions)
@@ -745,7 +745,7 @@ antlr-mode-menu
      ["Backward Statement" c-beginning-of-statement t]
      ["Forward Statement" c-end-of-statement t]
      ["Backward Into Nomencl." c-backward-into-nomenclature t]
-     ["Forward Into Nomencl." c-forward-into-nomenclature t])
+     ["Forward Into Nomencl." subword-forward t])
     ["Indent Region" indent-region
      :active (and (not buffer-read-only) (c-region-is-active-p))]
     ["Comment Out Region" comment-region
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index 1b557c41a5..4425e275ac 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -1554,19 +1554,6 @@ c-toggle-cpp-indent-to-body
 (declare-function c-backward-subword "ext:cc-subword" (&optional arg))
 
 ;; "nomenclature" functions + c-scope-operator.
-(defun c-forward-into-nomenclature (&optional arg)
-  "Compatibility alias for `c-forward-subword'."
-  (interactive "p")
-  (if (fboundp 'subword-mode)
-      (progn
-        (require 'subword)
-        (subword-forward arg))
-    (require 'cc-subword)
-    (c-forward-subword arg)))
-(make-obsolete 'c-forward-into-nomenclature
-               (if (fboundp 'subword-mode) 'subword-forward 'c-forward-subword)
-               "23.2")
-
 (defun c-backward-into-nomenclature (&optional arg)
   "Compatibility alias for `c-backward-subword'."
   (interactive "p")
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index f7e53ec02d..2d591dd91d 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -7118,7 +7118,7 @@ idlwave-default-choose-completion
   (apply 'idlwave-choose 'default-choose-completion args))
 
 (defun idlwave-make-modified-completion-map-xemacs (old-map)
-  "Replace `choose-completion' and `mouse-choose-completion' in OLD-MAP."
+  "Replace `choose-completion' in OLD-MAP."
   (let ((new-map (copy-keymap old-map)))
     (define-key new-map [button3up] 'idlwave-mouse-completion-help)
     (define-key new-map [button3] (lambda ()
@@ -7141,12 +7141,10 @@ idlwave-display-completion-list-emacs
 		(current-local-map)))))))
 
 (defun idlwave-make-modified-completion-map-emacs (old-map)
-  "Replace `choose-completion' and `mouse-choose-completion' in OLD-MAP."
+  "Replace `choose-completion' in OLD-MAP."
   (let ((new-map (copy-keymap old-map)))
     (substitute-key-definition
      'choose-completion 'idlwave-choose-completion new-map)
-    (substitute-key-definition
-     'mouse-choose-completion 'idlwave-mouse-choose-completion new-map)
     (define-key new-map [mouse-3] 'idlwave-mouse-completion-help)
     new-map))
 
@@ -7155,11 +7153,6 @@ idlwave-choose-completion
   (interactive (list last-nonmenu-event))
   (apply 'idlwave-choose 'choose-completion args))
 
-(defun idlwave-mouse-choose-completion (&rest args)
-  "Click on an alternative in the `*Completions*' buffer to choose it."
-  (interactive "e")
-  (apply 'idlwave-choose 'mouse-choose-completion args))
-
 ;;----------------------------------------------------------------------
 ;;----------------------------------------------------------------------
 
diff --git a/lisp/progmodes/vhdl-mode.el b/lisp/progmodes/vhdl-mode.el
index 9cd84cf713..3d66483b83 100644
--- a/lisp/progmodes/vhdl-mode.el
+++ b/lisp/progmodes/vhdl-mode.el
@@ -2304,10 +2304,6 @@ vhdl-last-input-event
     (defvaralias 'vhdl-last-input-event 'last-input-char)
   (defvaralias 'vhdl-last-input-event 'last-input-event))
 
-;; `help-print-return-message' changed to `print-help-return-message' in Emacs
-;;;(unless (fboundp 'help-print-return-message)
-;;;  (defalias 'help-print-return-message 'print-help-return-message))
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Compatibility with older VHDL Mode versions
 
diff --git a/lisp/progmodes/xscheme.el b/lisp/progmodes/xscheme.el
index 8dfb3a40dd..c6997862f7 100644
--- a/lisp/progmodes/xscheme.el
+++ b/lisp/progmodes/xscheme.el
@@ -446,8 +446,6 @@ xscheme-enter-interaction-mode
 	    (scheme-interaction-mode-initialize)
 	    (scheme-interaction-mode t)))))
 
-(define-obsolete-function-alias 'advertised-xscheme-send-previous-expression
-  'xscheme-send-previous-expression "23.2")
 \f
 ;;;; Debugger Mode
 
diff --git a/lisp/simple.el b/lisp/simple.el
index 1cb93c5722..5a8816c8d6 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -5052,7 +5052,8 @@ append-next-kill
 
 The argument is used for internal purposes; do not supply one."
   (interactive "p")
-  ;; We don't use (interactive-p), since that breaks kbd macros.
+  ;; We don't use (called-interactively-p 'interactive), since that
+  ;; breaks kbd macros.
   (if interactive
       (progn
 	(setq this-command 'kill-region)
@@ -6114,8 +6115,6 @@ pop-mark
     (pop mark-ring))
   (deactivate-mark))
 
-(define-obsolete-function-alias
-  'exchange-dot-and-mark 'exchange-point-and-mark "23.3")
 (defun exchange-point-and-mark (&optional arg)
   "Put the mark where point is now, and point where the mark is now.
 This command works even when the mark is not active,
@@ -8400,18 +8399,6 @@ completion-list-insert-choice-function
 between BEG and END with TEXT.  Expected to be set buffer-locally
 in the *Completions* buffer.")
 
-(defvar completion-base-size nil
-  "Number of chars before point not involved in completion.
-This is a local variable in the completion list buffer.
-It refers to the chars in the minibuffer if completing in the
-minibuffer, or in `completion-reference-buffer' otherwise.
-Only characters in the field at point are included.
-
-If nil, Emacs determines which part of the tail end of the
-buffer's text is involved in completion by comparing the text
-directly.")
-(make-obsolete-variable 'completion-base-size 'completion-base-position "23.2")
-
 (defun delete-completion-window ()
   "Delete the completion list window.
 Go to the window from which completion was requested."
@@ -8465,7 +8452,6 @@ choose-completion
   (run-hooks 'mouse-leave-buffer-hook)
   (with-current-buffer (window-buffer (posn-window (event-start event)))
     (let ((buffer completion-reference-buffer)
-          (base-size completion-base-size)
           (base-position completion-base-position)
           (insert-function completion-list-insert-choice-function)
           (choice
@@ -8492,10 +8478,6 @@ choose-completion
         (choose-completion-string
          choice buffer
          (or base-position
-             (when base-size
-               ;; Someone's using old completion code that doesn't know
-               ;; about base-position yet.
-               (list (+ base-size (field-beginning))))
              ;; If all else fails, just guess.
              (list (choose-completion-guess-base-position choice)))
          insert-function)))))
@@ -8523,10 +8505,6 @@ choose-completion-guess-base-position
         (forward-char 1))
       (point))))
 
-(defun choose-completion-delete-max-match (string)
-  (declare (obsolete choose-completion-guess-base-position "23.2"))
-  (delete-region (choose-completion-guess-base-position string) (point)))
-
 (defvar choose-completion-string-functions nil
   "Functions that may override the normal insertion of a completion choice.
 These functions are called in order with three arguments:
@@ -8555,13 +8533,6 @@ choose-completion-string
   ;; unless it is reading a file name and CHOICE is a directory,
   ;; or completion-no-auto-exit is non-nil.
 
-  ;; Some older code may call us passing `base-size' instead of
-  ;; `base-position'.  It's difficult to make any use of `base-size',
-  ;; so we just ignore it.
-  (unless (consp base-position)
-    (message "Obsolete `base-size' passed to choose-completion-string")
-    (setq base-position nil))
-
   (let* ((buffer (or buffer completion-reference-buffer))
 	 (mini-p (minibufferp buffer)))
     ;; If BUFFER is a minibuffer, barf unless it's the currently
@@ -8617,8 +8588,7 @@ completion-list-mode
  to select the completion near point.
 Or click to select one with the mouse.
 
-\\{completion-list-mode-map}"
-  (set (make-local-variable 'completion-base-size) nil))
+\\{completion-list-mode-map}")
 
 (defun completion-list-mode-finish ()
   "Finish setup of the completions buffer.
@@ -8655,14 +8625,11 @@ completion-setup-function
           (if minibuffer-completing-file-name
               (file-name-as-directory
                (expand-file-name
-                (buffer-substring (minibuffer-prompt-end)
-                                  (- (point) (or completion-base-size 0))))))))
+                (buffer-substring (minibuffer-prompt-end) (point)))))))
     (with-current-buffer standard-output
-      (let ((base-size completion-base-size) ;Read before killing localvars.
-            (base-position completion-base-position)
+      (let ((base-position completion-base-position)
             (insert-fun completion-list-insert-choice-function))
         (completion-list-mode)
-        (set (make-local-variable 'completion-base-size) base-size)
         (set (make-local-variable 'completion-base-position) base-position)
         (set (make-local-variable 'completion-list-insert-choice-function)
 	     insert-fun))
diff --git a/lisp/subr.el b/lisp/subr.el
index 8eb4cf452d..f86d0e00f4 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -4669,13 +4669,6 @@ do-after-load-evaluation
   ;; Finally, run any other hook.
   (run-hook-with-args 'after-load-functions abs-file))
 
-(defun eval-next-after-load (file)
-  "Read the following input sexp, and run it whenever FILE is loaded.
-This makes or adds to an entry on `after-load-alist'.
-FILE should be the name of a library, with no directory name."
-  (declare (obsolete eval-after-load "23.2"))
-  (eval-after-load file (read)))
-
 \f
 (defun display-delayed-warnings ()
   "Display delayed warnings from `delayed-warnings-list'.
@@ -5135,29 +5128,6 @@ called-interactively-p
                    . ,_))
          t)))))
 
-(defun interactive-p ()
-  "Return t if the containing function was run directly by user input.
-This means that the function was called with `call-interactively'
-\(which includes being called as the binding of a key)
-and input is currently coming from the keyboard (not a keyboard macro),
-and Emacs is not running in batch mode (`noninteractive' is nil).
-
-The only known proper use of `interactive-p' is in deciding whether to
-display a helpful message, or how to display it.  If you're thinking
-of using it for any other purpose, it is quite likely that you're
-making a mistake.  Think: what do you want to do when the command is
-called from a keyboard macro or in batch mode?
-
-To test whether your function was called with `call-interactively',
-either (i) add an extra optional argument and give it an `interactive'
-spec that specifies non-nil unconditionally (such as \"p\"); or (ii)
-use `called-interactively-p'.
-
-To test whether a function can be called interactively, use
-`commandp'."
-  (declare (obsolete called-interactively-p "23.2"))
-  (called-interactively-p 'interactive))
-
 (defun internal-push-keymap (keymap symbol)
   (let ((map (symbol-value symbol)))
     (unless (memq keymap map)
diff --git a/lisp/term.el b/lisp/term.el
index 149405fa41..40c8481fdf 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -4102,53 +4102,6 @@ term-replace-by-expanded-filename
   (term-dynamic-complete-filename))
 
 
-(defun term-dynamic-simple-complete (stub candidates)
-  "Dynamically complete STUB from CANDIDATES list.
-This function inserts completion characters at point by completing STUB from
-the strings in CANDIDATES.  A completions listing may be shown in a help buffer
-if completion is ambiguous.
-
-Returns nil if no completion was inserted.
-Returns `sole' if completed with the only completion match.
-Returns `shortest' if completed with the shortest of the completion matches.
-Returns `partial' if completed as far as possible with the completion matches.
-Returns `listed' if a completion listing was shown.
-
-See also `term-dynamic-complete-filename'."
-  (declare (obsolete completion-in-region "23.2"))
-  (let* ((completion-ignore-case nil)
-	 (completions (all-completions stub candidates)))
-    (cond ((null completions)
- 	   (message "No completions of %s" stub)
-	   nil)
- 	  ((= 1 (length completions))	; Gotcha!
- 	   (let ((completion (car completions)))
- 	     (if (string-equal completion stub)
- 		 (message "Sole completion")
- 	       (insert (substring completion (length stub)))
- 	       (message "Completed"))
-	     (when term-completion-addsuffix (insert " "))
-	     'sole))
- 	  (t				; There's no unique completion.
- 	   (let ((completion (try-completion stub candidates)))
- 	     ;; Insert the longest substring.
- 	     (insert (substring completion (length stub)))
- 	     (cond ((and term-completion-recexact term-completion-addsuffix
- 			 (string-equal stub completion)
- 			 (member completion completions))
- 		    ;; It's not unique, but user wants shortest match.
- 		    (insert " ")
- 		    (message "Completed shortest")
-		    'shortest)
- 		   ((or term-completion-autolist
- 			(string-equal stub completion))
- 		    ;; It's not unique, list possible completions.
- 		    (term-dynamic-list-completions completions)
-		    'listed)
- 		   (t
-		    (message "Partially completed")
-		    'partial)))))))
-
 (defun term-dynamic-list-filename-completions ()
   "List in help buffer possible completions of the filename at point."
   (interactive)
@@ -4178,7 +4131,7 @@ term-dynamic-list-completions
 		 (eq (window-buffer (posn-window (event-start first)))
 		     (get-buffer "*Completions*"))
 		 (memq (key-binding key)
-                       '(mouse-choose-completion choose-completion))))
+                       '(choose-completion))))
 	  ;; If the user does choose-completion with the mouse,
 	  ;; execute the command, then delete the completion window.
 	  (progn
diff --git a/test/manual/cedet/cedet-utests.el b/test/manual/cedet/cedet-utests.el
index 124b49907d..ee6be438dd 100644
--- a/test/manual/cedet/cedet-utests.el
+++ b/test/manual/cedet/cedet-utests.el
@@ -150,7 +150,7 @@ cedet-utest
       ;; Cleanup stray input and events that are in the way.
       ;; Not doing this causes sit-for to not refresh the screen.
       ;; Doing this causes the user to need to press keys more frequently.
-      (when (and (interactive-p) (input-pending-p))
+      (when (and (called-interactively-p 'interactive) (input-pending-p))
 	(if (fboundp 'read-event)
 	    (read-event)
 	  (read-char)))
@@ -497,11 +497,11 @@ pulse-test
 	(error (concat "Pulse test only works on versions of Emacs"
 		       " that support pulsing")))
     ;; Run the tests
-    (when (interactive-p)
+    (when (called-interactively-p 'interactive)
       (message "<Press a key> Pulse one line.")
       (read-char))
     (pulse-momentary-highlight-one-line (point))
-    (when (interactive-p)
+    (when (called-interactively-p 'interactive)
       (message "<Press a key> Pulse a region.")
       (read-char))
     (pulse-momentary-highlight-region (point)
@@ -510,11 +510,11 @@ pulse-test
 					    (forward-char 30)
 					  (error nil))
 					(point)))
-    (when (interactive-p)
+    (when (called-interactively-p 'interactive)
       (message "<Press a key> Pulse line a specific color.")
       (read-char))
     (pulse-momentary-highlight-one-line (point) 'mode-line)
-    (when (interactive-p)
+    (when (called-interactively-p 'interactive)
       (message "<Press a key> Pulse a pre-existing overlay.")
       (read-char))
     (let* ((start (point-at-bol))
@@ -530,7 +530,7 @@ pulse-test
 	  (delete-overlay o)
 	(error "Non-temporary overlay was deleted!"))
       )
-    (when (interactive-p)
+    (when (called-interactively-p 'interactive)
       (message "Done!"))))
 
 (provide 'cedet-utests)
diff --git a/test/manual/cedet/semantic-tests.el b/test/manual/cedet/semantic-tests.el
index 53552be06b..a0899cb932 100644
--- a/test/manual/cedet/semantic-tests.el
+++ b/test/manual/cedet/semantic-tests.el
@@ -235,7 +235,7 @@ semantic-lex-spp-write-utest
       (set-buffer buff)
       (semantic-lex-spp-write-test)
       (kill-buffer buff)
-      (when (not (interactive-p))
+      (when (not (called-interactively-p 'interactive))
         (kill-buffer "*SPP Write Test*"))
       )))
 
@@ -276,7 +276,7 @@ semantic-symref-test-count-hits-in-tag
        target (lambda (start end prefix) (setq Lcount (1+ Lcount)))
        (semantic-tag-start tag)
        (semantic-tag-end tag))
-      (when (interactive-p)
+      (when (called-interactively-p 'interactive)
 	(message "Found %d occurrences of %s in %.2f seconds"
 		 Lcount (semantic-tag-name target)
 		 (semantic-elapsed-time start nil)))
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-14 15:42         ` Stefan Kangas
@ 2020-08-14 18:56           ` Drew Adams
  2020-08-14 19:00             ` Lars Ingebrigtsen
                               ` (3 more replies)
  0 siblings, 4 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-14 18:56 UTC (permalink / raw)
  To: Stefan Kangas, Stefan Monnier, emacs-devel

> I'm attaching a patch to remove most things declared obsolete in 23.2
> and 23.3.  (Nothing was declared obsolete in 23.4 AFAICT.)
> 
> There are still some items obsoleted in 23.x left to delete in Semantic.
> I intend to do that in a separate patch.
> 
> Comments welcome.


PLEASE do not remove `interactive-p'.

I have over 2500 lines that use `interactive-p'.

Is there some problem with keeping its simple
definition as (called-interactively 'interactive)?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-14 18:56           ` Drew Adams
@ 2020-08-14 19:00             ` Lars Ingebrigtsen
  2020-08-14 19:14               ` Drew Adams
  2020-08-14 19:55             ` Ulrich Mueller
                               ` (2 subsequent siblings)
  3 siblings, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-14 19:00 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, Stefan Kangas, Stefan Monnier

Drew Adams <drew.adams@oracle.com> writes:

> PLEASE do not remove `interactive-p'.
>
> I have over 2500 lines that use `interactive-p'.
>
> Is there some problem with keeping its simple
> definition as (called-interactively 'interactive)?

Is there some problem with you adding your own interactive-p if you want
to use that name instead?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-14 19:00             ` Lars Ingebrigtsen
@ 2020-08-14 19:14               ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-14 19:14 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: emacs-devel, Stefan Kangas, Stefan Monnier

> > Is there some problem with keeping its simple
> > definition as (called-interactively 'interactive)?
> 
> Is there some problem with you adding your own interactive-p
> if you want to use that name instead?

Is there some problem with Emacs keeping the existing
simple definition of `interactive-p'?

(defun interactive-p () (called-interactively-p 'interactive))

What's the problem with that?

With that longstanding definition _in Emacs_, no one
needs to define it in a million files or create a
file for it and require that file everywhere.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-14 18:56           ` Drew Adams
  2020-08-14 19:00             ` Lars Ingebrigtsen
@ 2020-08-14 19:55             ` Ulrich Mueller
  2020-08-14 23:37             ` Stefan Kangas
  2020-08-18 11:17             ` Lars Ingebrigtsen
  3 siblings, 0 replies; 838+ messages in thread
From: Ulrich Mueller @ 2020-08-14 19:55 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, Stefan Kangas, Stefan Monnier

>>>>> On Fri, 14 Aug 2020, Drew Adams wrote:

>> I'm attaching a patch to remove most things declared obsolete in 23.2
>> and 23.3.  (Nothing was declared obsolete in 23.4 AFAICT.)
>> 
>> There are still some items obsoleted in 23.x left to delete in Semantic.
>> I intend to do that in a separate patch.
>> 
>> Comments welcome.

> PLEASE do not remove `interactive-p'.

> I have over 2500 lines that use `interactive-p'.

> Is there some problem with keeping its simple
> definition as (called-interactively 'interactive)?

I second this.

Removal of interactive-p would unnecessarily break many third-party
elisp libraries, while keeping the backwards compatible definition in
Emacs requires only a single line.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-14 18:56           ` Drew Adams
  2020-08-14 19:00             ` Lars Ingebrigtsen
  2020-08-14 19:55             ` Ulrich Mueller
@ 2020-08-14 23:37             ` Stefan Kangas
  2020-08-15  1:28               ` Drew Adams
  2020-08-18 11:17             ` Lars Ingebrigtsen
  3 siblings, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-08-14 23:37 UTC (permalink / raw)
  To: Drew Adams, Stefan Monnier, emacs-devel

> PLEASE do not remove `interactive-p'.

This has been declared obsolete for a decade now.

Author: Stefan Monnier <monnier@iro.umontreal.ca>
Date:   Thu Oct 1 17:47:38 2009 +0000

    * eval.c (Fcalled_interactively_p): Add `kind' argument.
    * subr.el (interactive-p): Mark obsolete.

It has been discussed before:
https://lists.gnu.org/archive/html/emacs-devel/2015-07/msg00326.html

And here:
https://lists.gnu.org/archive/html/emacs-devel/2015-11/msg01740.html

(I'm sure there are other threads that I couldn't find, if so please
link them.)

> I have over 2500 lines that use `interactive-p'.

Yet once we obsolete something, there surely has to come a point when we
can finally delete it.

Emacs is already extremely conservative when it comes to dropping
backwards support.  AFAICT, we generally don't delete anything until
five major releases after it was first obsoleted.

Best regards,
Stefan Kangas



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-14 23:37             ` Stefan Kangas
@ 2020-08-15  1:28               ` Drew Adams
  2020-08-15 12:51                 ` Stefan Monnier
  2020-08-16  4:13                 ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-15  1:28 UTC (permalink / raw)
  To: Stefan Kangas, Stefan Monnier, emacs-devel

There's no obligation, or any good reason, to
remove it.  Just leave it "obsolete", please.
It's not hurting anyone.  You're not really
helping anyone by removing it.

To repeat the (unanswered) question:

> > > Is there some problem with keeping its simple
> > > definition as (called-interactively 'interactive)?
> > 
> > Is there some problem with you adding your own
> > interactive-p if you want to use that name instead?
>
> Is there some problem with Emacs keeping the
> existing simple definition of `interactive-p'?
>
> (defun interactive-p () (called-interactively-p 'interactive))
>
> What's the problem with that?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-15  1:28               ` Drew Adams
@ 2020-08-15 12:51                 ` Stefan Monnier
  2020-08-15 19:54                   ` Drew Adams
  2020-08-16  4:13                 ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-08-15 12:51 UTC (permalink / raw)
  To: Drew Adams; +Cc: Stefan Kangas, emacs-devel

> There's no obligation, or any good reason, to remove it.

Actually, `interactive-p` is harmful, so you should remove as many uses
of it as you can.  `called-interactive-p` is not a good replacement
for it.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-15 12:51                 ` Stefan Monnier
@ 2020-08-15 19:54                   ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-15 19:54 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Stefan Kangas, emacs-devel

> > There's no obligation, or any good reason, to remove it.
> 
> Actually, `interactive-p` is harmful, so you should remove as many uses
> of it as you can.  `called-interactive-p` is not a good replacement
> for it.

It's not harming me.  Removing it will.

Emacs allows (called-interactively-p 'interactive).
It should also allow (interactive-p) which does the
same thing.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-15  1:28               ` Drew Adams
  2020-08-15 12:51                 ` Stefan Monnier
@ 2020-08-16  4:13                 ` Richard Stallman
  2020-08-16  5:30                   ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-08-16  4:13 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, stefankangas, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

ISTR that we declared interactive-p obsolete because it is an not a
correct solution to the problem it is meant to solve.
The correct solution is to give the function an optional argument
and an interactive spec which provides a non-nil value for that argument
in interactive calls.

There are cases where that gives the right answer,
while interactive-p gives the wrong answer.

The point is, you really should change each of those functions
so that it will not misbehave in those special situations.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-16  4:13                 ` Richard Stallman
@ 2020-08-16  5:30                   ` Drew Adams
  2020-08-16 13:46                     ` Stefan Monnier
  2020-08-17  3:23                     ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-16  5:30 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel, stefankangas, monnier

> ISTR that we declared interactive-p obsolete because it is an not a
> correct solution to the problem it is meant to solve.

Then neither is (called-interactively-p 'interactive).
Goose ... gander.

> The correct solution is to give the function an optional argument
> and an interactive spec which provides a non-nil value for that argument
> in interactive calls.

I already do that where it makes sense (e.g. to
show a message).  And that lesson is given in the
doc string of `called-interactively-p' (which is
_not_ obsolete, let alone being removed).

> There are cases where that gives the right answer,
> while interactive-p gives the wrong answer.

`called-interactively-p' is just as brittle as
`interactive-p' - see its doc string.

The main difference is for keyboard-macro use -
(called-interactively-p 'any) versus
(called-interactively-p 'interactive).

> The point is, you really should change each of those functions
> so that it will not misbehave in those special situations.

My code is backward-compatible, and there's too
much of it to want to change to

(if (fboundp 'called-interactively-p)
    (called-interactively-p 'interactive)
  (interactive-p))

I have no objection to Emacs having declared
`interactive-p' obsolete (well, I kinda do,
but not much, and it's not important at all).

I object to Emacs _removing_ it.  I see no reason
for that.  And no one has given a reason, so far.

Everything said against `interactive-p' so far is
true also of (called-interactively-p 'interactive).
Emacs allows the latter - it's not obsolete.  Emacs
should continue to allow (interactive-p), which is
_identical_.

As far as I'm concerned, Emacs can feel free to
continue to call `interactive-p' names.  Shout
from the rooftops that it's awful, evil, stupid,
obsolete, whatever.  Doesn't bother me.  What
bothers me is removing it.  Sticks & stones...

I didn't complain about the other removals being
made, BTW.

I didn't complain that `buffer-menu-mode-hook' was
deprecated in favor of the same with capital `B',
or that the former is now being removed.  Likewise,
for deprecating (and now removing)
`print-help-return-message' in favor of
`help-print-return-message'.  Lots of obsolete
things are being removed now, with no complaint
from me, although I had to make code adjustments.

`interactive-p' is used much more than the others.

(Mea culpa: I said I had 2500 occurrences of
`interactive-p'.  I actually have 406 occurrences.
A first grep included extraneous test files etc.)

Nothing is gained by removing `interactive-p'.
No one has been able to point out any gain.  Only
pain, no gain.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-16  5:30                   ` Drew Adams
@ 2020-08-16 13:46                     ` Stefan Monnier
  2020-08-17  3:23                     ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-08-16 13:46 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, rms, stefankangas

>> The correct solution is to give the function an optional argument
>> and an interactive spec which provides a non-nil value for that argument
>> in interactive calls.
> I already do that where it makes sense (e.g. to show a message).

I think you misunderstand: it makes sense everywhere where it
technically *can* be used.

There are still circumstances where `called-interactively-p` is
necessary (typically in cases where the arglist cannot be extended with
a new argument (mostly because it already uses `&rest`), or in advice),
but it's rare.

> I have no objection to Emacs having declared `interactive-p' obsolete
> (well, I kinda do, but not much, and it's not important at all).
>
> I object to Emacs _removing_ it.  I see no reason for that.  And no
> one has given a reason, so far.

You know the reason: because it's obsolete and deprecated.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-16  5:30                   ` Drew Adams
  2020-08-16 13:46                     ` Stefan Monnier
@ 2020-08-17  3:23                     ` Richard Stallman
  2020-08-17 14:20                       ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-08-17  3:23 UTC (permalink / raw)
  To: Drew Adams; +Cc: stefankangas, monnier, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

I think we are miscommunicating.  You seem to be talking about
called-interactively-p.  I am talking about making your function take
an optional argument.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-17  3:23                     ` Richard Stallman
@ 2020-08-17 14:20                       ` Drew Adams
  2020-08-17 14:45                         ` Gregory Heytings via Emacs development discussions.
                                           ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-17 14:20 UTC (permalink / raw)
  To: rms; +Cc: stefankangas, monnier, emacs-devel

> I think we are miscommunicating.  You seem to be talking about
> called-interactively-p.  I am talking about making your function take
> an optional argument.

What "your function" are you talking about?
This is about the standard Emacs function
`interactive-p'.

What optional argument would you have it take,
and why?  And how would that solve the problem
of existing calls to `(interactive-p)'?

But yes, it does sound like we've perhaps
miscommunicated.

`interactive-p' has existed since nearly Day
One.  `called-interactively-p' was introduced
to replace/"fix" it - presumably instead of
fixing it directly by adding an optional arg
and leaving the default behavior (no arg) as is.

And `interactive-p' was declared obsolete.
I have no problem with that declaration, even
if I'd have preferred to see `interactive-p'
fixed directly (previous paragraph).

My only request is to not remove `interactive-p'.
My request is to please leave it "obsolete".



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-17 14:20                       ` Drew Adams
@ 2020-08-17 14:45                         ` Gregory Heytings via Emacs development discussions.
  2020-08-18  1:55                         ` Jeff Norden
  2020-08-18  4:06                         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-08-17 14:45 UTC (permalink / raw)
  To: emacs-devel


Drew Adams:
>
> My only request is to not remove `interactive-p'.
> My request is to please leave it "obsolete".
>

Perhaps I'm misunderstanding something, but I don't even understand why it 
is marked "obsolete".  If (called-interactively-p 'interactive) is a 
common idiom (and it seems to be, the docstring of called-interactively-p 
indicates that "the only known proper use of 'interactive' for KIND is in 
deciding whether to display a helpful message, or how to display it."), it 
would make perfect sense to have, in subr.el:

(defun interactive-p ()
   "Shorthand for (called-interactively-p 'interactive).
See `called-interactively-p'."
   (called-interactively-p 'interactive))

Unless of course there is a long-term goal to replace "interactive-p" with 
some other definition.

Gregory



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-17 14:20                       ` Drew Adams
  2020-08-17 14:45                         ` Gregory Heytings via Emacs development discussions.
@ 2020-08-18  1:55                         ` Jeff Norden
  2020-08-18  4:53                           ` Eli Zaretskii
  2020-08-18 16:14                           ` Drew Adams
  2020-08-18  4:06                         ` Richard Stallman
  2 siblings, 2 replies; 838+ messages in thread
From: Jeff Norden @ 2020-08-18  1:55 UTC (permalink / raw)
  To: Drew Adams; +Cc: ghe, stefankangas, rms, monnier, emacs-devel

Drew Adams wrote:
> My only request is to not remove `interactive-p'.
> My request is to please leave it "obsolete".

The elisp manual says:

    You can mark a named function as "obsolete", meaning that it may be
    removed at some point in the future.  This causes Emacs to warn that the
    function is obsolete whenever it byte-compiles code containing that
    function, and whenever it displays the documentation for that function.
    In all other respects, an obsolete function behaves like any other
    function.

The phrase "may be removed" seems a bit vague.  Would "will be removed" or
"will probably be removed" be more accurate?

If so, perhaps it would help for obsolete functions and variables to also
include something like a 'target-expiration-date', which could be a release
number rather than an actual date.  A target-expiration of "31.1" would mean
that the current intent is that the function/variable will no longer exist
when version 31.1 is released.  The chromium project does something similar
for its experimental "flags" that can be used to customize the user interface.

From where I sit, it seems plausible that someone might view interactive-p
as just an obsolete way of writing (called-interactively-p 'interactive),
which exists for backward compatibility, and would be available long term.
It seems that the last part is a mis-interpretation of the intent of marking
it as obsolete.

The fact that emacs maintains backward compatibility so well is one of the
features that I appreciate the most.  But, in this case, the fact that
interactive-p has been obsolete for so long may give the impression that it
would continue to be available.  I can see arguments on both sides of the coin
for why interactive-p should or should not continue to exist.  If the
underlying fact is that virtually all functions marked as obsolete will
eventually be removed, then this should be made clear (or more clear
than it currently seems to be).  Then the issue of whether or not
something should be marked as obsolete would have a better focus.

Also, it might be worthwhile for the elisp manual to mention one other
difference that obsolete functions have.  When an interactive command is
obsolete, it no longer appears as a possible completion when you press
[tab] while entering a command-name after M-x.

Regards,
-Jeff



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-17 14:20                       ` Drew Adams
  2020-08-17 14:45                         ` Gregory Heytings via Emacs development discussions.
  2020-08-18  1:55                         ` Jeff Norden
@ 2020-08-18  4:06                         ` Richard Stallman
  2020-08-18 16:13                           ` Drew Adams
  2 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-08-18  4:06 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, stefankangas, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > I think we are miscommunicating.  You seem to be talking about
  > > called-interactively-p.  I am talking about making your function take
  > > an optional argument.

  > What "your function" are you talking about?

The function which calls `interactive-p'.
It's in your code, right?  So I refer to it as yours.

You should change that function to have an additional optional
argument and use `interactive' to silently supply a non-nil value for
it when it gets called interactively.  Then use that argument
instead of calling `interactive-p'.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-18  1:55                         ` Jeff Norden
@ 2020-08-18  4:53                           ` Eli Zaretskii
  2020-08-19  8:31                             ` Gregory Heytings via Emacs development discussions.
  2020-08-18 16:14                           ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2020-08-18  4:53 UTC (permalink / raw)
  To: Jeff Norden; +Cc: rms, emacs-devel, monnier, ghe, drew.adams, stefankangas

> From: Jeff Norden <jnorden@tntech.edu>
> Date: Mon, 17 Aug 2020 20:55:56 -0500
> Cc: ghe@sdf.org, stefankangas@gmail.com, rms@gnu.org, monnier@iro.umontreal.ca,
>  emacs-devel@gnu.org
> 
> The elisp manual says:
> 
>     You can mark a named function as "obsolete", meaning that it may be
>     removed at some point in the future.  This causes Emacs to warn that the
>     function is obsolete whenever it byte-compiles code containing that
>     function, and whenever it displays the documentation for that function.
>     In all other respects, an obsolete function behaves like any other
>     function.
> 
> The phrase "may be removed" seems a bit vague.  Would "will be removed" or
> "will probably be removed" be more accurate?

No, it won't.  Primarily because we don't really know whether we will
remove it, let alone when.  It depends on too many factors that we
cannot predict.

> The fact that emacs maintains backward compatibility so well is one of the
> features that I appreciate the most.  But, in this case, the fact that
> interactive-p has been obsolete for so long may give the impression that it
> would continue to be available.

I think the gentle annoyance we have now strikes the right balance
between not letting people forget the fact of obsolescence and not
annoying them too much.  We are talking to adults, not to children, so
we can rely on them doing TRT.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-14 18:56           ` Drew Adams
                               ` (2 preceding siblings ...)
  2020-08-14 23:37             ` Stefan Kangas
@ 2020-08-18 11:17             ` Lars Ingebrigtsen
  2020-08-24  2:28               ` Stefan Kangas
  3 siblings, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-08-18 11:17 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel, Stefan Kangas, Stefan Monnier

Drew Adams <drew.adams@oracle.com> writes:

>> I'm attaching a patch to remove most things declared obsolete in 23.2
>> and 23.3.  (Nothing was declared obsolete in 23.4 AFAICT.)
>> 
>> There are still some items obsoleted in 23.x left to delete in Semantic.
>> I intend to do that in a separate patch.
>> 
>> Comments welcome.
>
> PLEASE do not remove `interactive-p'.

Emacs does have to move on and eventually remove stuff that we've
deprecated, and that's fine for most things.

But thinking about this a bit more, I agree with Drew here --
interactive-p is used too much in the wild for us to ever delete it.  It
should stay marked as obsolete, but with a comment saying "never delete"
or something, because removing it will break too much code out there.

For a perspective on deprecation (which mentions Emacs :-)), this is a
pretty entertaining read:

https://medium.com/@steve.yegge/dear-google-cloud-your-deprecation-policy-is-killing-you-ee7525dc05dc

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
       [not found] ` <<83r1s4ftc7.fsf@gnu.org>
@ 2020-08-18 16:13   ` Drew Adams
  2020-08-18 19:27     ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-08-18 16:13 UTC (permalink / raw)
  To: Eli Zaretskii, Jeff Norden
  Cc: rms, emacs-devel, monnier, ghe, drew.adams, stefankangas

> I think the gentle annoyance we have now strikes the right balance
> between not letting people forget the fact of obsolescence and not
> annoying them too much.  We are talking to adults, not to children, so
> we can rely on them doing TRT.

+1.  It's obsolete, but we leave it in the product,
so as to not annoy those who don't, or can't easily,
work around its absence.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-18  4:06                         ` Richard Stallman
@ 2020-08-18 16:13                           ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-18 16:13 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel, stefankangas, monnier

> You should change that function to have an additional optional
> argument and use `interactive' to silently supply a non-nil value for
> it when it gets called interactively.  Then use that argument
> instead of calling `interactive-p'.

I already addressed that "should".

Emacs "should" just leave `interactive-p' alone.
It's not hurting anyone.  It can't hurt any more
than (called-interactively 'interactive) hurts,
which is the exact same thing.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-18  1:55                         ` Jeff Norden
  2020-08-18  4:53                           ` Eli Zaretskii
@ 2020-08-18 16:14                           ` Drew Adams
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-18 16:14 UTC (permalink / raw)
  To: Jeff Norden; +Cc: ghe, stefankangas, rms, monnier, emacs-devel

> > My only request is to not remove `interactive-p'.
> > My request is to please leave it "obsolete".
> 
> The elisp manual says:
> 
>     You can mark a named function as "obsolete", meaning that it may be
>     removed at some point in the future.  This causes Emacs to warn that the
>     function is obsolete whenever it byte-compiles code containing that
>     function, and whenever it displays the documentation for that function.
>     In all other respects, an obsolete function behaves like any other
>     function.
> 
> The phrase "may be removed" seems a bit vague.  Would "will be removed" or
> "will probably be removed" be more accurate?

Not in my opinion.  I mean that shouldn't be what
we mean by "obsolete" or "deprecated".  Normally
it means just what the text says: there's no
guarantee that it won't be removed.

In general (e.g. outside Emacs), there's no
obligation to ever remove something that's been
deprecated (is obsolete).

In general, something that's deprecated is still
supported.  But it is not under active development,
and there may not be a lot of energy spent on
fixing its bugs.

> From where I sit, it seems plausible that someone might view interactive-p
> as just an obsolete way of writing (called-interactively-p 'interactive),
> which exists for backward compatibility, and would be available long term.
> It seems that the last part is a mis-interpretation of the intent of marking
> it as obsolete.

That's exactly the interpretation I'm looking
for.  I don't care that it's deprecated, as long
as it's still there.

> The fact that emacs maintains backward compatibility so well is one of the
> features that I appreciate the most.

Indeed.

https://medium.com/@steve.yegge/dear-google-cloud-your-deprecation-policy-is-killing-you-ee7525dc05dc

> But, in this case, the fact that interactive-p
> has been obsolete for so long may give the
> impression that it would continue to be available.

I don't care about either possible impression.

I'm saying it makes sense to leave it alone.
There's no reason to remove it.  (And no reason
has yet been given.)  "It's obsolete" is not a
reason to remove it.

We're not removing
(called-interactively-p 'interactive).
Why not?

> If the underlying fact is that virtually
> all functions marked as obsolete will
> eventually be removed

Not a fact.  Not in my book, anyway.  And
certainly not in the world outside Emacs.

(Unless by "eventually" you include the
disappearance of the planet or sun. ;-))
 
> Also, it might be worthwhile for the elisp manual to mention one other
> difference that obsolete functions have.  When an interactive command is
> obsolete, it no longer appears as a possible completion when you press
> [tab] while entering a command-name after M-x.

That's not true either.  Perhaps you're
suggesting that such behavior should be
implemented?  (FWIW, my opinion is no.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-18 16:13   ` Delete variables obsolete since Emacs 23 Drew Adams
@ 2020-08-18 19:27     ` Stefan Monnier
  2020-08-18 20:21       ` Drew Adams
                         ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-08-18 19:27 UTC (permalink / raw)
  To: Drew Adams
  Cc: rms, Jeff Norden, emacs-devel, stefankangas, ghe, Eli Zaretskii

>> I think the gentle annoyance we have now strikes the right balance
>> between not letting people forget the fact of obsolescence and not
>> annoying them too much.  We are talking to adults, not to children, so
>> we can rely on them doing TRT.
> +1.  It's obsolete, but we leave it in the product,

That is not what he said.

> so as to not annoy those who don't, or can't easily,
> work around its absence.

If there's no intention to remove it in the future, then we don't
declare it obsolete.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-18 19:27     ` Stefan Monnier
@ 2020-08-18 20:21       ` Drew Adams
  2020-08-18 21:00       ` Gregory Heytings via Emacs development discussions.
  2020-08-18 21:30       ` Jeff Norden
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-18 20:21 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: rms, Jeff Norden, emacs-devel, stefankangas, ghe, Eli Zaretskii

> >> I think the gentle annoyance we have now strikes the right balance
> >> between not letting people forget the fact of obsolescence and not
> >> annoying them too much.  We are talking to adults, not to children, so
> >> we can rely on them doing TRT.
> >
> > +1.  It's obsolete, but we leave it in the product,
> 
> That is not what he said.

Eli can weigh in on whether it is or isn't.

Isn't that exactly what "we have now": declaration
of obsolescence, without removal?

That's what I understood by "the gentle annoyance
we have now".

And I agree that that "strikes the right balance"
by (1) reminding about obsolescence and (2) not
annoying too much.

> > so as to not annoy those who don't, or can't
> > easily, work around its absence.
> 
> If there's no intention to remove it in the future,
> then we don't declare it obsolete.

Is that written on the foundation stone of GNU
Emacs somewhere?

That's not how deprecation/obsolescence is viewed
in general, e.g. outside Emacs.

Something is deprecated or declared obsolete
because we no longer want to commit to its active
development, for WHATEVER reason (and the reasons
can be several).

Often, that's because some other, better thing
replaces it, but that's not a requirement.

Not wanting to commit to active development (e.g.
improvement, new features) is not the same thing
as an intention to remove.  I think you have a
very (unnecessarily) strong view of deprecation.

One of the main ideas behind deprecation is to
NOT tie your hands wrt future decisions.  All
that's decided is, so far, to not develop the
thing further.

The message to users is (1) the thing is still
supported (it's not removed), but only AS IS, so
(2) don't expect further development.

Removing something is what's normally called
"desupport": XYZ is no longer supported.  Trying
to use it raises an error, or is ignored (no-op),
etc.

You _cannot_ use something that's _desupported_.
You're advised/warned that you might not want to
use something that's deprecated.

Even for commercial software, there are quite
often features that are deprecated with NO
intention to _ever_ remove them.  Why?  Because
of an existing customer base, with legacy code.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-18 19:27     ` Stefan Monnier
  2020-08-18 20:21       ` Drew Adams
@ 2020-08-18 21:00       ` Gregory Heytings via Emacs development discussions.
  2020-08-18 21:55         ` Stefan Monnier
  2020-08-18 21:30       ` Jeff Norden
  2 siblings, 1 reply; 838+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-08-18 21:00 UTC (permalink / raw)
  To: emacs-devel


>
>> so as to not annoy those who don't, or can't easily, work around its 
>> absence.
>
> If there's no intention to remove it in the future, then we don't 
> declare it obsolete.
>

I think the discussion is too broad.  It depends on what is declared 
obsolete.

If it's a whole package, or a complex function, declaring that it is 
obsolete means that it won't be developed or supported in the future, and 
that because of this it might become non-functional at some point because 
the conditions it assumes will not hold anymore.  At that moment there is 
a good reason to remove it: it does not work anymore.

If on the contrary it's a function as trivial as

(defun interactive-p () (called-interactively-p 'interactive))

then declaring that it is obsolete means that new code should preferably 
use the new style.  But there is no reason to remove it.

Gregory



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-18 19:27     ` Stefan Monnier
  2020-08-18 20:21       ` Drew Adams
  2020-08-18 21:00       ` Gregory Heytings via Emacs development discussions.
@ 2020-08-18 21:30       ` Jeff Norden
  2 siblings, 0 replies; 838+ messages in thread
From: Jeff Norden @ 2020-08-18 21:30 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: rms, emacs-devel, stefankangas, ghe, eliz, drew.adams

I said:
>> The elisp manual says:
>>     You can mark a named function as "obsolete", meaning that it may be
>>     removed at some point in the future.  This causes Emacs ...
>> The phrase "may be removed" seems a bit vague.  Would "will be removed" or
>> "will probably be removed" be more accurate?

To which Eli Zaretskii replied:
> No, it won't.  Primarily because we don't really know whether we will
> remove it, let alone when.  It depends on too many factors that we
> cannot predict.

But then Stefan Monnier wrote:
> If there's no intention to remove it in the future, then we don't
> declare it obsolete.

I really like the use of 'obsolete' instead of 'deprecate'.
Merriam-Webster gives a two-part definition:
   Definition of obsolete:
     1 a: no longer in use or no longer useful
       b: of a kind or style no longer current : OLD-FASHIONED

I personally think that there is a case for keeping a limited number of
obsolete functions/variables long term, for backward compatibility.
You can apply definition (b) to these, although it's not a perfect fit,
since obsolete functions shouldn't be used in new code.

Windows still supports 8.3 file names (a horrible example, since they
never should have been created in the first place).  My pickup truck
still uses a carburetor, which was certainly made obsolete by fuel
injection, but still works fine for me.  Of course, obsolete features
won't be maintained, updated, etc.  (My local parts stores no longer
stock an air filter that fits my truck.)

But, if a function or variable fits (a), and is really no longer used or
useful, then it only make sense to remove it.

It may not be possible or practical to precisely label each obsolete
emacs item with a category.  But, it would be good to be clear as to
whether or not (make-obsolete) should be regarded as including both
possible cases.

Thanks,
-Jeff



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-18 21:00       ` Gregory Heytings via Emacs development discussions.
@ 2020-08-18 21:55         ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-08-18 21:55 UTC (permalink / raw)
  To: Gregory Heytings via Emacs development discussions.; +Cc: Gregory Heytings

> I think the discussion is too broad.  It depends on what is
> declared obsolete.

IMNSHO it doesn't: if we don't intend to remove it ever, then we don't
declare it obsolete.

Of course, declaring it obsolete doesn't guarantee that we will remove
it: it's just a declaration of intention.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-18  4:53                           ` Eli Zaretskii
@ 2020-08-19  8:31                             ` Gregory Heytings via Emacs development discussions.
  2020-08-19 13:26                               ` Drew Adams
                                                 ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-08-19  8:31 UTC (permalink / raw)
  To: emacs-devel


>>> The elisp manual says:
>>>
>>> You can mark a named function as "obsolete", meaning that it may be 
>>> removed at some point in the future.  This causes Emacs to warn that 
>>> the function is obsolete whenever it byte-compiles code containing 
>>> that function, and whenever it displays the documentation for that 
>>> function. In all other respects, an obsolete function behaves like any 
>>> other function.
>>
>> The phrase "may be removed" seems a bit vague.  Would "will be removed" 
>> or "will probably be removed" be more accurate?
>
> No, it won't.  Primarily because we don't really know whether we will 
> remove it, let alone when.  It depends on too many factors that we 
> cannot predict.
>

In that case, would a two-step process not be better?  First declaring the 
function "obsolete", and when it is known that it will be removed declare 
it "pending-removal" with a target major version.

Gregory



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-19  8:31                             ` Gregory Heytings via Emacs development discussions.
@ 2020-08-19 13:26                               ` Drew Adams
  2020-08-19 13:39                               ` Stefan Monnier
  2020-08-19 14:36                               ` Eli Zaretskii
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-08-19 13:26 UTC (permalink / raw)
  To: emacs-devel, Gregory Heytings

> >> The phrase "may be removed" seems a bit vague.  Would "will be removed"
> >> or "will probably be removed" be more accurate?
> >
> > No, it won't.  Primarily because we don't really know whether we will
> > remove it, let alone when.  It depends on too many factors that we
> > cannot predict.
> >
> 
> In that case, would a two-step process not be better?  First declaring the
> function "obsolete", and when it is known that it will be removed declare
> it "pending-removal" with a target major version.

In my experience, organizations typically avoid a
lot of commitments to future changes.  Instead, it's
about _no longer_ committing to something that's
currently committed to.  It's about removal of
commitments, not imposition of new commitments.

(Sometimes there's informal/unofficial mention to
some users that it's likely XYZ will be removed
at a specific point.  But even that is generally
avoided.)

Typically there are two possible stages:

1. Deprecation (sometimes calling the thing "obsolete").
   The thing _remains supported_.  There's no longer a
   _commitment_ to active development - that's all.

   Users are told that the thing _might_ be desupported
   at some time in the future.

   Because of the removal of a _commitment_ to actively
   develop AND the removal of a _commitment_ that the
   thing will remain forever, users are advised to
   start moving away from using the thing.

2. Desupport.  This is _optional_.  A deprecated thing
   need never be desupported.  And typically there is
   some (sometimes announced, sometimes not) minimal
   time period or number of intermediate releases,
   needed between deprecation and desupport.

   Something that's desupported gets no support.
   Trying to use it typically results in a no-op or
   raising an error.
___

That's my experience.  YMMV.  And of course nothing
requires GNU Emacs to follow any particular outside
convention or typical behavior.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-19  8:31                             ` Gregory Heytings via Emacs development discussions.
  2020-08-19 13:26                               ` Drew Adams
@ 2020-08-19 13:39                               ` Stefan Monnier
  2020-08-19 13:54                                 ` Gregory Heytings via Emacs development discussions.
  2020-08-19 14:36                               ` Eli Zaretskii
  2 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-08-19 13:39 UTC (permalink / raw)
  To: Gregory Heytings via Emacs development discussions.; +Cc: Gregory Heytings

> In that case, would a two-step process not be better?  First declaring the
> function "obsolete", and when it is known that it will be removed declare 
> it "pending-removal" with a target major version.

I'm not sure it would make much difference to the speed at which people
move away from using the obsolete feature (which is really all that
matters, in the end).

Another approach I toyed with is to change the `make-obsolete*`
functions so that they actually *remove* the obsolete feature when used
in development builds (i.e. builds with version XXX.0.50).
Just like that it's a bit blunt, so it'd have to come with some knobs so
the user can ask to disable this for some particular
funs/vars, and also so it's only applied when the fun/var has been
obsolete for at least 1 (or maybe 2) versions.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-19 13:39                               ` Stefan Monnier
@ 2020-08-19 13:54                                 ` Gregory Heytings via Emacs development discussions.
  2020-08-19 15:15                                   ` Eli Zaretskii
  0 siblings, 1 reply; 838+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-08-19 13:54 UTC (permalink / raw)
  To: emacs-devel


>
>> In that case, would a two-step process not be better?  First declaring 
>> the function "obsolete", and when it is known that it will be removed 
>> declare it "pending-removal" with a target major version.
>
> I'm not sure it would make much difference to the speed at which people 
> move away from using the obsolete feature (which is really all that 
> matters, in the end).
>

FWIW, I think it would.  With the current situation there is no concrete 
reason to move away from such a feature.  As Eli wrote "we don't really 
know whether we will remove [an absolete feature], let alone when", so it 
could very wall stay there forever, and I can understand Drew's viewpoint 
who did not make the effort to update the 2500 lines of his codebase in 
which 'interactive-p' is used.  If he had been warned, when Emacs 25 was 
released, with:

(declare (pending-removal called-interactively-p "27"))

he would have known that it would be removed in a medium term, and would 
have had a reason to update his codebase.

That being said, about this particular feature, I still don't understand 
why it is obsolete.  It is just a way to express a common pattern in a 
shorter way, like say (1+ x) and (+ x 1).

Gregory



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-19  8:31                             ` Gregory Heytings via Emacs development discussions.
  2020-08-19 13:26                               ` Drew Adams
  2020-08-19 13:39                               ` Stefan Monnier
@ 2020-08-19 14:36                               ` Eli Zaretskii
  2 siblings, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2020-08-19 14:36 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: emacs-devel

> Date: Wed, 19 Aug 2020 08:31:55 +0000
> From: Gregory Heytings via "Emacs development discussions." <emacs-devel@gnu.org>
> 
> >> The phrase "may be removed" seems a bit vague.  Would "will be removed" 
> >> or "will probably be removed" be more accurate?
> >
> > No, it won't.  Primarily because we don't really know whether we will 
> > remove it, let alone when.  It depends on too many factors that we 
> > cannot predict.
> 
> In that case, would a two-step process not be better?  First declaring the 
> function "obsolete", and when it is known that it will be removed declare 
> it "pending-removal" with a target major version.

How would it help?  It will definitely complicate our procedures, but
I see no gains.  Do you?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-19 13:54                                 ` Gregory Heytings via Emacs development discussions.
@ 2020-08-19 15:15                                   ` Eli Zaretskii
  2020-08-20  0:33                                     ` Jeff Norden
  0 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2020-08-19 15:15 UTC (permalink / raw)
  To: Gregory Heytings; +Cc: emacs-devel

> Date: Wed, 19 Aug 2020 13:54:50 +0000
> From: Gregory Heytings via "Emacs development discussions." <emacs-devel@gnu.org>
> 
> > I'm not sure it would make much difference to the speed at which people 
> > move away from using the obsolete feature (which is really all that 
> > matters, in the end).
> >
> 
> FWIW, I think it would.  With the current situation there is no concrete 
> reason to move away from such a feature.  As Eli wrote "we don't really 
> know whether we will remove [an absolete feature], let alone when", so it 
> could very wall stay there forever, and I can understand Drew's viewpoint 
> who did not make the effort to update the 2500 lines of his codebase in 
> which 'interactive-p' is used.  If he had been warned, when Emacs 25 was 
> released, with:
> 
> (declare (pending-removal called-interactively-p "27"))
> 
> he would have known that it would be removed in a medium term, and would 
> have had a reason to update his codebase.

You seem to be under the impression that we have difficulty removing
obsolete features when we decide it's time for that.  But the reality
is we do remove such obsolete features.  It's the decision to do so
that's difficult, not the execution of the removal once we do decide.

P.S.  Could you please refrain from using Reply-To in your messages?
It causes emacs-devel to appear twice in the addresses of the
responses, so I have to manually delete one of them.  TIA.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-19 15:15                                   ` Eli Zaretskii
@ 2020-08-20  0:33                                     ` Jeff Norden
  0 siblings, 0 replies; 838+ messages in thread
From: Jeff Norden @ 2020-08-20  0:33 UTC (permalink / raw)
  To: Eli Zaretskii
  Cc: rms, emacs-devel, monnier, ghe, larsi, drew.adams, stefankangas

Stefan Monnier wrote:
> IMNSHO it doesn't: if we don't intend to remove it ever, then we don't
> declare it obsolete.
>
> Of course, declaring it obsolete doesn't guarantee that we will remove
> it: it's just a declaration of intention.

Eli Zaretskii wrote:
> You seem to be under the impression that we have difficulty removing
> obsolete features when we decide it's time for that.  But the reality
> is we do remove such obsolete features.  It's the decision to do so
> that's difficult, not the execution of the removal once we do decide.

This makes it clear, I think.  Perhaps the elisp manual could say something
like:

  When the Emacs developers mark a function or variable as obsolete, this
  signals the intent to remove it at some point in the future.  You should
  refrain from using it in new code, and should work towards removing it
  from existing code that you plan to maintain for the long term.

But maybe that is not really necessary.

---
Lars Ingebrigtsen wrote:
> ...this is a pretty entertaining read:
> https://medium.com/@steve.yegge/dear-google-cloud-your-deprecation-policy-is-killing-you-ee7525dc05dc

Thanks for this link, which I really enjoyed.  In addition to characterizing
Emacs as "a sort of hybrid between Windows Notepad, a monolithic-kernel
operating system, and the International Space Station," Yegge says:

  I’m still using software that I wrote for Emacs back in 1995. ...
  Every once in a while it might require a minor tweak, but it’s really
  quite rare. I’m not aware of anything I’ve ever written for Emacs (and
  I’ve written a lot) that was ever forced into re-architecture.

  ... when they make an API obsolete, they are basically saying: "You really
  shouldn't use this approach, because even though it works, it suffers from
  various deficiencies which we enumerate here. But in the end it’s your
  call."

  Whereas in the Google world, deprecation means: "We are breaking our
  commitments to you." It really does.

---
As far as interactive-p is concerned, I grepped thru my personal stuff and
found exactly one instance of interactive-p, which dates to April 1993.
It is used to make a function behave differently on the rare times that I
invoke it via M-x.  I changed the interactive spec and introduced an optional
arg.  I agree this is a better solution - but I would also argue that this use
of interactive-p was harmless, since I'm the only person who uses this snippet
of code, and interactive-p did a perfectly good job for my use case.

I can see an argument for removing interactive-p as a way to encourage people
to carefully examine where it was used, and replace it with something better
when possible.  But the docstrings and elisp manual already do this, and it
isn't clear to me that removing the function would accomplish much more.
There is nothing gained by replacing (interactive-p) with
(called-interactively 'interactive) where it is really necessary.  And nothing
can prevent someone from just blindly doing a search-and-replace if they
choose to.

On the other hand, if I hadn't been reading this list this summer, it would
have been a "gentle annoyance" when my old snippet of code failed to run.
Or, as Yegge put it, one of the rare times that it required a minor tweak.
Maybe a stronger docstring could be used instead of deletion. Perhaps:

(defun interactive-p ()
  "Equivalent to (called-interactively-p 'interactive), for backward
compatibility.  See the Info node `(elisp)Distinguish Interactive'
for the limited situations in which this is appropriate, and
suggestions for more robust alternatives."
  (called-interactively-p 'interactive))

But, the design of Emacs makes this a very minor issue, especially compared
to other software I use.  (No matter how many times I set it, tex-live seems
find a new way to change my default paper size back to A4.)

---
Thinking more broadly, it seems to me that the issue is more than just
backward compatibility.  It's about having respect for the people who will be
using your software.  I think of Arethra Franklin singing R-E-S-P-E-C-T in her
rendition of the classic Otis Redding song.  More than any other software that
I know of, Emacs embodies the concept of "user-respect."  One thing that's
clear to me from reading this list recently is that *every* decision involves
a careful consideration of the effects it will have on the people who use
Emacs.

That a lack of user-respect is otherwise ubiquitous today is evidenced simply
by the number of times each day that you mutter "WTF, why did that just
happen?" as you browse the web, interact with software, etc, etc.
https://commadot.com/wtf-per-minute/

In commercial settings, this is likely due to the (perhaps misguided)
perception that decisions are in their financial interest, and the people who
use their products are willing to just "live with it."  In other circles, I
think that the ego and hubris of developers is, in large part, to blame.  If I
had to guess, I'd say that the respect embodied by Emacs is due, in no small
part, to Richard Stallman: his apparent humility and his absolutely unwavering
commitment to principles rather than self promotion.

Thanks,
-Jeff



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-18 11:17             ` Lars Ingebrigtsen
@ 2020-08-24  2:28               ` Stefan Kangas
  2020-08-25  3:46                 ` Richard Stallman
  2020-09-04 17:04                 ` Stefan Kangas
  0 siblings, 2 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-08-24  2:28 UTC (permalink / raw)
  To: Lars Ingebrigtsen, Drew Adams; +Cc: Stefan Monnier, emacs-devel

Lars Ingebrigtsen <larsi@gnus.org> writes:

> But thinking about this a bit more, I agree with Drew here --

Given the controversy here, I don't feel comfortable deleting
interactive-p.  So I left that part of my patch out and pushed the rest
as commit 326fdb9ec0.

The next step here is the obsoletions in semantic.

> interactive-p is used too much in the wild for us to ever delete it.  It
> should stay marked as obsolete, but with a comment saying "never delete"
> or something, because removing it will break too much code out there.

FWIW, I also think there's merit to the argument advanced by Drew and
Lars in the case of interactive-p.  (But my preference would be to say:
"Delete after year or version N".)

Best regards,
Stefan Kangas



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-24  2:28               ` Stefan Kangas
@ 2020-08-25  3:46                 ` Richard Stallman
  2020-08-25  4:06                   ` Drew Adams
  2020-09-04 17:04                 ` Stefan Kangas
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-08-25  3:46 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: larsi, monnier, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > interactive-p is used too much in the wild for us to ever delete it.  It
  > > should stay marked as obsolete, but with a comment saying "never delete"
  > > or something, because removing it will break too much code out there.

I agree we should never delete it, for that good reason.
But we made it obsolete for a good reason, too: any program which
uses will misbehave in some unusual cases.  The only way to get
fully correct behavior is to eliminate the calls to interactive-p,
and instead use an optional argument which gets a non-nil value
in an interactive call.

All the calls in the Emacs code have been replaced.
Do any remain in ELPA?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-25  3:46                 ` Richard Stallman
@ 2020-08-25  4:06                   ` Drew Adams
  2020-08-26  1:57                     ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-08-25  4:06 UTC (permalink / raw)
  To: rms, Stefan Kangas; +Cc: larsi, monnier, emacs-devel

>   > > interactive-p is used too much in the wild for us to ever delete it.
>   > > It should stay marked as obsolete, but with a comment saying "never
>   > > delete" or something, because removing it will break too much code
>   > > out there.
> 
> I agree we should never delete it, for that good reason.

Good.  That was the (only) point in question.

> But we made it obsolete for a good reason, too: any program which
> uses will misbehave in some unusual cases.  The only way to get
> fully correct behavior is to eliminate the calls to interactive-p,
> and instead use an optional argument which gets a non-nil value
> in an interactive call.
> 
> All the calls in the Emacs code have been replaced.

Uh, no, I don't think so.

(interactive-p) == (called-interactively-p 'interactive)

Grepping tells me there are 258 occurrences of the
latter in the Lisp code distributed with Emacs.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-25  4:06                   ` Drew Adams
@ 2020-08-26  1:57                     ` Richard Stallman
  2020-08-26  8:59                       ` Gregory Heytings via Emacs development discussions.
  2020-08-26 17:39                       ` Drew Adams
  0 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2020-08-26  1:57 UTC (permalink / raw)
  To: Drew Adams; +Cc: larsi, emacs-devel, stefankangas, monnier

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Uh, no, I don't think so.

  > (interactive-p) == (called-interactively-p 'interactive)

I do not follow you -- your words are very terse.

Are you saying that people replaced calls to interactive-p with calls
to called-interactively-p, rather than converting to use an optional
argument?


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-26  1:57                     ` Richard Stallman
@ 2020-08-26  8:59                       ` Gregory Heytings via Emacs development discussions.
  2020-08-26 13:22                         ` Stefan Kangas
  2020-08-26 17:39                       ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Gregory Heytings via Emacs development discussions. @ 2020-08-26  8:59 UTC (permalink / raw)
  To: Richard Stallman; +Cc: emacs-devel, Drew Adams, larsi, stefankangas, monnier


>
>> Uh, no, I don't think so.
>>
>> (interactive-p) == (called-interactively-p 'interactive)
>
> I do not follow you -- your words are very terse.
>
> Are you saying that people replaced calls to interactive-p with calls to 
> called-interactively-p, rather than converting to use an optional 
> argument?
>

Yes.

And that's also what Stefan Kangas did in his patch for Emacs named 
0001-Remove-many-items-obsolete-since-Emacs-23.2-and-23.3.patch and sent 
on this list two weeks ago (on Fri, 14 Aug 2020 08:42:38 -0700).

Gregory



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-26  8:59                       ` Gregory Heytings via Emacs development discussions.
@ 2020-08-26 13:22                         ` Stefan Kangas
  2020-08-27  2:51                           ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-08-26 13:22 UTC (permalink / raw)
  To: Gregory Heytings, Richard Stallman
  Cc: larsi, monnier, Drew Adams, emacs-devel

Gregory Heytings <ghe@sdf.org> writes:

>> Are you saying that people replaced calls to interactive-p with calls to
>> called-interactively-p, rather than converting to use an optional
>> argument?
>
> Yes.
>
> And that's also what Stefan Kangas did in his patch for Emacs named
> 0001-Remove-many-items-obsolete-since-Emacs-23.2-and-23.3.patch and sent
> on this list two weeks ago (on Fri, 14 Aug 2020 08:42:38 -0700).

My commit bc5da2c3fb does basically the following:

-    (help-setup-xref (list 'describe-symbols pattern) (interactive-p))
+    (help-setup-xref (list 'describe-symbols pattern)
+                 (called-interactively-p 'interactive))



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Delete variables obsolete since Emacs 23
  2020-08-26  1:57                     ` Richard Stallman
  2020-08-26  8:59                       ` Gregory Heytings via Emacs development discussions.
@ 2020-08-26 17:39                       ` Drew Adams
  2020-08-26 18:16                         ` Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-08-26 17:39 UTC (permalink / raw)
  To: rms; +Cc: larsi, emacs-devel, stefankangas, monnier

>   > Uh, no, I don't think so.
>   > (interactive-p) == (called-interactively-p 'interactive)
> 
> I do not follow you -- your words are very terse.
> 
> Are you saying that people replaced calls to interactive-p with calls
> to called-interactively-p, rather than converting to use an optional
> argument?

Yes, apparently so.  You're correct that there are
now no occurrences of `interactive-p' in the source
code.  But there are hundreds of occurrences of 
what amounts to the same thing.

I've said it several times in this thread already,
which is why I didn't belabor it in my too-terse
reply: this is the _definition_ of `interactive-p'
(in `subr.el'):

(defun interactive-p ()
  "..."
  (declare (obsolete called-interactively-p "23.2"))
  (called-interactively-p 'interactive))

And the Emacs Lisp source code contains lots of
occurrences of `(called-interactively-p 'interactive)'.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-26 17:39                       ` Drew Adams
@ 2020-08-26 18:16                         ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-08-26 18:16 UTC (permalink / raw)
  To: Drew Adams; +Cc: larsi, emacs-devel, rms, stefankangas

> I've said it several times in this thread already,
> which is why I didn't belabor it in my too-terse
> reply: this is the _definition_ of `interactive-p'
> (in `subr.el'):
>
> (defun interactive-p ()
>   "..."
>   (declare (obsolete called-interactively-p "23.2"))
>   (called-interactively-p 'interactive))

For completeness, I have to warn that there is a bit more than meets the
eye, here: `called-interactively-p` is a big-ugly-hack and in order for
the above `interactive-p` to work, it has to know that `interactive-p`
is also one of those special not-really-functions.  More specifically,
this manifests itself in the presence of the symbol `interactive-p`
inside `called-interactively-p`.

After all, if taken literally, the above code would always return nil
since `interactive-p` can't be called interactively.

> And the Emacs Lisp source code contains lots of
> occurrences of `(called-interactively-p 'interactive)'.

Yes, and that still sucks, indeed.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-26 13:22                         ` Stefan Kangas
@ 2020-08-27  2:51                           ` Richard Stallman
  2020-08-27  3:51                             ` Stefan Kangas
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-08-27  2:51 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: ghe, larsi, monnier, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > My commit bc5da2c3fb does basically the following:

  > -    (help-setup-xref (list 'describe-symbols pattern) (interactive-p))
  > +    (help-setup-xref (list 'describe-symbols pattern)
  > +                 (called-interactively-p 'interactive))

That is not the recommend way to fix these calls.
called-interactively-p does not give the correct results in all
situations.  The right way is to make the optional argument.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-27  2:51                           ` Richard Stallman
@ 2020-08-27  3:51                             ` Stefan Kangas
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-08-27  3:51 UTC (permalink / raw)
  To: rms; +Cc: ghe, larsi, monnier, drew.adams, emacs-devel

Richard Stallman <rms@gnu.org> writes:

>   > My commit bc5da2c3fb does basically the following:
>
>   > -    (help-setup-xref (list 'describe-symbols pattern) (interactive-p))
>   > +    (help-setup-xref (list 'describe-symbols pattern)
>   > +                 (called-interactively-p 'interactive))
>
> That is not the recommend way to fix these calls.
> called-interactively-p does not give the correct results in all
> situations.  The right way is to make the optional argument.

This was simply to not use the old deprecated name, which AFAIU is being
considered for removal.

Perhaps we could also expand the section in the Manual that explains why
using an optional argument is better, and make the wording stronger.
Here's what I read in `(info "(elisp) Distinguish Interactive")':

    The above method with the additional argument is usually best,
    because it allows callers to say “treat this call as interactive”.  But
    you can also do the job by testing ‘called-interactively-p’.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-08-24  2:28               ` Stefan Kangas
  2020-08-25  3:46                 ` Richard Stallman
@ 2020-09-04 17:04                 ` Stefan Kangas
  2020-09-05 12:39                   ` Lars Ingebrigtsen
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-09-04 17:04 UTC (permalink / raw)
  To: Lars Ingebrigtsen, Drew Adams; +Cc: Stefan Monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 217 bytes --]

Stefan Kangas <stefankangas@gmail.com> writes:

> The next step here is the obsoletions in semantic.

Please find attached a patch to remove obsolete items also from cedet.

Any comments?

Best regards,
Stefan Kangas

[-- Attachment #2: 0001-Remove-cedet-items-obsolete-since-23.2.patch --]
[-- Type: text/x-diff, Size: 45771 bytes --]

From a89738531bf9c37293d4d2fdfcf52fa660abd19c Mon Sep 17 00:00:00 2001
From: Stefan Kangas <stefankangas@gmail.com>
Date: Fri, 14 Aug 2020 13:40:29 +0200
Subject: [PATCH] Remove cedet items obsolete since 23.2

* lisp/cedet/semantic.el (semantic-toplevel-bovine-table)
(semantic-toplevel-bovine-cache)
(semantic-before-toplevel-bovination-hook)
(semantic-after-toplevel-bovinate-hook, semantic-init-hooks)
(semantic-init-mode-hooks, semantic-init-db-hooks)
(semantic-bovination-working-type, semantic-bovinate-toplevel)
(semantic-bovinate-region-until-error)
(semantic-bovinate-from-nonterminal-full):
* lisp/cedet/semantic/db-mode.el (semanticdb-mode-hooks):
* lisp/cedet/semantic/decorate/mode.el
(semantic-decorate-pending-decoration-hooks):
* lisp/cedet/semantic/edit.el
(semantic-edits-incremental-reparse-failed-hooks):
* lisp/cedet/semantic/fw.el (define-mode-overload-implementation):
* lisp/cedet/semantic/idle.el
(semantic-before-idle-scheduler-reparse-hooks)
(semantic-after-idle-scheduler-reparse-hooks):
(semantic-eldoc-current-symbol-info)
* lisp/cedet/semantic/imenu.el (semantic-imenu-expand-type-parts)
(semantic-imenu-bucketize-type-parts)
(semantic-imenu-expandable-token):
* lisp/cedet/semantic/java.el
(semantic-java-prototype-nonterminal):
* lisp/cedet/semantic/lex.el (semantic-flex-token-start)
(semantic-flex-token-end, semantic-flex-token-text)
(semantic-flex-make-keyword-table, semantic-flex-keyword-p)
(semantic-flex-keyword-put, semantic-flex-keyword-get)
(semantic-flex-map-keywords, semantic-flex-keywords)
(semantic-flex-buffer, semantic-flex-list, semantic-flex):
* lisp/cedet/semantic/tag-file.el (semantic-find-nonterminal)
(semantic-find-dependency):
* lisp/cedet/semantic/tag-ls.el (semantic-nonterminal-full-name)
(semantic-nonterminal-protection, semantic-nonterminal-abstract)
(semantic-nonterminal-leaf):
* lisp/cedet/semantic/tag.el (semantic-token-type-parent)
(semantic-tag-make-assoc-list, semantic-expand-nonterminal):
* lisp/cedet/semantic/util.el (semantic-file-token-stream)
(semantic-something-to-stream):
* lisp/cedet/semantic/wisent.el (wisent-lex-make-token-table):
Delete many items obsolete since Emacs 23.2.
* lisp/cedet/semantic.el (semantic--set-buffer-cache)
(semantic-fetch-tags): Don't run removed hooks
'semantic-after-toplevel-bovinate-hook' and
'semantic-before-toplevel-bovination-hook'.
* lisp/cedet/semantic/bovine/el.el: Remove reference to obsolete
variable 'define-mode-overload-implementation'.
* lisp/cedet/semantic/doc.el (semantic-doc-snarf-comment-for-tag):
Don't bind removed variable 'semantic-ignore-comments'.
* lisp/cedet/semantic/fw.el (semantic-overload-symbol-from-function)
(semantic-alias-obsolete, semantic-varalias-obsolete): Declare
obsolete in favor of standard Emacs 'define-obsolete-*-alias'.
* lisp/cedet/semantic/grammar.el (semantic-grammar-ASSOC): Don't
use obsolete names.
* lisp/cedet/semantic/tag-ls.el (semantic-tag-full-package)
(semantic-tag-full-name): Doc fixes.
* lisp/cedet/semantic/util.el (semantic-describe-buffer): Don't bind
removed variable 'semantic-after-toplevel-bovinate-hook'.
* lisp/cedet/semantic/lex.el (semantic-flex-tokens)
(semantic-flex-unterminated-syntax-end-function)
(semantic-flex-extensions, semantic-flex-syntax-modifications)
(semantic-ignore-comments, semantic-flex-enable-newlines)
(semantic-flex-enable-whitespace, semantic-flex-enable-bol)
(semantic-number-expression, semantic-flex-depth): Make unused
variables obsolete.
; * etc/NEWS: List removed items.
---
 etc/NEWS                             |  33 +++-
 lisp/cedet/semantic.el               |  79 +--------
 lisp/cedet/semantic/bovine/el.el     |   1 -
 lisp/cedet/semantic/db-mode.el       |   4 -
 lisp/cedet/semantic/decorate/mode.el |   3 -
 lisp/cedet/semantic/doc.el           |   3 +-
 lisp/cedet/semantic/edit.el          |   3 -
 lisp/cedet/semantic/fw.el            |  13 +-
 lisp/cedet/semantic/grammar.el       |   2 +-
 lisp/cedet/semantic/idle.el          |   9 --
 lisp/cedet/semantic/imenu.el         |   6 -
 lisp/cedet/semantic/java.el          |   3 -
 lisp/cedet/semantic/lex.el           | 231 ++-------------------------
 lisp/cedet/semantic/tag-file.el      |  13 --
 lisp/cedet/semantic/tag-ls.el        |  16 +-
 lisp/cedet/semantic/tag.el           |  20 ---
 lisp/cedet/semantic/util.el          |   7 -
 lisp/cedet/semantic/wisent.el        |   5 -
 18 files changed, 53 insertions(+), 398 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index e0ea8f53cc..13e145cec1 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1146,8 +1146,8 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
 'completion-base-size', 'completion-common-substring',
 'crm-minibuffer-complete', 'crm-minibuffer-complete-and-exit',
 'crm-minibuffer-completion-help', 'custom-mode', 'custom-mode-hook',
-'detect-coding-with-priority', 'dirtrack-debug',
-'dirtrack-debug-toggle', 'dynamic-completion-table',
+'define-mode-overload-implementation', 'detect-coding-with-priority',
+'dirtrack-debug', 'dirtrack-debug-toggle', 'dynamic-completion-table',
 'easy-menu-precalculate-equivalent-keybindings',
 'epa-display-verify-result', 'epg-passphrase-callback-function',
 'eshell-report-bug', 'eval-next-after-load', 'exchange-dot-and-mark',
@@ -1167,13 +1167,40 @@ ledit.el, lmenu.el, lucid.el and old-whitespace.el.
 'pre-abbrev-expand-hook', 'princ-list', 'print-help-return-message',
 'process-filter-multibyte-p', 'read-file-name-predicate',
 'remember-buffer', 'rmail-highlight-face', 'rmail-message-filter',
+'semantic-after-idle-scheduler-reparse-hooks',
+'semantic-after-toplevel-bovinate-hook',
+'semantic-before-idle-scheduler-reparse-hooks',
+'semantic-before-toplevel-bovination-hook',
+'semantic-bovinate-from-nonterminal-full',
+'semantic-bovinate-region-until-error', 'semantic-bovinate-toplevel',
+'semantic-bovination-working-type',
+'semantic-decorate-pending-decoration-hooks',
+'semantic-edits-incremental-reparse-failed-hooks',
+'semantic-eldoc-current-symbol-info', 'semantic-expand-nonterminal',
+'semantic-file-token-stream', 'semantic-find-dependency',
+'semantic-find-nonterminal', 'semantic-flex', 'semantic-flex-buffer',
+'semantic-flex-keyword-get', 'semantic-flex-keyword-p',
+'semantic-flex-keyword-put', 'semantic-flex-keywords',
+'semantic-flex-list', 'semantic-flex-make-keyword-table',
+'semantic-flex-map-keywords', 'semantic-flex-token-end',
+'semantic-flex-token-start', 'semantic-flex-token-text',
+'semantic-imenu-bucketize-type-parts',
+'semantic-imenu-expand-type-parts', 'semantic-imenu-expandable-token',
+'semantic-init-db-hooks)', 'semantic-init-hooks',
+'semantic-init-mode-hooks', 'semantic-java-prototype-nonterminal',
+'semantic-nonterminal-abstract', 'semantic-nonterminal-full-name',
+'semantic-nonterminal-leaf', 'semantic-nonterminal-protection',
+'semantic-something-to-stream', 'semantic-tag-make-assoc-list',
+'semantic-token-type-parent', 'semantic-toplevel-bovine-cache',
+'semantic-toplevel-bovine-table', 'semanticdb-mode-hooks',
 'set-coding-priority', 'set-process-filter-multibyte',
 'shadows-compare-text-p', 'shell-dirtrack-toggle', 't-mouse-mode',
 'term-dynamic-simple-complete', 'tooltip-hook', 'tpu-have-ispell',
 'url-generate-unique-filename', 'url-temporary-directory',
 'vc-arch-command', 'vc-default-working-revision' (variable),
 'vc-mtn-command', 'vc-revert-buffer', 'vc-workfile-version',
-'vcursor-toggle-vcursor-map', 'w32-focus-frame', 'w32-select-font'.
+'vcursor-toggle-vcursor-map', 'w32-focus-frame', 'w32-select-font',
+'wisent-lex-make-token-table'.
 
 \f
 * Lisp Changes in Emacs 28.1
diff --git a/lisp/cedet/semantic.el b/lisp/cedet/semantic.el
index 58a35d7d8a..71321e12da 100644
--- a/lisp/cedet/semantic.el
+++ b/lisp/cedet/semantic.el
@@ -82,8 +82,6 @@ semantic--parse-table
 This variable is for internal use only, and its content depends on the
 external parser used.")
 (make-variable-buffer-local 'semantic--parse-table)
-(semantic-varalias-obsolete 'semantic-toplevel-bovine-table
-			    'semantic--parse-table "23.2")
 
 (defvar semantic-symbol->name-assoc-list
   '((type     . "Types")
@@ -112,17 +110,6 @@ semantic-case-fold
   "Value for `case-fold-search' when parsing.")
 (make-variable-buffer-local 'semantic-case-fold)
 
-(defvar semantic-expand-nonterminal nil
-  "Function to call for each nonterminal production.
-Return a list of non-terminals derived from the first argument, or nil
-if it does not need to be expanded.
-Languages with compound definitions should use this function to expand
-from one compound symbol into several.  For example, in C the definition
-  int a, b;
-is easily parsed into one tag.  This function should take this
-compound tag and turn it into two tags, one for A, and the other for B.")
-(make-variable-buffer-local 'semantic-expand-nonterminal)
-
 (defvar semantic--buffer-cache nil
   "A cache of the fully parsed buffer.
 If no significant changes have been made (based on the state) then
@@ -134,8 +121,6 @@ semantic--buffer-cache
 cached values for some reason, chances are you can add a hook to
 `semantic-after-toplevel-cache-change-hook'.")
 (make-variable-buffer-local 'semantic--buffer-cache)
-(semantic-varalias-obsolete 'semantic-toplevel-bovine-cache
-			    'semantic--buffer-cache "23.2")
 
 (defvar semantic-unmatched-syntax-cache nil
   "A cached copy of unmatched syntax tokens.")
@@ -171,18 +156,6 @@ semantic--before-fetch-tags-hook
 `semantic-fetch-tags' by an application.
 If any hook returns a nil value, the cached value is returned
 immediately, even if it is empty.")
-(semantic-varalias-obsolete 'semantic-before-toplevel-bovination-hook
-			    'semantic--before-fetch-tags-hook "23.2")
-
-(defvar semantic-after-toplevel-bovinate-hook nil
-  "Hooks run after a toplevel parse.
-It is not run if the toplevel parse command is called, and buffer does
-not need to be fully reparsed.
-For language specific hooks, make sure you define this as a local hook.
-
-This hook should not be used any more.
-Use `semantic-after-toplevel-cache-change-hook' instead.")
-(make-obsolete-variable 'semantic-after-toplevel-bovinate-hook nil "23.2")
 
 (defvar semantic-after-toplevel-cache-change-hook nil
   "Hooks run after the buffer tag list has changed.
@@ -305,13 +278,6 @@ semantic-init-db-hook
 This guarantees that the DB will go before other modes that require
 a parse of the buffer.")
 
-(semantic-varalias-obsolete 'semantic-init-hooks
-			    'semantic-init-hook "23.2")
-(semantic-varalias-obsolete 'semantic-init-mode-hooks
-			    'semantic-init-mode-hook "23.2")
-(semantic-varalias-obsolete 'semantic-init-db-hooks
-			    'semantic-init-db-hook "23.2")
-
 (defsubst semantic-error-if-unparsed ()
   "Raise an error if current buffer was not parsed by Semantic."
   (unless semantic-new-buffer-fcn-was-run
@@ -516,8 +482,6 @@ semantic-clear-toplevel-cache
   (semantic-parse-tree-set-needs-rebuild)
   ;; Remove this hook which tracks if a buffer is up to date or not.
   (remove-hook 'after-change-functions 'semantic-change-function t)
-  ;; Old model.  Delete someday.
-  ;;(run-hooks 'semantic-after-toplevel-bovinate-hook)
 
   (run-hook-with-args 'semantic-after-toplevel-cache-change-hook
 		      semantic--buffer-cache)
@@ -540,17 +504,12 @@ semantic--set-buffer-cache
   (setq semantic--completion-cache nil)
   ;; Refresh the display of unmatched syntax tokens if enabled
   (run-hook-with-args 'semantic-unmatched-syntax-hook
-                      semantic-unmatched-syntax-cache)
-  ;; Old Semantic 1.3 hook API.  Maybe useful forever?
-  (run-hooks 'semantic-after-toplevel-bovinate-hook)
-  )
+                      semantic-unmatched-syntax-cache))
 
 (defvar semantic-working-type 'percent
   "The type of working message to use when parsing.
 'percent means we are doing a linear parse through the buffer.
 'dynamic means we are reparsing specific tags.")
-(semantic-varalias-obsolete 'semantic-bovination-working-type
-			    'semantic-working-type "23.2")
 
 (defvar semantic-minimum-working-buffer-size (* 1024 5)
   "The minimum size of a buffer before working messages are displayed.
@@ -585,8 +544,6 @@ semantic-fetch-tags
    ;; Is this a semantic enabled buffer?
    (semantic-active-p)
    ;; Application hooks say the buffer is safe for parsing
-   (run-hook-with-args-until-failure
-    'semantic-before-toplevel-bovination-hook)
    (run-hook-with-args-until-failure
     'semantic--before-fetch-tags-hook)
    ;; If the buffer was previously marked unparseable,
@@ -690,11 +647,6 @@ semantic-refresh-tags-safe
       ;; Return if we are lexically safe
       lexically-safe))))
 
-(defun semantic-bovinate-toplevel (&optional ignored)
-  "Backward compatibility function."
-  (semantic-fetch-tags))
-(make-obsolete 'semantic-bovinate-toplevel 'semantic-fetch-tags "23.2")
-
 ;; Another approach is to let Emacs call the parser on idle time, when
 ;; needed, use `semantic-fetch-available-tags' to only retrieve
 ;; available tags, and setup the `semantic-after-*-hook' hooks to
@@ -812,20 +764,6 @@ semantic-dump-parser-warnings
 ;; Please move away from these functions, and try using semantic 2.x
 ;; interfaces instead.
 ;;
-(defsubst semantic-bovinate-region-until-error
-  (start end nonterm &optional depth)
-  "NOTE: Use `semantic-parse-region' instead.
-
-Bovinate between START and END starting with NONTERM.
-Optional DEPTH specifies how many levels of parenthesis to enter.
-This command will parse until an error is encountered, and return
-the list of everything found until that moment.
-This is meant for finding variable definitions at the beginning of
-code blocks in methods.  If `bovine-inner-scope' can also support
-commands, use `semantic-bovinate-from-nonterminal-full'."
-  (semantic-parse-region start end nonterm depth t))
-(make-obsolete 'semantic-bovinate-region-until-error
-               'semantic-parse-region "23.2")
 
 (defsubst semantic-bovinate-from-nonterminal
   (start end nonterm &optional depth length)
@@ -840,21 +778,6 @@ semantic-bovinate-from-nonterminal
 		  (semantic-lex start end (or depth 1) length)
 		  nonterm))))
 
-(defsubst semantic-bovinate-from-nonterminal-full
-  (start end nonterm &optional depth)
-  "NOTE: Use `semantic-parse-region' instead.
-
-Bovinate from within a nonterminal lambda from START to END.
-Iterates until all the space between START and END is exhausted.
-Argument NONTERM is the nonterminal symbol to start with.
-If NONTERM is nil, use `bovine-block-toplevel'.
-Optional argument DEPTH is the depth of lists to dive into.
-When used in a `lambda' of a MATCH-LIST, there is no need to include
-a START and END part."
-  (semantic-parse-region start end nonterm (or depth 1)))
-(make-obsolete 'semantic-bovinate-from-nonterminal-full
-               'semantic-parse-region "23.2")
-
 ;;; User interface
 
 (defun semantic-force-refresh ()
diff --git a/lisp/cedet/semantic/bovine/el.el b/lisp/cedet/semantic/bovine/el.el
index 656c63b7ee..822ec176a3 100644
--- a/lisp/cedet/semantic/bovine/el.el
+++ b/lisp/cedet/semantic/bovine/el.el
@@ -420,7 +420,6 @@ semantic-elisp-use-read
 	 :parent (symbol-name (nth 2 form))
 	 :documentation (semantic-elisp-do-doc (nth 4 form))
 	 )))
-  define-mode-overload-implementation ;; obsoleted
   define-mode-local-override
   )
 
diff --git a/lisp/cedet/semantic/db-mode.el b/lisp/cedet/semantic/db-mode.el
index 0ab03ef49e..16a30b6cfb 100644
--- a/lisp/cedet/semantic/db-mode.el
+++ b/lisp/cedet/semantic/db-mode.el
@@ -69,10 +69,6 @@ global-semanticdb-minor-mode
     (dolist (elt semanticdb-hooks)
       (remove-hook (cadr elt) (car elt)))))
 
-(semantic-varalias-obsolete 'semanticdb-mode-hooks
-			    'global-semanticdb-minor-mode-hook "23.2")
-
-
 (defun semanticdb-toggle-global-mode ()
   "Toggle use of the Semantic Database feature.
 Update the environment of Semantic enabled buffers accordingly."
diff --git a/lisp/cedet/semantic/decorate/mode.el b/lisp/cedet/semantic/decorate/mode.el
index 8eb6a3bbd5..293692000d 100644
--- a/lisp/cedet/semantic/decorate/mode.el
+++ b/lisp/cedet/semantic/decorate/mode.el
@@ -204,9 +204,6 @@ semantic-decorate-add-decorations
 (defvar semantic-decorate-pending-decoration-hook nil
   "Normal hook run to perform pending decoration changes.")
 
-(semantic-varalias-obsolete 'semantic-decorate-pending-decoration-hooks
-			    'semantic-decorate-pending-decoration-hook "23.2")
-
 (defun semantic-decorate-add-pending-decoration (fcn &optional buffer)
   "Add a pending decoration change represented by FCN.
 Applies only to the current BUFFER.
diff --git a/lisp/cedet/semantic/doc.el b/lisp/cedet/semantic/doc.el
index 8b39e77578..896bc3bb42 100644
--- a/lisp/cedet/semantic/doc.el
+++ b/lisp/cedet/semantic/doc.el
@@ -93,8 +93,7 @@ semantic-doc-snarf-comment-for-tag
 Attempt to strip out comment syntactic sugar.
 Argument NOSNARF means don't modify the found text.
 If NOSNARF is `lex', then return the lex token."
-  (let* ((semantic-ignore-comments nil)
-	 (semantic-lex-analyzer #'semantic-comment-lexer))
+  (let* ((semantic-lex-analyzer #'semantic-comment-lexer))
     (if (memq nosnarf '(lex flex)) ;; keep `flex' for compatibility
 	(car (semantic-lex (point) (1+ (point))))
       (let ((ct (semantic-lex-token-text
diff --git a/lisp/cedet/semantic/edit.el b/lisp/cedet/semantic/edit.el
index a1225dfeee..e4319c7d1b 100644
--- a/lisp/cedet/semantic/edit.el
+++ b/lisp/cedet/semantic/edit.el
@@ -121,9 +121,6 @@ semantic-edits-incremental-reparse-failed-hook
   "Hook run after the incremental parser fails.
 When this happens, the buffer is marked as needing a full reparse.")
 
-(semantic-varalias-obsolete 'semantic-edits-incremental-reparse-failed-hooks
-			    'semantic-edits-incremental-reparse-failed-hook "23.2")
-
 (defcustom semantic-edits-verbose-flag nil
   "Non-nil means the incremental parser is verbose.
 If nil, errors are still displayed, but informative messages are not."
diff --git a/lisp/cedet/semantic/fw.el b/lisp/cedet/semantic/fw.el
index e347c99f19..c86cd3abf3 100644
--- a/lisp/cedet/semantic/fw.el
+++ b/lisp/cedet/semantic/fw.el
@@ -173,6 +173,7 @@ semantic-test-data-cache
 ;;
 (defun semantic-overload-symbol-from-function (name)
   "Return the symbol for overload used by NAME, the defined symbol."
+  (declare (obsolete define-obsolete-function-alias "28.1"))
   (let ((sym-name (symbol-name name)))
     (if (string-match "^semantic-" sym-name)
 	(intern (substring sym-name (match-end 0)))
@@ -182,6 +183,7 @@ semantic-alias-obsolete
   "Make OLDFNALIAS an alias for NEWFN.
 Mark OLDFNALIAS as obsolete, such that the byte compiler
 will throw a warning when it encounters this symbol."
+  (declare (obsolete define-obsolete-function-alias "28.1"))
   (defalias oldfnalias newfn)
   (make-obsolete oldfnalias newfn when)
   (when (and (mode-local--function-overload-p newfn)
@@ -196,13 +198,14 @@ semantic-alias-obsolete
      "%s: `%s' obsoletes overload `%s'"
      byte-compile-current-file
      newfn
-     (semantic-overload-symbol-from-function oldfnalias))
-    ))
+     (with-suppressed-warnings ((obsolete semantic-overload-symbol-from-function))
+       (semantic-overload-symbol-from-function oldfnalias)))))
 
 (defun semantic-varalias-obsolete (oldvaralias newvar when)
   "Make OLDVARALIAS an alias for variable NEWVAR.
 Mark OLDVARALIAS as obsolete, such that the byte compiler
 will throw a warning when it encounters this symbol."
+  (declare (obsolete define-obsolete-variable-alias "28.1"))
   (make-obsolete-variable oldvaralias newvar when)
   (condition-case nil
       (defvaralias oldvaralias newvar)
@@ -256,9 +259,6 @@ semantic-map-buffers
 
 (defalias 'semantic-map-mode-buffers 'mode-local-map-mode-buffers)
 
-(semantic-alias-obsolete 'define-mode-overload-implementation
-                         'define-mode-local-override "23.2")
-
 (defun semantic-install-function-overrides (overrides &optional transient)
   "Install the function OVERRIDES in the specified environment.
 OVERRIDES must be an alist ((OVERLOAD .  FUNCTION) ...) where OVERLOAD
@@ -396,13 +396,10 @@ semanticdb-without-unloaded-file-searches
 ;; 		 "define-lex-regex-type-analyzer"
 ;; 		 "define-lex-string-type-analyzer"
 ;; 		 "define-lex-block-type-analyzer"
-;; 		 ;;"define-mode-overload-implementation"
 ;; 		 ;;"define-semantic-child-mode"
 ;; 		 "define-semantic-idle-service"
 ;; 		 "define-semantic-decoration-style"
 ;; 		 "define-wisent-lexer"
-;; 		 "semantic-alias-obsolete"
-;; 		 "semantic-varalias-obsolete"
 ;; 		 "semantic-make-obsolete-overload"
 ;; 		 "defcustom-mode-local-semantic-dependency-system-include-path"
 ;; 		 ))
diff --git a/lisp/cedet/semantic/grammar.el b/lisp/cedet/semantic/grammar.el
index 6cd4832165..f71ac6c413 100644
--- a/lisp/cedet/semantic/grammar.el
+++ b/lisp/cedet/semantic/grammar.el
@@ -142,7 +142,7 @@ semantic-grammar-ASSOC
   "Return expansion of built-in ASSOC expression.
 ARGS are ASSOC's key value list."
   (let ((key t))
-    `(semantic-tag-make-assoc-list
+    `(semantic-tag-make-plist
       ,@(mapcar #'(lambda (i)
                     (prog1
                         (if key
diff --git a/lisp/cedet/semantic/idle.el b/lisp/cedet/semantic/idle.el
index 76218249c5..8301b19530 100644
--- a/lisp/cedet/semantic/idle.el
+++ b/lisp/cedet/semantic/idle.el
@@ -472,11 +472,6 @@ semantic-after-idle-scheduler-reparse-hook
 If any hook function throws an error, this variable is reset to nil.
 This hook is not protected from lexical errors.")
 
-(semantic-varalias-obsolete 'semantic-before-idle-scheduler-reparse-hooks
-			    'semantic-before-idle-scheduler-reparse-hook "23.2")
-(semantic-varalias-obsolete 'semantic-after-idle-scheduler-reparse-hooks
-			    'semantic-after-idle-scheduler-reparse-hook "23.2")
-
 (defun semantic-idle-scheduler-refresh-tags ()
   "Refreshes the current buffer's tags.
 This is called by `semantic-idle-scheduler-function' to update the
@@ -734,10 +729,6 @@ semantic-idle-summary-useful-context-p
 (define-overloadable-function semantic-idle-summary-current-symbol-info ()
   "Return a string message describing the current context.")
 
-(make-obsolete-overload 'semantic-eldoc-current-symbol-info
-                        'semantic-idle-summary-current-symbol-info
-                        "23.2")
-
 (defcustom semantic-idle-summary-mode-hook nil
   "Hook run at the end of `semantic-idle-summary'."
   :group 'semantic
diff --git a/lisp/cedet/semantic/imenu.el b/lisp/cedet/semantic/imenu.el
index cdf0a23fa0..25f7fdb842 100644
--- a/lisp/cedet/semantic/imenu.el
+++ b/lisp/cedet/semantic/imenu.el
@@ -88,8 +88,6 @@ semantic-imenu-expand-type-members
   :group 'semantic-imenu
   :type 'boolean)
 (make-variable-buffer-local 'semantic-imenu-expand-type-members)
-(semantic-varalias-obsolete 'semantic-imenu-expand-type-parts
-                            'semantic-imenu-expand-type-members "23.2")
 
 (defcustom semantic-imenu-bucketize-type-members t
   "Non-nil if members of a type should be grouped into buckets.
@@ -98,8 +96,6 @@ semantic-imenu-bucketize-type-members
   :group 'semantic-imenu
   :type 'boolean)
 (make-variable-buffer-local 'semantic-imenu-bucketize-type-members)
-(semantic-varalias-obsolete 'semantic-imenu-bucketize-type-parts
-                            'semantic-imenu-bucketize-type-members "23.2")
 
 (defcustom semantic-imenu-sort-bucket-function nil
   "Function to use when sorting tags in the buckets of functions.
@@ -145,8 +141,6 @@ semantic-imenu-expandable-tag-classes
 By default, a `type' has interesting children.  In Texinfo, however, a
 `section' has interesting children.")
 (make-variable-buffer-local 'semantic-imenu-expandable-tag-classes)
-(semantic-varalias-obsolete 'semantic-imenu-expandable-token
-                            'semantic-imenu-expandable-tag-classes "23.2")
 
 ;;; Code:
 (defun semantic-imenu-tag-overlay (tag)
diff --git a/lisp/cedet/semantic/java.el b/lisp/cedet/semantic/java.el
index 80d03dc629..2aa0ab0e3f 100644
--- a/lisp/cedet/semantic/java.el
+++ b/lisp/cedet/semantic/java.el
@@ -253,9 +253,6 @@ semantic-format-tag-prototype
                'semantic-format-tag-prototype-default)
              tag parent color)))
 
-(semantic-alias-obsolete 'semantic-java-prototype-nonterminal
-                         'semantic-format-tag-prototype-java-mode "23.2")
-
 ;; Include Tag Name
 ;;
 
diff --git a/lisp/cedet/semantic/lex.el b/lisp/cedet/semantic/lex.el
index 500a09d492..cb17f9fd93 100644
--- a/lisp/cedet/semantic/lex.el
+++ b/lisp/cedet/semantic/lex.el
@@ -1754,29 +1754,11 @@ semantic-lex-catch-errors
 ;;
 ;; NOTE: DELETE THIS SOMEDAY SOON
 
-(semantic-alias-obsolete 'semantic-flex-start 'semantic-lex-token-start "23.2")
-(semantic-alias-obsolete 'semantic-flex-end 'semantic-lex-token-end "23.2")
-(semantic-alias-obsolete 'semantic-flex-text 'semantic-lex-token-text "23.2")
-(semantic-alias-obsolete 'semantic-flex-make-keyword-table 'semantic-lex-make-keyword-table "23.2")
-(semantic-alias-obsolete 'semantic-flex-keyword-p 'semantic-lex-keyword-p "23.2")
-(semantic-alias-obsolete 'semantic-flex-keyword-put 'semantic-lex-keyword-put "23.2")
-(semantic-alias-obsolete 'semantic-flex-keyword-get 'semantic-lex-keyword-get "23.2")
-(semantic-alias-obsolete 'semantic-flex-map-keywords 'semantic-lex-map-keywords "23.2")
-(semantic-alias-obsolete 'semantic-flex-keywords 'semantic-lex-keywords "23.2")
-(semantic-alias-obsolete 'semantic-flex-buffer 'semantic-lex-buffer "23.2")
-(semantic-alias-obsolete 'semantic-flex-list 'semantic-lex-list "23.2")
-
-;; This simple scanner uses the syntax table to generate a stream of
-;; simple tokens of the form:
-;;
-;;  (SYMBOL START . END)
-;;
-;; Where symbol is the type of thing it is.  START and END mark that
-;; objects boundary.
-
 (defvar semantic-flex-tokens semantic-lex-tokens
   "An alist of semantic token types.
 See variable `semantic-lex-tokens'.")
+(make-obsolete-variable 'semantic-flex-tokens
+                        'semantic-lex-tokens "28.1")
 
 (defvar semantic-flex-unterminated-syntax-end-function
   (lambda (_syntax _syntax-start flex-end) flex-end)
@@ -1788,6 +1770,8 @@ semantic-flex-unterminated-syntax-end-function
 This function can be used for languages that can intelligently fix up
 broken syntax, or the exit lexical analysis via `throw' or `signal'
 when finding unterminated syntax.")
+(make-obsolete-variable 'semantic-flex-unterminated-syntax-end-function
+                        nil "28.1")
 
 (defvar semantic-flex-extensions nil
   "Buffer local extensions to the lexical analyzer.
@@ -1799,6 +1783,7 @@ semantic-flex-extensions
 TYPE can be any type of symbol, as long as it doesn't occur as a
 nonterminal in the language definition.")
 (make-variable-buffer-local 'semantic-flex-extensions)
+(make-obsolete-variable 'semantic-flex-extensions nil "28.1")
 
 (defvar semantic-flex-syntax-modifications nil
   "Changes to the syntax table for this buffer.
@@ -1809,237 +1794,47 @@ semantic-flex-syntax-modifications
 and CLASS is the string also passed to `modify-syntax-entry' to define
 what syntax class CHAR has.")
 (make-variable-buffer-local 'semantic-flex-syntax-modifications)
+(make-obsolete-variable 'semantic-flex-syntax-modifications nil "28.1")
 
 (defvar semantic-ignore-comments t
   "Default comment handling.
 The value t means to strip comments when flexing; nil means
 to keep comments as part of the token stream.")
 (make-variable-buffer-local 'semantic-ignore-comments)
+(make-obsolete-variable 'semantic-ignore-comments nil "28.1")
 
 (defvar semantic-flex-enable-newlines nil
   "When flexing, report newlines as syntactic elements.
 Useful for languages where the newline is a special case terminator.
 Only set this on a per mode basis, not globally.")
 (make-variable-buffer-local 'semantic-flex-enable-newlines)
+(make-obsolete-variable 'semantic-flex-enable-newlines nil "28.1")
 
 (defvar semantic-flex-enable-whitespace nil
   "When flexing, report whitespace as syntactic elements.
 Useful for languages where the syntax is whitespace dependent.
 Only set this on a per mode basis, not globally.")
 (make-variable-buffer-local 'semantic-flex-enable-whitespace)
+(make-obsolete-variable 'semantic-flex-enable-whitespace nil "28.1")
 
 (defvar semantic-flex-enable-bol nil
   "When flexing, report beginning of lines as syntactic elements.
 Useful for languages like python which are indentation sensitive.
 Only set this on a per mode basis, not globally.")
 (make-variable-buffer-local 'semantic-flex-enable-bol)
+(make-obsolete-variable 'semantic-flex-enable-bol nil "28.1")
 
 (defvar semantic-number-expression semantic-lex-number-expression
   "See variable `semantic-lex-number-expression'.")
 (make-variable-buffer-local 'semantic-number-expression)
+(make-obsolete-variable 'semantic-number-expression
+                        'semantic-lex-number-expression "28.1")
 
 (defvar semantic-flex-depth 0
   "Default flexing depth.
 This specifies how many lists to create tokens in.")
 (make-variable-buffer-local 'semantic-flex-depth)
-
-(defun semantic-flex (start end &optional depth length)
-  "Using the syntax table, do something roughly equivalent to flex.
-Semantically check between START and END.  Optional argument DEPTH
-indicates at what level to scan over entire lists.
-The return value is a token stream.  Each element is a list, such of
-the form (symbol start-expression .  end-expression) where SYMBOL
-denotes the token type.
-See `semantic-flex-tokens' variable for details on token types.
-END does not mark the end of the text scanned, only the end of the
-beginning of text scanned.  Thus, if a string extends past END, the
-end of the return token will be larger than END.  To truly restrict
-scanning, use `narrow-to-region'.
-The last argument, LENGTH specifies that `semantic-flex' should only
-return LENGTH tokens."
-  (declare (obsolete define-lex "23.2"))
-  (if (not semantic-flex-keywords-obarray)
-      (setq semantic-flex-keywords-obarray [ nil ]))
-  (let ((ts nil)
-        (pos (point))
-        (ep nil)
-        (curdepth 0)
-        (cs (if comment-start-skip
-                (concat "\\(\\s<\\|" comment-start-skip "\\)")
-              (concat "\\(\\s<\\)")))
-        (newsyntax (copy-syntax-table (syntax-table)))
-        (mods semantic-flex-syntax-modifications)
-        ;; Use the default depth if it is not specified.
-        (depth (or depth semantic-flex-depth)))
-    ;; Update the syntax table
-    (while mods
-      (modify-syntax-entry (car (car mods)) (car (cdr (car mods))) newsyntax)
-      (setq mods (cdr mods)))
-    (with-syntax-table newsyntax
-      (goto-char start)
-      (while (and (< (point) end) (or (not length) (<= (length ts) length)))
-        (cond
-         ;; catch beginning of lines when needed.
-         ;; Must be done before catching any other tokens!
-         ((and semantic-flex-enable-bol
-               (bolp)
-               ;; Just insert a (bol N . N) token in the token stream,
-               ;; without moving the point.  N is the point at the
-               ;; beginning of line.
-               (setq ts (cons (cons 'bol (cons (point) (point))) ts))
-               nil)) ;; CONTINUE
-         ;; special extensions, includes whitespace, nl, etc.
-         ((and semantic-flex-extensions
-               (let ((fe semantic-flex-extensions)
-                     (r nil))
-                 (while fe
-                   (if (looking-at (car (car fe)))
-                       (setq ts (cons (funcall (cdr (car fe))) ts)
-                             r t
-                             fe nil
-                             ep (point)))
-                   (setq fe (cdr fe)))
-                 (if (and r (not (car ts))) (setq ts (cdr ts)))
-                 r)))
-         ;; catch newlines when needed
-         ((looking-at "\\s-*\\(\n\\|\\s>\\)")
-          (if semantic-flex-enable-newlines
-              (setq ep (match-end 1)
-                    ts (cons (cons 'newline
-                                   (cons (match-beginning 1) ep))
-                             ts))))
-         ;; catch whitespace when needed
-         ((looking-at "\\s-+")
-          (if semantic-flex-enable-whitespace
-              ;; Language wants whitespaces, link them together.
-              (if (eq (car (car ts)) 'whitespace)
-                  (setcdr (cdr (car ts)) (match-end 0))
-                (setq ts (cons (cons 'whitespace
-                                     (cons (match-beginning 0)
-                                           (match-end 0)))
-                               ts)))))
-         ;; numbers
-         ((and semantic-number-expression
-               (looking-at semantic-number-expression))
-          (setq ts (cons (cons 'number
-                               (cons (match-beginning 0)
-                                     (match-end 0)))
-                         ts)))
-         ;; symbols
-         ((looking-at "\\(\\sw\\|\\s_\\)+")
-          (setq ts (cons (cons
-                          ;; Get info on if this is a keyword or not
-                          (or (semantic-lex-keyword-p (match-string 0))
-                              'symbol)
-                          (cons (match-beginning 0) (match-end 0)))
-                         ts)))
-         ;; Character quoting characters (ie, \n as newline)
-         ((looking-at "\\s\\+")
-          (setq ts (cons (cons 'charquote
-                               (cons (match-beginning 0) (match-end 0)))
-                         ts)))
-         ;; Open parens, or semantic-lists.
-         ((looking-at "\\s(")
-          (if (or (not depth) (< curdepth depth))
-              (progn
-                (setq curdepth (1+ curdepth))
-                (setq ts (cons (cons 'open-paren
-                                     (cons (match-beginning 0) (match-end 0)))
-                               ts)))
-            (setq ts (cons
-                      (cons 'semantic-list
-                            (cons (match-beginning 0)
-                                  (save-excursion
-                                    (condition-case nil
-                                        (forward-list 1)
-                                      ;; This case makes flex robust
-                                      ;; to broken lists.
-                                      (error
-                                       (goto-char
-                                        (funcall
-                                         semantic-flex-unterminated-syntax-end-function
-                                         'semantic-list
-                                         start end))))
-                                    (setq ep (point)))))
-                      ts))))
-         ;; Close parens
-         ((looking-at "\\s)")
-          (setq ts (cons (cons 'close-paren
-                               (cons (match-beginning 0) (match-end 0)))
-                         ts))
-          (setq curdepth (1- curdepth)))
-         ;; String initiators
-         ((looking-at "\\s\"")
-          ;; Zing to the end of this string.
-          (setq ts (cons (cons 'string
-                               (cons (match-beginning 0)
-                                     (save-excursion
-                                       (condition-case nil
-                                           (forward-sexp 1)
-                                         ;; This case makes flex
-                                         ;; robust to broken strings.
-                                         (error
-                                          (goto-char
-                                           (funcall
-                                            semantic-flex-unterminated-syntax-end-function
-                                            'string
-                                            start end))))
-                                       (setq ep (point)))))
-                         ts)))
-         ;; comments
-         ((looking-at cs)
-          (if (and semantic-ignore-comments
-                   (not semantic-flex-enable-whitespace))
-              ;; If the language doesn't deal with comments nor
-              ;; whitespaces, ignore them here.
-              (let ((comment-start-point (point)))
-                (forward-comment 1)
-                (if (eq (point) comment-start-point)
-                    ;; In this case our start-skip string failed
-                    ;; to work properly.  Lets try and move over
-                    ;; whatever white space we matched to begin
-                    ;; with.
-                    (skip-syntax-forward "-.'" (point-at-eol))
-                  ;;(forward-comment 1)
-                  ;; Generate newline token if enabled
-                  (if (and semantic-flex-enable-newlines
-                           (bolp))
-                      (backward-char 1)))
-                (if (eq (point) comment-start-point)
-                    (error "Strange comment syntax prevents lexical analysis"))
-                (setq ep (point)))
-            (let ((tk (if semantic-ignore-comments 'whitespace 'comment)))
-              (save-excursion
-                (forward-comment 1)
-                ;; Generate newline token if enabled
-                (if (and semantic-flex-enable-newlines
-                         (bolp))
-                    (backward-char 1))
-                (setq ep (point)))
-              ;; Language wants comments or want them as whitespaces,
-              ;; link them together.
-              (if (eq (car (car ts)) tk)
-                  (setcdr (cdr (car ts)) ep)
-                (setq ts (cons (cons tk (cons (match-beginning 0) ep))
-                               ts))))))
-         ;; punctuation
-         ((looking-at "\\(\\s.\\|\\s$\\|\\s'\\)")
-          (setq ts (cons (cons 'punctuation
-                               (cons (match-beginning 0) (match-end 0)))
-                         ts)))
-         ;; unknown token
-         (t
-          (error "What is that?")))
-        (goto-char (or ep (match-end 0)))
-        (setq ep nil)))
-    ;; maybe catch the last beginning of line when needed
-    (and semantic-flex-enable-bol
-         (= (point) end)
-         (bolp)
-         (setq ts (cons (cons 'bol (cons (point) (point))) ts)))
-    (goto-char pos)
-    ;;(message "Flexing muscles...done")
-    (nreverse ts)))
+(make-obsolete-variable 'semantic-flex-depth nil "28.1")
 
 (provide 'semantic/lex)
 
diff --git a/lisp/cedet/semantic/tag-file.el b/lisp/cedet/semantic/tag-file.el
index 50d43fe934..23f4b29cbd 100644
--- a/lisp/cedet/semantic/tag-file.el
+++ b/lisp/cedet/semantic/tag-file.el
@@ -101,9 +101,6 @@ semantic-go-to-tag
    )
   )
 
-(make-obsolete-overload 'semantic-find-nonterminal
-                        'semantic-go-to-tag "23.2")
-
 ;;; Dependencies
 ;;
 ;; A tag which is of type 'include specifies a dependency.
@@ -175,9 +172,6 @@ semantic-dependency-tag-file
 	nil)
       )))
 
-(make-obsolete-overload 'semantic-find-dependency
-                        'semantic-dependency-tag-file "23.2")
-
 ;;; PROTOTYPE FILE
 ;;
 ;; In C, a function in the .c file often has a representation in a
@@ -199,13 +193,6 @@ semantic-prototype-file
        (if (re-search-forward "::Header:: \\([a-zA-Z0-9.]+\\)" nil t)
            (match-string 1))))))
 
-(semantic-alias-obsolete 'semantic-find-nonterminal
-                         'semantic-go-to-tag "23.2")
-
-(semantic-alias-obsolete 'semantic-find-dependency
-                         'semantic-dependency-tag-file "23.2")
-
-
 (provide 'semantic/tag-file)
 
 ;; Local variables:
diff --git a/lisp/cedet/semantic/tag-ls.el b/lisp/cedet/semantic/tag-ls.el
index 16179a53cd..3ee11df7d8 100644
--- a/lisp/cedet/semantic/tag-ls.el
+++ b/lisp/cedet/semantic/tag-ls.el
@@ -190,7 +190,7 @@ semantic-tag-similar-p-default
 ;; will contain the info needed to determine the full name.
 (define-overloadable-function semantic-tag-full-package (tag &optional stream-or-buffer)
   "Return the fully qualified package name of TAG in a package hierarchy.
-STREAM-OR-BUFFER can be anything convertible by `semantic-something-to-stream',
+STREAM-OR-BUFFER can be anything convertible by `semantic-something-to-tag-table',
 but must be a toplevel semantic tag stream that contains TAG.
 A Package Hierarchy is defined in UML by the way classes and methods
 are organized on disk.  Some languages use this concept such that a
@@ -213,7 +213,7 @@ semantic-tag-full-package-default
 
 (define-overloadable-function semantic-tag-full-name (tag &optional stream-or-buffer)
   "Return the fully qualified name of TAG in the package hierarchy.
-STREAM-OR-BUFFER can be anything convertible by `semantic-something-to-stream',
+STREAM-OR-BUFFER can be anything convertible by `semantic-something-to-tag-table',
 but must be a toplevel semantic tag stream that contains TAG.
 A Package Hierarchy is defined in UML by the way classes and methods
 are organized on disk.  Some languages use this concept such that a
@@ -233,9 +233,6 @@ semantic-tag-full-name
                  (or stream-or-buffer tag))))
     (:override-with-args (tag stream))))
 
-(make-obsolete-overload 'semantic-nonterminal-full-name
-                        'semantic-tag-full-name "23.2")
-
 (defun semantic-tag-full-name-default (tag stream)
   "Default method for `semantic-tag-full-name'.
 Return the name of TAG found in the toplevel STREAM."
@@ -287,9 +284,6 @@ semantic-tag-protection
        (setq parent (semantic-tag-calculate-parent tag)))
   (:override))
 
-(make-obsolete-overload 'semantic-nonterminal-protection
-                        'semantic-tag-protection "23.2")
-
 (defun semantic-tag-protection-default (tag &optional parent)
   "Return the protection of TAG as a child of PARENT default action.
 See `semantic-tag-protection'."
@@ -377,9 +371,6 @@ semantic-tag-abstract-p
 The default behavior (if not overridden with `tag-abstract-p'
 is to return true if `abstract' is in the type modifiers.")
 
-(make-obsolete-overload 'semantic-nonterminal-abstract
-                        'semantic-tag-abstract-p "23.2")
-
 (defun semantic-tag-abstract-p-default (tag &optional parent)
   "Return non-nil if TAG is abstract as a child of PARENT default action.
 See `semantic-tag-abstract-p'."
@@ -400,9 +391,6 @@ semantic-tag-leaf-p
 The default behavior (if not overridden with `tag-leaf-p'
 is to return true if `leaf' is in the type modifiers.")
 
-(make-obsolete-overload 'semantic-nonterminal-leaf
-                        'semantic-tag-leaf-p "23.2")
-
 (defun semantic-tag-leaf-p-default (tag &optional parent)
   "Return non-nil if TAG is leaf as a child of PARENT default action.
 See `semantic-tag-leaf-p'."
diff --git a/lisp/cedet/semantic/tag.el b/lisp/cedet/semantic/tag.el
index ca5c068d34..e677264c5a 100644
--- a/lisp/cedet/semantic/tag.el
+++ b/lisp/cedet/semantic/tag.el
@@ -1328,26 +1328,6 @@ semantic-token-version
 (defconst semantic-token-incompatible-version
   semantic-tag-incompatible-version)
 
-(defsubst semantic-token-type-parent (tag)
-  "Return the parent of the type that TAG describes.
-The return value is a list.  A value of nil means no parents.
-The `car' of the list is either the parent class, or a list
-of parent classes.  The `cdr' of the list is the list of
-interfaces, or abstract classes which are parents of TAG."
-  (cons (semantic-tag-get-attribute tag :superclasses)
-        (semantic-tag-type-interfaces tag)))
-
-(make-obsolete 'semantic-token-type-parent
-	       "\
-use `semantic-tag-type-superclass' \
-and `semantic-tag-type-interfaces' instead" "23.2")
-
-(semantic-alias-obsolete 'semantic-tag-make-assoc-list
-                         'semantic-tag-make-plist "23.2")
-
-(semantic-varalias-obsolete 'semantic-expand-nonterminal
-                            'semantic-tag-expand-function "23.2")
-
 (provide 'semantic/tag)
 
 ;; Local variables:
diff --git a/lisp/cedet/semantic/util.el b/lisp/cedet/semantic/util.el
index c64d56b2e2..7df7dfcb75 100644
--- a/lisp/cedet/semantic/util.el
+++ b/lisp/cedet/semantic/util.el
@@ -79,9 +79,6 @@ semantic-file-tag-table
 	(with-current-buffer (find-file-noselect file)
 	  (semantic-fetch-tags))))))
 
-(semantic-alias-obsolete 'semantic-file-token-stream
-			 'semantic-file-tag-table "23.2")
-
 (declare-function semanticdb-abstract-table-child-p "semantic/db" (obj) t)
 (declare-function semanticdb-refresh-table "semantic/db")
 (declare-function semanticdb-get-tags "semantic/db" (arg &rest args) t)
@@ -137,9 +134,6 @@ semantic-something-to-tag-table
    ;; don't know what it is
    (t nil)))
 
-(semantic-alias-obsolete 'semantic-something-to-stream
-			 'semantic-something-to-tag-table "23.2")
-
 ;;; Completion APIs
 ;;
 ;; These functions provide minibuffer reading/completion for lists of
@@ -307,7 +301,6 @@ semantic-describe-buffer
 		      semantic-init-db-hook
 		      semantic-unmatched-syntax-hook
 		      semantic--before-fetch-tags-hook
-		      semantic-after-toplevel-bovinate-hook
 		      semantic-after-toplevel-cache-change-hook
 		      semantic-before-toplevel-cache-flush-hook
 		      semantic-dump-parse
diff --git a/lisp/cedet/semantic/wisent.el b/lisp/cedet/semantic/wisent.el
index 527a35c9ae..15d1313dfa 100644
--- a/lisp/cedet/semantic/wisent.el
+++ b/lisp/cedet/semantic/wisent.el
@@ -43,11 +43,6 @@ wisent-lex-lookahead
   "Extra lookahead token.
 When non-nil it is directly returned by `wisent-lex-function'.")
 
-;; Maintain this alias for compatibility until all WY grammars have
-;; been translated again to Elisp code.
-(semantic-alias-obsolete 'wisent-lex-make-token-table
-                         'semantic-lex-make-type-table "23.2")
-
 (defmacro wisent-lex-eoi ()
   "Return an End-Of-Input lexical token.
 The EOI token is like this: ($EOI \"\" POINT-MAX . POINT-MAX)."
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-09-04 17:04                 ` Stefan Kangas
@ 2020-09-05 12:39                   ` Lars Ingebrigtsen
  2020-09-11 20:01                     ` Stefan Kangas
  0 siblings, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-09-05 12:39 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Stefan Monnier, Drew Adams, emacs-devel

Stefan Kangas <stefankangas@gmail.com> writes:

> Stefan Kangas <stefankangas@gmail.com> writes:
>
>> The next step here is the obsoletions in semantic.
>
> Please find attached a patch to remove obsolete items also from cedet.
>
> Any comments?

I just skimmed it, but it looks good to me.  Perhaps this comment should
also be deleted?

>  ;; NOTE: DELETE THIS SOMEDAY SOON
>  
> -(semantic-alias-obsolete 'semantic-flex-start 'semantic-lex-token-start "23.2")

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Delete variables obsolete since Emacs 23
  2020-09-05 12:39                   ` Lars Ingebrigtsen
@ 2020-09-11 20:01                     ` Stefan Kangas
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-09-11 20:01 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Stefan Monnier, Drew Adams, emacs-devel

Lars Ingebrigtsen <larsi@gnus.org> writes:

>> Please find attached a patch to remove obsolete items also from cedet.
>
> I just skimmed it, but it looks good to me.  Perhaps this comment should
> also be deleted?
>
>>  ;; NOTE: DELETE THIS SOMEDAY SOON
>>
>> -(semantic-alias-obsolete 'semantic-flex-start 'semantic-lex-token-start "23.2")

Thanks for the review.

I removed the above line and pushed to master as commit 91a221b279.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Proposal for an Emacs User Survey
@ 2020-10-08 15:30 Adrien Brochard
  2020-10-08 17:27 ` Philip K.
                   ` (3 more replies)
  0 siblings, 4 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-08 15:30 UTC (permalink / raw)
  To: emacs-devel

Hi everyone,

I posted on reddit.com/r/emacs yesterday a proposal to craft and
distribute a survey for Emacs users to better grasp the diversity and
various usages out there. I got some very good feedback but there could
always be more.

The main points that need to be worked out are:
1. the actual questions to be asked
2. the platform to collect responses

Regarding the questions, I have a decent skeleton and a lot of suggestions.

But the for the platform to collect responses, this is where it gets
difficult. Something like a Google survey might the easiest/cheapest to
make and distribute and will work on most devices, but it obviously has
privacy concerns. On the other hand, doing something like self-hosting a
no-JS form is very time consuming. I was also thinking of allowing
responses via email for people who do not want to bother with a survey
link and then manually reconcile responses.

Links to the posts with the tentative questions:
-
https://www.reddit.com/r/emacs/comments/j6x7ad/proposal_for_an_emacs_user_survey/
-
https://www.reddit.com/r/emacs/comments/b2fh4y/help_reviewprovide_feedback_on_state_of_emacs/

Thank you for reading!
Best,
Adrien



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-08 15:30 Proposal for an Emacs User Survey Adrien Brochard
@ 2020-10-08 17:27 ` Philip K.
  2020-10-08 17:45   ` Adrien Brochard
  2020-10-09  0:41 ` Karl Fogel
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-10-08 17:27 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

Adrien Brochard <abrochard@gmx.com> writes:

> Hi everyone,
>
> I posted on reddit.com/r/emacs yesterday a proposal to craft and
> distribute a survey for Emacs users to better grasp the diversity and
> various usages out there. I got some very good feedback but there could
> always be more.
>
> The main points that need to be worked out are:
> 1. the actual questions to be asked
> 2. the platform to collect responses

I think a major problem is how to get as many emacs users -- and not
only reddit -- to participate. There are plenty of Emacs users who
neither follow the mailing lists, nor use sites like Reddit. Many of
them have had similar setups for years, and don't need to think about
it. Of course I can inform those I am antiquated with, but that approach
has it's limits.

There is a disconnect between these two groups. Of course, neither is
"right". I've seen "traditional users" who didn't know that M-x could be
invoked using the alt key (instead pressing escape and then "x"), and
newer users who use try to get as much of emacs out of the way, to use
things like org or magit. My fear is that those in the latter group are
more likely to hear about a poll like this, and be overrepresented at
the expense of the former. And without a way to prove anything, either
way, no real progress could be achieved -- one group will keep on saying
that "it's time to become vs code" and the others will invoke a virtual
"silent minority".

> Regarding the questions, I have a decent skeleton and a lot of suggestions.
>
> But the for the platform to collect responses, this is where it gets
> difficult. Something like a Google survey might the easiest/cheapest to
> make and distribute and will work on most devices, but it obviously has
> privacy concerns. On the other hand, doing something like self-hosting a
> no-JS form is very time consuming. I was also thinking of allowing
> responses via email for people who do not want to bother with a survey
> link and then manually reconcile responses.

Why not just create a simple HTML form with a captcha (not Google's
thing, but a simple library that generates an image)?

> Links to the posts with the tentative questions:
> -
> https://www.reddit.com/r/emacs/comments/j6x7ad/proposal_for_an_emacs_user_survey/
> -
> https://www.reddit.com/r/emacs/comments/b2fh4y/help_reviewprovide_feedback_on_state_of_emacs/
>
> Thank you for reading!
> Best,
> Adrien
>
>

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-08 17:27 ` Philip K.
@ 2020-10-08 17:45   ` Adrien Brochard
  2020-10-09 11:30     ` Philip K.
  2020-10-09 17:59     ` Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-08 17:45 UTC (permalink / raw)
  To: Philip K.; +Cc: emacs-devel

Thank you for your response!

>
> I think a major problem is how to get as many emacs users -- and not
> only reddit -- to participate. There are plenty of Emacs users who
> neither follow the mailing lists, nor use sites like Reddit. Many of
> them have had similar setups for years, and don't need to think about
> it. Of course I can inform those I am antiquated with, but that approach
> has it's limits.

There is a real risk indeed of selection bias because it is hard to
reach out to people who are not on the mailing list or on popular
channels. I identified this issue on the reddit post, but aside from
sharing the survey on the mailing list/reddit/irc/telegram/blogs and
keeping the survey open for 1 month, I am not sure how to mitigate more.
It is in a way the fundamental problem of surveys though. And I should
specify that there's value in just getting any response, and that we
should be mindful of this selection bias risk and not make carefree
decisions based on the survey results.

> Why not just create a simple HTML form with a captcha (not Google's
> thing, but a simple library that generates an image)?

I know it sounds easy, but it can rapidly become a considerable amount
of work. The captcha is not trivial and then there's the question of the
backend and where the data goes. To limit barrier of entry, the survey
must be as easy to fill out as possible. That means that we can't have
downtime, lag, and work on mobile too. I am more inclined to trust that
work to professionals and have to pay a little for it.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-08 15:30 Proposal for an Emacs User Survey Adrien Brochard
  2020-10-08 17:27 ` Philip K.
@ 2020-10-09  0:41 ` Karl Fogel
  2020-10-09  1:26   ` Adrien Brochard
  2020-10-10  3:52   ` Richard Stallman
  2020-10-09  3:35 ` Richard Stallman
  2020-10-19 16:20 ` Philip K.
  3 siblings, 2 replies; 838+ messages in thread
From: Karl Fogel @ 2020-10-09  0:41 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

On 08 Oct 2020, Adrien Brochard wrote:
>But the for the platform to collect responses, this is where it gets
>difficult. Something like a Google survey might the easiest/cheapest to
>make and distribute and will work on most devices, but it obviously has
>privacy concerns. On the other hand, doing something like self-hosting a
>no-JS form is very time consuming. I was also thinking of allowing
>responses via email for people who do not want to bother with a survey
>link and then manually reconcile responses.

There is a free software web-based survey tool named LimeSurvey:

  - https://en.wikipedia.org/wiki/LimeSurvey

  - https://github.com/LimeSurvey/LimeSurvey

  - https://www.limesurvey.org

LimeSurvey.org seems to actually be a company that provides commercial hosting.  It's not clear to me whether the version they host is just the free software version or whether it has some proprietary bits added, but in any case one could just run the free software version oneself.  (I know a project that did so many years ago, and they had a good experience with it, FWIW.)

Best regards,
-Karl



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09  0:41 ` Karl Fogel
@ 2020-10-09  1:26   ` Adrien Brochard
  2020-10-10  3:52   ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-09  1:26 UTC (permalink / raw)
  To: Karl Fogel; +Cc: emacs-devel

> There is a free software web-based survey tool named LimeSurvey:
>
>    - https://en.wikipedia.org/wiki/LimeSurvey
>
>    - https://github.com/LimeSurvey/LimeSurvey
>
>    - https://www.limesurvey.org
>
> LimeSurvey.org seems to actually be a company that provides commercial hosting.  It's not clear to me whether the version they host is just the free software version or whether it has some proprietary bits added, but in any case one could just run the free software version oneself.  (I know a project that did so many years ago, and they had a good experience with it, FWIW.)
>
> Best regards,
> -Karl

Thank you for the tip! I did look into that after someone recommended
it. I like it, the main problem is indeed that I would have to
self-host, which is not something I am comfortable doing at this point,
at least not with the first iteration. And on the other side, their
hosted version is very expensive unfortunately.

Best,
Adrien



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-08 15:30 Proposal for an Emacs User Survey Adrien Brochard
  2020-10-08 17:27 ` Philip K.
  2020-10-09  0:41 ` Karl Fogel
@ 2020-10-09  3:35 ` Richard Stallman
  2020-10-09 18:01   ` Jean Louis
  2020-10-09 23:12   ` Adrien Brochard
  2020-10-19 16:20 ` Philip K.
  3 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-09  3:35 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

I think using Google to communicate the users is bad because Google
does so many bad things.  We should not endorse it with our actions.

In addition, most Google services require users to run nonfree
software (Javascript code).  If answering our questions requires the
user to run some nonfree JS code, that would put us in a moral
contradiction.

Our goal is much more than just developing a successful editor; GNU
Emacs is a GNU package, and the purpose of the GNU operating system is
to win freedom for the users.  We have to set an example of respecting
and defending freedom in the methods we use, not just the program we
are working on.  See https://gnu.org/philosophy/free-sw.html and
https://gnu.org/philosophy/free-software-even-more-important.html.

I think Reddit is the wrong place to discuss this plan, for a similar
reason.  As I understand it, Reddit requires nonfree software to post
on Reddit nowadays.  Is that not so?

The place to discuss the questions is here.  Would you please post
here your proposal for the questions to ask?


Meanwhile,

Here's the method I propose for inquiries (we used to call them "polls")
about users' views about possible changes in well-known behaviors.

* Make a file for the replies to go into.

* Make a mailing address which drops all mail into the file.

* Write a inquiry statement which describes the proposed change in
sufficient detail that people can judge it, what kind of information
we seek, and where to email the response.  Include a deadline for
replies at least 6 weeks in the future.

If possible, we should tell users how to select various behaviors, so
that they can state their opinions based on comparing actual
experiences.

End the inquiry statement with the following text.

    We do not seek "votes", but rather understanding.  If you are for
    the change, please explain why.  Would it help you directly?  If
    so, in what scenarios?  How often, and how strongly, would it
    benefit you?  What would the benefit be?

    Or is it that you think it will improve Emacs, or speed Emacs
    development, by helping other users?  How so?

    Please distinguish between what you know and what you predict.

    Likewise, if you are against the change, please explain why.
    Would it inconvenience you directly?  If so, in what scenarios?
    How often, and how strongly, would it inconvenience you?  What
    would the inconvenience be?

    Or is it that you think it will harm Emacs or Emacs development by
    inconveniencing others?  How so?

    We invite you also to propose alterations in the proposed change that
    you think would improve it -- saying in what scenario that would be an
    improvement, and how so, etc.

    Please post the URL of this page in forums where it is appropriate,
    and resend it to Emacs users and mailing lists where you know people
    will be glad to receive it.

It is crucial to urge people repeatedly to explain their positions
because there is a strong tendency for people not to bother.

* Put the inquiry statement in a web page under gnu.org/software/emacs.

* Mail the inquiry statement info-gnu-emacs, help-gnu-emacs and
emacs-tangents, with the URL of the web page _and_ the full text
of the inquiry statement.

Also post a note referring to the web page on reddit.com/r/emacs, and
any other suitable places.  Mail the URL to Sacha Chua
<sacha@sachachua.com>.

* Wait until at least two weeks after the deadline, then study and
record the responses.  Note down all interesting comments, since they
are the most important information in the responses.

* Do count how many people support each position that people support,
but it would be a mistake to make the actual decision based simply on
counting.  A given change can affect one user very often, and affect
another user only rarely, but they could both state a "strong
preference".

* We are not compelled to choose between "make that change" and "no
change".  The best outcome of the inquiry is that the responses show
us how to design a way to please almost all users, almost all the
time, and not displease any user very much.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-08 17:45   ` Adrien Brochard
@ 2020-10-09 11:30     ` Philip K.
  2020-10-09 14:37       ` tomas
  2020-10-09 17:23       ` Adrien Brochard
  2020-10-09 17:59     ` Jean Louis
  1 sibling, 2 replies; 838+ messages in thread
From: Philip K. @ 2020-10-09 11:30 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

Adrien Brochard <abrochard@gmx.com> writes:

>> Why not just create a simple HTML form with a captcha (not Google's
>> thing, but a simple library that generates an image)?
>
> I know it sounds easy, but it can rapidly become a considerable amount
> of work. The captcha is not trivial and then there's the question of the
> backend and where the data goes. To limit barrier of entry, the survey
> must be as easy to fill out as possible. That means that we can't have
> downtime, lag, and work on mobile too. I am more inclined to trust that
> work to professionals and have to pay a little for it.

For the fun of it, I wrote a simple survey application[0] that includes
a self-hosted captcha (without tracking anyone), requires no Javascript,
is mobile friendly and should be fairly fast. Of course it can be
improved. I wrote it as a quick and dirty evening project, but I
think it demonstrates that this kind of an approach is practicable.

[0] https://git.sr.ht/~zge/survey

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 11:30     ` Philip K.
@ 2020-10-09 14:37       ` tomas
  2020-10-09 17:23       ` Adrien Brochard
  1 sibling, 0 replies; 838+ messages in thread
From: tomas @ 2020-10-09 14:37 UTC (permalink / raw)
  To: Philip K.; +Cc: Adrien Brochard, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 320 bytes --]

On Fri, Oct 09, 2020 at 01:30:48PM +0200, Philip K. wrote:

[...]

> For the fun of it, I wrote a simple survey application[0] [...]

Thanks! I'll look into it. Perhaps I'll even steal something
from it -- I'll let you know.

Who knows. We might need something akin to suckless, for the web :)

Cheers
 - t

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 11:30     ` Philip K.
  2020-10-09 14:37       ` tomas
@ 2020-10-09 17:23       ` Adrien Brochard
  2020-10-09 18:17         ` Philip K.
  1 sibling, 1 reply; 838+ messages in thread
From: Adrien Brochard @ 2020-10-09 17:23 UTC (permalink / raw)
  To: Philip K.; +Cc: emacs-devel

> For the fun of it, I wrote a simple survey application[0] that includes
> a self-hosted captcha (without tracking anyone), requires no Javascript,
> is mobile friendly and should be fairly fast. Of course it can be
> improved. I wrote it as a quick and dirty evening project, but I
> think it demonstrates that this kind of an approach is practicable.
>
> [0] https://git.sr.ht/~zge/survey

Thank you! I really like reading go code (no sarcasm).
It it clear that this approach will work but the remaining 20% are the
hardest. I'm concerned with:
- cleaner UI, not just HTML embedded in the code
- mysql instead of sqlite, which also implies a mysql instance running
- DOS protection, maybe some rate-limiting and IP blocking
- HTTPS, thankfully it's easier now
- monitoring, how do we know the service is running as expected
- logging, and how to store logs for debug

My greatest fear is people clicking on the link, filling out the form,
trying to submit, seeing an error page, and never coming back to it.

Best,
Adrien



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-08 17:45   ` Adrien Brochard
  2020-10-09 11:30     ` Philip K.
@ 2020-10-09 17:59     ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-09 17:59 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: Philip K., emacs-devel

* Adrien Brochard <abrochard@gmx.com> [2020-10-08 20:51]:
> > Why not just create a simple HTML form with a captcha (not Google's
> > thing, but a simple library that generates an image)?

I am not using any captcha, simple HTML and server-side spam
blocking. For that, two activities are necessary:

- administrator to watch for eventual spam, and it will take time
  until spam starts coming

- adding list of keywords into the spam-definition

In Common lisp I have something like this that accepts CGI forms:

(defparameter *spam-sets*
  '(("gratitude" "website" "magnificent" "investigation")
    ("face" "mask" "coronavirus")
    ("face" "mask")
    ("blackhat.to")
    ("disposable" "mask")
    ("medical" "mask")
    ("mask" "protect")
    ("mask" "virus")))

Only if all keywords appear, the text is rejected.

In my opinion, it is better that administrator does administration
then having all users checked for "being human" and spending time with
the form.

Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09  3:35 ` Richard Stallman
@ 2020-10-09 18:01   ` Jean Louis
  2020-10-09 23:12   ` Adrien Brochard
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-09 18:01 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Adrien Brochard, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-09 06:37]:
> * Make a file for the replies to go into.
> 
> * Make a mailing address which drops all mail into the file.

That was specific proposal, it sounds good, I wish to understand who
will implement it?

Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 17:23       ` Adrien Brochard
@ 2020-10-09 18:17         ` Philip K.
  2020-10-09 19:52           ` Adrien Brochard
  0 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-10-09 18:17 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

Adrien Brochard <abrochard@gmx.com> writes:

>> For the fun of it, I wrote a simple survey application[0] that includes
>> a self-hosted captcha (without tracking anyone), requires no Javascript,
>> is mobile friendly and should be fairly fast. Of course it can be
>> improved. I wrote it as a quick and dirty evening project, but I
>> think it demonstrates that this kind of an approach is practicable.
>>
>> [0] https://git.sr.ht/~zge/survey
>
> Thank you! I really like reading go code (no sarcasm).
> It it clear that this approach will work but the remaining 20% are the
> hardest.  I'm concerned with:
> - cleaner UI, not just HTML embedded in the code

What would you have in mind? I know that my example is simple, but I
prefer that to sites that take forever to load and reload everything all
the time, for no apparent reason.

> - mysql instead of sqlite, which also implies a mysql instance running

SQLite is actually surprisingly resilient, according to [0]:

> SQLite works great as the database engine for most low to medium traffic
> websites (which is to say, most websites). The amount of web traffic
> that SQLite can handle depends on how heavily the website uses its
> database. Generally speaking, any site that gets fewer than 100K
> hits/day should work fine with SQLite. The 100K hits/day figure is a
> conservative estimate, not a hard upper bound. SQLite has been
> demonstrated to work with 10 times that amount of traffic.

But either way, I used sqlite to avoid setting up a RDBMS.

[0] https://www.sqlite.org/whentouse.html

> - DOS protection, maybe some rate-limiting and IP blocking
> - HTTPS, thankfully it's easier now

AFAIK these things can usually be handled by a frond-end such as NGINX.

> - monitoring, how do we know the service is running as expected
> - logging, and how to store logs for debug

If there is any interest, extending the example to support this would be
feasible. The "20%" you mention aren't easy, but from what I see it
shouldn't be too hard either.

> My greatest fear is people clicking on the link, filling out the form,
> trying to submit, seeing an error page, and never coming back to it.

The reason I suggested using a simple HTML form and implemented the demo
was because I think simplicity helps avoid a lot of issues. With fewer
dependencies, secondary services, modules, etc. the chance of one of
these failing decreases. And having a smaller footprint should also
reduce the network load.

> Best,
> Adrien

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 18:17         ` Philip K.
@ 2020-10-09 19:52           ` Adrien Brochard
  2020-10-10  3:56             ` Richard Stallman
  2020-10-10 10:35             ` Philip K.
  0 siblings, 2 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-09 19:52 UTC (permalink / raw)
  To: Philip K.; +Cc: emacs-devel

>> - cleaner UI, not just HTML embedded in the code
>
> What would you have in mind? I know that my example is simple, but I
> prefer that to sites that take forever to load and reload everything all
> the time, for no apparent reason.

The most obvious reason to me is that user error handling is pretty
poor. Because there is no JS, we cannot offer front-end validation, that
means that the backend server is responsible for validating fields
submitted. If validation does not pass, the page must "reload" for the
user and it needs to show exactly what went wrong and preserve the user
input. That's my definition of a site that reloads all the time.


>> - mysql instead of sqlite, which also implies a mysql instance running
>
> SQLite is actually surprisingly resilient, according to [0]:
>
>> SQLite works great as the database engine for most low to medium traffic
>> websites (which is to say, most websites). The amount of web traffic
>> that SQLite can handle depends on how heavily the website uses its
>> database. Generally speaking, any site that gets fewer than 100K
>> hits/day should work fine with SQLite. The 100K hits/day figure is a
>> conservative estimate, not a hard upper bound. SQLite has been
>> demonstrated to work with 10 times that amount of traffic.
>
> But either way, I used sqlite to avoid setting up a RDBMS.
>
> [0] https://www.sqlite.org/whentouse.html

SQLite is resilient but it's dangerous to use it with multiple threads
like how your go server does. You could use a single channel model to
write records one at a time but now you have a risk to lose data from
memory if your service restarts.

>
>> - DOS protection, maybe some rate-limiting and IP blocking
>> - HTTPS, thankfully it's easier now
>
> AFAIK these things can usually be handled by a frond-end such as NGINX.

That's true it can, but that means you need to deploy and configure one.
https://www.nginx.com/blog/rate-limiting-nginx/
https://nginx.org/en/docs/http/configuring_https_servers.html


>> - monitoring, how do we know the service is running as expected
>> - logging, and how to store logs for debug
>
> If there is any interest, extending the example to support this would be
> feasible. The "20%" you mention aren't easy, but from what I see it
> shouldn't be too hard either.

You're absolutely right. None of it is "too hard". But the problem is
just how much time and effort are we willing to put into it. If the goal
is to make an open source polling platform that we can re-use in the
future, then absolutely all of this can be done. But if we treat this as
a one-off and see how it turns out, the scope seems exaggerated.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09  3:35 ` Richard Stallman
  2020-10-09 18:01   ` Jean Louis
@ 2020-10-09 23:12   ` Adrien Brochard
  2020-10-09 23:31     ` Drew Adams
                       ` (6 more replies)
  1 sibling, 7 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-09 23:12 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel

Thank you for your response. Please find the list of questions I have
gathered at the end of this email.

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
> I think using Google to communicate the users is bad because Google
> does so many bad things.  We should not endorse it with our actions.
>
> In addition, most Google services require users to run nonfree
> software (Javascript code).  If answering our questions requires the
> user to run some nonfree JS code, that would put us in a moral
> contradiction.
>
> Our goal is much more than just developing a successful editor; GNU
> Emacs is a GNU package, and the purpose of the GNU operating system is
> to win freedom for the users.  We have to set an example of respecting
> and defending freedom in the methods we use, not just the program we
> are working on.  See https://gnu.org/philosophy/free-sw.html and
> https://gnu.org/philosophy/free-software-even-more-important.html.
>
> I think Reddit is the wrong place to discuss this plan, for a similar
> reason.  As I understand it, Reddit requires nonfree software to post
> on Reddit nowadays.  Is that not so?

I understand the position. My primary concern though is that without
some convenience, it is difficult to convince a lot of people to
respond. Which is why I am proposing two channels: an a dedicated email
address that will accept plain text responses (at the risk of data
quality), and an online form. That plain text form to be email can be
hosted on a static site that people can access from Emacs itself.

> If possible, we should tell users how to select various behaviors, so
> that they can state their opinions based on comparing actual
> experiences.
>
> End the inquiry statement with the following text.
>
>      We do not seek "votes", but rather understanding.  If you are for
>      the change, please explain why.  Would it help you directly?  If
>      so, in what scenarios?  How often, and how strongly, would it
>      benefit you?  What would the benefit be?
>
>      Or is it that you think it will improve Emacs, or speed Emacs
>      development, by helping other users?  How so?
>
>      Please distinguish between what you know and what you predict.
>
>      Likewise, if you are against the change, please explain why.
>      Would it inconvenience you directly?  If so, in what scenarios?
>      How often, and how strongly, would it inconvenience you?  What
>      would the inconvenience be?
>
>      Or is it that you think it will harm Emacs or Emacs development by
>      inconveniencing others?  How so?
>
>      We invite you also to propose alterations in the proposed change that
>      you think would improve it -- saying in what scenario that would be an
>      improvement, and how so, etc.
>
>      Please post the URL of this page in forums where it is appropriate,
>      and resend it to Emacs users and mailing lists where you know people
>      will be glad to receive it.
>
> It is crucial to urge people repeatedly to explain their positions
> because there is a strong tendency for people not to bother.

I am all in favor of this. Thank you for putting it together. Let me
know if you think the wording is still coherent given the questions.

> * Put the inquiry statement in a web page under gnu.org/software/emacs.
>
> * Mail the inquiry statement info-gnu-emacs, help-gnu-emacs and
> emacs-tangents, with the URL of the web page _and_ the full text
> of the inquiry statement.
>
> Also post a note referring to the web page on reddit.com/r/emacs, and
> any other suitable places.  Mail the URL to Sacha Chua
> <sacha@sachachua.com>.
>
> * Wait until at least two weeks after the deadline, then study and
> record the responses.  Note down all interesting comments, since they
> are the most important information in the responses.

Yes to all of that.

> * Do count how many people support each position that people support,
> but it would be a mistake to make the actual decision based simply on
> counting.  A given change can affect one user very often, and affect
> another user only rarely, but they could both state a "strong
> preference".
>
> * We are not compelled to choose between "make that change" and "no
> change".  The best outcome of the inquiry is that the responses show
> us how to design a way to please almost all users, almost all the
> time, and not displease any user very much.

I also agree with this. I think no matter what we are going to get
selection bias and we should not rush any decision based on the survey
results.


* Survey Questions
(Please note that any "other" should allow for free text entry for the
respondent to elaborate)

** How would you characterize your use of Emacs?
    - Use it for work
    - I use it for serious "hobby" projects
    - I'm just tinkering
    - I use it for my studies
    - Other

** What do you use Emacs for?
     - Software development
     - Research writing
     - Data science
     - Writing
     - Other

** How long have you been using Emacs?

** Which version of Emacs do you use?

** What OS do you primary use?
     - Linux
     - Windows
     - MacOS
     - BSD
     - Other

** How do you use Emacs?
     - GUI
     - Terminal (TUI)
     - Both

** How do you run Emacs?
     - Client/Server mode only
     - Standalone application only
     - Both

** Describe your configuration
    - I am using vanilla emacs (little to no configuration).
    - Custom configuration
    - Spacemacs - https://github.com/syl20bnr/spacemacs
    - Doom Emacs - https://github.com/hlissner/doom-emacs
    - Prelude - https://github.com/bbatsov/prelude
    - purcell emacs.d - https://github.com/purcell/emacs.d
    - magnars emacs.d - https://github.com/magnars/.emacs.d
    - Emacs Starter Kit - https://github.com/eschulte/emacs-starter-kit
    - oh-my-emacs - https://github.com/xiaohanyu/oh-my-emacs
    - Better Defaults - https://github.com/technomancy/better-defaults
    - Graphene - https://github.com/rdallasgray/graphene
    - ohai-emacs - https://github.com/bodil/ohai-emacs
    - ergoemacs-mode - https://github.com/ergoemacs/ergoemacs-mode
    - Rho Emacs - https://github.com/GChristensen/rho-emacs
    - Radian - https://github.com/raxod502/radian
    - Centaur Emacs - https://github.com/seagle0128/.emacs.d
    - Other

** What keybindings do you use?
    -  Emacs defaults
    -  Evil/Spacemacs/Doom-Emacs (all the vim-likes)
    -  CUA-mode
    -  God-mode
    -  Boon
    -  Xah-Fly-Keys
    -  Custom modal (ryo-modal, etc)
    -  Custom modifiers (Emacs from scratch)
    -  Other

** Prior to using Emacs what was your primary editor?
    - VIM
    - VScode
    - Eclipse
    - Notepad++
    - Sublime
    - Intelij
    - Other

** org-mode usage
     - I use emacs only for org-mode
     - dayly
     - from time to time
     - Not a org-mode user

** Which completion/selection framework do you use?
    - helm
    - ivy
    - ido
    - icomplete
    - other
    - i don't use a completion framework

** How do you manage third-party elisp?
     - built-in package.el
     - Spacemacs does it for me
     - straight.el
     - borg
     - leaf
     - el-get
     - Nix
     - git submodules without Borg
     - git subtrees
     - git clones
     - guix
     - quelpa
     - cask
     - No third-party deps
     - other

** How do you get emacs packages(if applicable)?
     - No repos
     - Gnu Elpa
     - Melpa/Melpa Stable
     - Directly from the source (e. g. using straight).

** Can you list some of your favorite package?

** What package do you use for error checking?
    - Flymake
    - Flycheck
    - None

** Do you use TRAMP?

** DO you use Magit?

** What package do you use for project management?
     - project.el
     - projectile
     - Other(mention)
     - None

** Do you use shell/terminal emulator in Emacs?
     - eshell
     - shell
     - term
     - ansi-term
     - do not use.

** Do you use mail client in Emacs?
     - Mu4e
     - Gnus
     - Mut
     - notmuch
     - do not use

** What is your Elisp proficiency?
     - Beginner/No knowledge
     - Basic elisp understanding
     - Intermediate
     - Advanced
     - Expert

** If you use Emacs for programming, which languages do you program in?

** do you use a language server with lsp-mode? With what languages?

** Do you use Emacs for debugging? What do you use? (Gdb, dap-mode etc)

** Which theme do you use?

** Have you ever contributed to GNU Emacs core/Elpa?
     - No
     - No, but I would do that if the process is changed(e. g. using
github pull requests instead of the mailing list, no papers, etc**.
     - I do PRs from time to time
     - I provide PRs regularly
     - I am active contributor/maintainer

** Have you ever contributed to Melpa package?
     - No
     - I do PRs from time to time
     - I provide PRs regularly
     - I am a package maintainer

** What Emacs community forums have you visited in the past year?
Answers would be things like
     - r/emacs
     - Emacs mailing list
     - irc
     - Emacs meetups
     - I follow twitter Emacs related accounts
     - Other

** What are some of the Emacs improvements you are the most interested in?
** what do you think are Emacs' greatest strengths?
** can you recall any difficulties you faced initially learning Emacs?
** What is the one thing you would like emacs to do differently?
** How did you hear about this survey?
** If there is another survey in 2021, would you be opposed to it
containing optional & general demographics questions?
    It could include age backets, gender, country or language
** Do you have a preferred platform for filling out the survey in the
future?
** General feedback about the survey process?




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-09 23:12   ` Adrien Brochard
@ 2020-10-09 23:31     ` Drew Adams
  2020-10-09 23:36       ` Adrien Brochard
  2020-10-10  8:09     ` Teemu Likonen
                       ` (5 subsequent siblings)
  6 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-09 23:31 UTC (permalink / raw)
  To: Adrien Brochard, rms; +Cc: emacs-devel

As a start, lose all of the multiple choices.
Just have open questions, letting users say
what they do/use/prefer, etc.

The multiple choices, even with an "other",
bias the results.

Ask users to express themselves, then work
with whatever info they provide for the
questions.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 23:31     ` Drew Adams
@ 2020-10-09 23:36       ` Adrien Brochard
  2020-10-10  2:21         ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Adrien Brochard @ 2020-10-09 23:36 UTC (permalink / raw)
  To: Drew Adams, rms; +Cc: emacs-devel

> As a start, lose all of the multiple choices.
> Just have open questions, letting users say
> what they do/use/prefer, etc.
>
> The multiple choices, even with an "other",
> bias the results.

How does it bias results exactly?
There is always a series of trade-off to make when surveying: free text
is more open ended and allows for discovery, but multiple choices have
higher completion rate and give specific answers. The set of questions
is organized such that we have:
- multiple choices regarding factual and technical practices (which
version of Emacs/OS/packages etc)
- open ended question with broader topics and free text
- meta questions about the survey itself

> Ask users to express themselves, then work
> with whatever info they provide for the
> questions.

That's the point of the more open ended questions with free text along
with the general feedback section.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-09 23:36       ` Adrien Brochard
@ 2020-10-10  2:21         ` Drew Adams
  2020-10-10  2:40           ` Adrien Brochard
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-10  2:21 UTC (permalink / raw)
  To: Adrien Brochard, rms; +Cc: emacs-devel

> > As a start, lose all of the multiple choices.
> > Just have open questions, letting users say
> > what they do/use/prefer, etc.
> >
> > The multiple choices, even with an "other",
> > bias the results.
> 
> How does it bias results exactly?

Suggestions of what is possible.

My suggestion is to just leave the questions open,
and let people express themselves however they
think best, rather than being incited to choose
among suggested alternatives.

Just a suggestion.

> multiple choices have higher completion rate and give specific answers. 

Higher completion rate and specific answers can
mean little, compared to thoughtful responses.
Emacs has always preferred the latter.

And explicitly solicit reasons - everywhere.
Reasons can be important for guiding decisions here.

> The set of questions is organized such that we have:
> - multiple choices regarding factual and technical practices (which
> version of Emacs/OS/packages etc)

I've said what I think.  Asking about packages is
a bit different from asking about Emacs version
and OS.  The former, at least, should be an open
question, IMHO.

> - open ended question with broader topics and free text
> - meta questions about the survey itself
> 
> > Ask users to express themselves, then work
> > with whatever info they provide for the questions.
> 
> That's the point of the more open ended questions with free text along
> with the general feedback section.

Yes.  My suggestion is more of that and less of
citing multiple things that a user might consider
choosing.  Choosing OS's and Emacs versions is
less likely to be opinion-based than choosing
packages etc., and it's unlikely that someone will
come up with a new (unlisted) OS or Emacs version.
It's a different terrain, IMO - more choices, more
movement/evolution, more individual preference-based.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10  2:21         ` Drew Adams
@ 2020-10-10  2:40           ` Adrien Brochard
  2020-10-10  3:53             ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Adrien Brochard @ 2020-10-10  2:40 UTC (permalink / raw)
  To: Drew Adams, rms; +Cc: emacs-devel

>>> As a start, lose all of the multiple choices.
>>> Just have open questions, letting users say
>>> what they do/use/prefer, etc.
>>>
>>> The multiple choices, even with an "other",
>>> bias the results.
>>
>> How does it bias results exactly?
>
> Suggestions of what is possible.
>
> My suggestion is to just leave the questions open,
> and let people express themselves however they
> think best, rather than being incited to choose
> among suggested alternatives.
>
> Just a suggestion.

I understand what you are suggesting, but I do not understand the "bias
the results" you are referring to.

> Higher completion rate and specific answers can
> mean little, compared to thoughtful responses.
> Emacs has always preferred the latter.
>
> And explicitly solicit reasons - everywhere.
> Reasons can be important for guiding decisions here.

How about having a "why" optional free-text section after each
non-factual multiple choice question? Like "which package manager do you
use? and why?" or "What are some of your favorite packages and why?"

I also could argue that if you present a paragraph input to users, only
those with the time and energy will make the effort to write a
comprehensive answer, which might create a real bias. On the other hand,
if more people can emit their preference for a particular option, you do
not know why, but you know where to start looking for why.

You do point out something very real: the survey questions are mixing
facts with opinions. We are asking factual things, along with general
opinions on the state of things. There's obviously a trade-off to make
between the two. Factual gives us quick results but without reason. Open
ended decreases the response rate and increases the analysis time, but
opens for more meaningful answers.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09  0:41 ` Karl Fogel
  2020-10-09  1:26   ` Adrien Brochard
@ 2020-10-10  3:52   ` Richard Stallman
  2020-10-10 21:44     ` Dmitry Gutov
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-10  3:52 UTC (permalink / raw)
  To: Karl Fogel; +Cc: abrochard, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > There is a free software web-based survey tool named LimeSurvey:

Perhaps it would be ethical to use a platform like that, when what we
want is a formulaic survey.  But I think it is the wrong sort of tool
for this job.

We had a long discussion on this list, in April and/or May I think,
about how to do polling about a simple change in features.  What we
need is to invite people to explain their preferences or wishes.

Sorry, I don't have a pointer to any of those messages so I can't
say what to search for, except the words "polling" and "inquiry".


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-10  2:40           ` Adrien Brochard
@ 2020-10-10  3:53             ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-10  3:53 UTC (permalink / raw)
  To: Adrien Brochard, rms; +Cc: emacs-devel

I'm not going to argue about it.  I think I made
my suggestion clear, and I think you understand
it well enough.

Just one opinion.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 19:52           ` Adrien Brochard
@ 2020-10-10  3:56             ` Richard Stallman
  2020-10-10  9:36               ` Philip K.
  2020-10-11  1:00               ` Drew Adams
  2020-10-10 10:35             ` Philip K.
  1 sibling, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-10  3:56 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: philipk, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > The most obvious reason to me is that user error handling is pretty
  > poor. Because there is no JS, we cannot offer front-end validation, that
  > means that the backend server is responsible for validating fields
  > submitted.

If we want to learn what users think, we should not limit their
responses to a small set of 'valid" possible answers.  The plan
I designed for inquiries asks users to answer in their own words.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 23:12   ` Adrien Brochard
  2020-10-09 23:31     ` Drew Adams
@ 2020-10-10  8:09     ` Teemu Likonen
  2020-10-10 10:45       ` Rasmus
                         ` (2 more replies)
  2020-10-10 10:54     ` Thibaut Verron
                       ` (4 subsequent siblings)
  6 siblings, 3 replies; 838+ messages in thread
From: Teemu Likonen @ 2020-10-10  8:09 UTC (permalink / raw)
  To: Adrien Brochard, rms; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1062 bytes --]

* 2020-10-09 19:12:23-04, Adrien Brochard wrote:

> Please find the list of questions I have gathered at the end of this
> email.

Great! I would like to see this survey conducted. It would be
interesting to see what people use Emacs for and some distribution of
answers. It's not easy to find good sample of users but if the survey is
published in some main communication platforms or communities it will be
good enough, I think.

Some Emacs proposals cause only talking and nobody actually does
anything. So perhaps your survey will be the best Emacs survey ever.
Best options are those that get implemented.

> ** What package do you use for error checking?
>     - Flymake
>     - Flycheck
>     - None

Some rare people use wcheck-mode which is available from GNU Elpa. I'm
the author and would like to see if it gets even 1 % of users against
the other more popular options.

https://github.com/tlikonen/wcheck-mode

-- 
/// Teemu Likonen - .-.. http://www.iki.fi/tlikonen/
// OpenPGP: 4E1055DC84E9DFF613D78557719D69D324539450

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 251 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10  3:56             ` Richard Stallman
@ 2020-10-10  9:36               ` Philip K.
  2020-10-10 16:33                 ` Drew Adams
  2020-10-11 10:46                 ` Jean Louis
  2020-10-11  1:00               ` Drew Adams
  1 sibling, 2 replies; 838+ messages in thread
From: Philip K. @ 2020-10-10  9:36 UTC (permalink / raw)
  To: rms; +Cc: abrochard, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > The most obvious reason to me is that user error handling is pretty
>   > poor. Because there is no JS, we cannot offer front-end validation, that
>   > means that the backend server is responsible for validating fields
>   > submitted.
>
> If we want to learn what users think, we should not limit their
> responses to a small set of 'valid" possible answers.  The plan
> I designed for inquiries asks users to answer in their own words.

But wouldn't that make it needlessly hard to analyse the results,
especially if the question should be numerically quantified? I get the
value of plain text responses, but recognizing that the answer to the
question "how long have you been using emacs", could result in:

- "Since 1996"
- "24 Years"
- "January 1996"
- "Around the second time Clinton got sworn into office"
- "1896" (but actually a typo)

All of these basically mean the same, but the effort to recognize this
automatically (which would be necessary, if you want to see how factors
correlate) would not be worth it.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 19:52           ` Adrien Brochard
  2020-10-10  3:56             ` Richard Stallman
@ 2020-10-10 10:35             ` Philip K.
  2020-10-11  5:24               ` Richard Stallman
  2020-10-11  7:31               ` Tomas Hlavaty
  1 sibling, 2 replies; 838+ messages in thread
From: Philip K. @ 2020-10-10 10:35 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

Adrien Brochard <abrochard@gmx.com> writes:

>>> - cleaner UI, not just HTML embedded in the code
>>
>> What would you have in mind? I know that my example is simple, but I
>> prefer that to sites that take forever to load and reload everything all
>> the time, for no apparent reason.
>
> The most obvious reason to me is that user error handling is pretty
> poor. Because there is no JS, we cannot offer front-end validation, that
> means that the backend server is responsible for validating fields
> submitted. If validation does not pass, the page must "reload" for the
> user and it needs to show exactly what went wrong and preserve the user
> input. That's my definition of a site that reloads all the time.

That could be mitigated with a "graceful degradation" approach, since
most people do have javascript activated by default. HTML5 also has a
few attributes that could help, such as pattern or required, depending
on what questions are being asked.

>>> - mysql instead of sqlite, which also implies a mysql instance running
>>
>> SQLite is actually surprisingly resilient, according to [0]:
>>
>>> SQLite works great as the database engine for most low to medium traffic
>>> websites (which is to say, most websites). The amount of web traffic
>>> that SQLite can handle depends on how heavily the website uses its
>>> database. Generally speaking, any site that gets fewer than 100K
>>> hits/day should work fine with SQLite. The 100K hits/day figure is a
>>> conservative estimate, not a hard upper bound. SQLite has been
>>> demonstrated to work with 10 times that amount of traffic.
>>
>> But either way, I used sqlite to avoid setting up a RDBMS.
>>
>> [0] https://www.sqlite.org/whentouse.html
>
> SQLite is resilient but it's dangerous to use it with multiple threads
> like how your go server does. You could use a single channel model to
> write records one at a time but now you have a risk to lose data from
> memory if your service restarts.

I'm familiar with the danger, but it shouldn't be a problem. As pointed
out in [0], one can activate the SQLite mutex per flag. But at the same
time, even sites as popular as Hacker News are alleged to use SQLite as
their backend.

[0] https://github.com/mattn/go-sqlite3/issues/249

>>
>>> - DOS protection, maybe some rate-limiting and IP blocking
>>> - HTTPS, thankfully it's easier now
>>
>> AFAIK these things can usually be handled by a frond-end such as NGINX.
>
> That's true it can, but that means you need to deploy and configure one.
> https://www.nginx.com/blog/rate-limiting-nginx/
> https://nginx.org/en/docs/http/configuring_https_servers.html

Perhaps using Guix could make that easier:
https://guix.gnu.org/manual/devel/en/html_node/Web-Services.html#NGINX?

>>> - monitoring, how do we know the service is running as expected
>>> - logging, and how to store logs for debug
>>
>> If there is any interest, extending the example to support this would be
>> feasible. The "20%" you mention aren't easy, but from what I see it
>> shouldn't be too hard either.
>
> You're absolutely right. None of it is "too hard". But the problem is
> just how much time and effort are we willing to put into it. If the goal
> is to make an open source polling platform that we can re-use in the
> future, then absolutely all of this can be done. But if we treat this as
> a one-off and see how it turns out, the scope seems exaggerated.

Depending on how many people participate, it would be interesting the
repeat the survey year-by-year, so that trends and changes in the
user-base can be recognized.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10  8:09     ` Teemu Likonen
@ 2020-10-10 10:45       ` Rasmus
  2020-10-11 10:32       ` Jean Louis
  2020-10-12 14:32       ` Adrien Brochard
  2 siblings, 0 replies; 838+ messages in thread
From: Rasmus @ 2020-10-10 10:45 UTC (permalink / raw)
  To: emacs-devel

Hi Teemu,

Teemu Likonen <tlikonen@iki.fi> writes:

> Some rare people use wcheck-mode which is available from GNU 
> Elpa. I'm the author and would like to see if it gets even 1 % 
> of users against the other more popular options. 
> 
> https://github.com/tlikonen/wcheck-mode 

Aside: I used to use wheck. I think I might even have reached out 
to you many years ago.

Hunspell support (e.g. ‘ispell-hunspell-add-multi-dic’, thanks 
Eli!)  and the general functionality and speed of ‘flyspell’ has 
grown so good that I don’t need anything but vanilla Emacs.

Many thanks for creating wheck; it allowed me to get good 
spell-checking at a time when it was otherwise hard to set up!

[I see that whceck does a lot more and I wonder if it could be 
used for 
 languagetool (the grammar checker)]

Rasmus

-- 
Together we'll stand, divided we'll fall




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 23:12   ` Adrien Brochard
  2020-10-09 23:31     ` Drew Adams
  2020-10-10  8:09     ` Teemu Likonen
@ 2020-10-10 10:54     ` Thibaut Verron
  2020-10-10 13:50       ` Philip K.
                         ` (2 more replies)
  2020-10-10 13:17     ` Rasmus
                       ` (3 subsequent siblings)
  6 siblings, 3 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-10 10:54 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: Richard Stallman, emacs-devel

Hi,

To me it looks like a pretty solid list of questions. I'd just suggest
a few changes (assuming we go with multiple-choice):


> ** How do you run Emacs?
>      - Client/Server mode only
>      - Standalone application only
>      - Both

I would add a "I don't know" item here.

> ** Describe your configuration
>     - I am using vanilla emacs (little to no configuration).
>     - Custom configuration
>     - Spacemacs - https://github.com/syl20bnr/spacemacs
>     - Doom Emacs - https://github.com/hlissner/doom-emacs
>     - Prelude - https://github.com/bbatsov/prelude
>     - purcell emacs.d - https://github.com/purcell/emacs.d
>     - magnars emacs.d - https://github.com/magnars/.emacs.d
>     - Emacs Starter Kit - https://github.com/eschulte/emacs-starter-kit
>     - oh-my-emacs - https://github.com/xiaohanyu/oh-my-emacs
>     - Better Defaults - https://github.com/technomancy/better-defaults
>     - Graphene - https://github.com/rdallasgray/graphene
>     - ohai-emacs - https://github.com/bodil/ohai-emacs
>     - ergoemacs-mode - https://github.com/ergoemacs/ergoemacs-mode
>     - Rho Emacs - https://github.com/GChristensen/rho-emacs
>     - Radian - https://github.com/raxod502/radian
>     - Centaur Emacs - https://github.com/seagle0128/.emacs.d
>     - Other

This list is significantly longer than others in the questionnaire.
Would it make sense to group the less common ones in "other"?

I also don't know if I would include better-defaults, ergoemacs, etc,
in that list: they are standard packages, they don't require replacing
your .emacs.d.

> ** What keybindings do you use?
>     -  Emacs defaults
>     -  Evil/Spacemacs/Doom-Emacs (all the vim-likes)
>     -  CUA-mode
>     -  God-mode
>     -  Boon
>     -  Xah-Fly-Keys
>     -  Custom modal (ryo-modal, etc)
>     -  Custom modifiers (Emacs from scratch)
>     -  Other

Same doubt regarding the less common options.

Also, I'd add Viper (built-in) to the vim-likes.

>
> ** Prior to using Emacs what was your primary editor?
>     - VIM
>     - VScode
>     - Eclipse
>     - Notepad++
>     - Sublime
>     - Intelij
>     - Other

I'd add an entry "Text editor supplied by the OS (notepad, gedit,
kate...)" and an entry "None".

> ** Do you use shell/terminal emulator in Emacs?
>      - eshell
>      - shell
>      - term
>      - ansi-term
>      - do not use.

I'd add "vterm" and "other".

>
> ** Do you use mail client in Emacs?
>      - Mu4e
>      - Gnus
>      - Mut
>      - notmuch
>      - do not use

Here too, "other" should be an option.

Nice work !



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 23:12   ` Adrien Brochard
                       ` (2 preceding siblings ...)
  2020-10-10 10:54     ` Thibaut Verron
@ 2020-10-10 13:17     ` Rasmus
  2020-10-12 14:41       ` Adrien Brochard
  2020-10-11  5:23     ` Richard Stallman
                       ` (2 subsequent siblings)
  6 siblings, 1 reply; 838+ messages in thread
From: Rasmus @ 2020-10-10 13:17 UTC (permalink / raw)
  To: emacs-devel

Hi Adrien,

Thank you for putting together the questions.

I think they are some good questions there, although I am not 
quite sure what exactly the “research question” is.  But I guess 
it’s just understanding users broadly...

Adrien Brochard <abrochard@gmx.com> writes:

> ** How would you characterize your use of Emacs? 
>    - Use it for work - I use it for serious "hobby" projects - 
>    I'm just tinkering - I use it for my studies - Other 

I would’t want to limit my choice to one here.  I use Emacs for 
work (when I can) and for hobby projects.

IOW: Multiple choices would be nice.
 
> ** What do you use Emacs for? 
>     - Software development - Research writing - Data science - 
>     Writing - Other 

As above.
 
> ** What OS do you primary use? 
>     - Linux - Windows - MacOS - BSD - Other 

As above.
 
> ** Describe your configuration 
>    - I am using vanilla emacs (little to no configuration).  - 
>    Custom configuration - Spacemacs - 
>    https://github.com/syl20bnr/spacemacs - Doom Emacs - 
>    https://github.com/hlissner/doom-emacs - Prelude - 
>    https://github.com/bbatsov/prelude - purcell emacs.d - 
>    https://github.com/purcell/emacs.d - magnars emacs.d - 
>    https://github.com/magnars/.emacs.d - Emacs Starter Kit - 
>    https://github.com/eschulte/emacs-starter-kit - oh-my-emacs - 
>    https://github.com/xiaohanyu/oh-my-emacs - Better Defaults - 
>    https://github.com/technomancy/better-defaults - Graphene - 
>    https://github.com/rdallasgray/graphene - ohai-emacs - 
>    https://github.com/bodil/ohai-emacs - ergoemacs-mode - 
>    https://github.com/ergoemacs/ergoemacs-mode - Rho Emacs - 
>    https://github.com/GChristensen/rho-emacs - Radian - 
>    https://github.com/raxod502/radian - Centaur Emacs - 
>    https://github.com/seagle0128/.emacs.d - Other 

Well done finding all of those.  I haven’t heard of most of those.
 
> ** What keybindings do you use? 
>    -  Emacs defaults -  Evil/Spacemacs/Doom-Emacs (all the 
>    vim-likes) -  CUA-mode -  God-mode -  Boon -  Xah-Fly-Keys - 
>    Custom modal (ryo-modal, etc) -  Custom modifiers (Emacs from 
>    scratch) -  Other 

It may also be interesting to ask which keybinding you initially 
used.
I would guess a lot of people started with CUA and moved to 
vanilla keybindings.
 
> ** Prior to using Emacs what was your primary editor? 
>    - VIM - VScode - Eclipse - Notepad++ - Sublime - Intelij - 
>    Other 

None/don’t know? (I used TeXnicCenter but it is hardly an editor).
 
> ** How do you manage third-party elisp? 
>     - built-in package.el - Spacemacs does it for me - 
>     straight.el - borg - leaf - el-get - Nix - git submodules 
>     without Borg - git subtrees - git clones - guix - quelpa - 
>     cask - No third-party deps - other 

Again, I’m impressed that you put together such a long list!
 
> ** How do you get emacs packages(if applicable)? 
>     - No repos - Gnu Elpa - Melpa/Melpa Stable - Directly from 
>     the source (e. g. using straight). 

GNU ELPA is configured by default so is no repos necessary?
 
> ** Can you list some of your favorite package? 
> 
> ** What package do you use for error checking? 
>    - Flymake - Flycheck - None 
> 
> ** Do you use TRAMP? 
> 
> ** DO you use Magit? 

What is the purpose of this question?  There are many VC programs 
and Magit can only be used for git.  So if we care about “do you 
control VC from Emacs” then the question might not be precise 
enough. 

> ** Do you use shell/terminal emulator in Emacs? 
>     - eshell - shell - term - ansi-term - do not use. 

“None” for consistency?
 
> ** Do you use mail client in Emacs? 
>     - Mu4e - Gnus - Mut - notmuch - do not use 


“mu4e” and “Mutt” I guess?
And “None” for consistency.
 
> ** What is your Elisp proficiency? 
>     - Beginner/No knowledge - Basic elisp understanding - 
>     Intermediate - Advanced - Expert 

I would find it very hard to decide here.  Could something like 
this be split into more easily quantifiable choices? Like do you 
know how to use ‘defmacro’?
 
> ** do you use a language server with lsp-mode? With what 
> languages? 

Maybe mention eglot as well?
 
> ** Have you ever contributed to GNU Emacs core/Elpa? 
>     - No - No, but I would do that if the process is 
>     changed(e. g. using 
> github pull requests instead of the mailing list, no papers, 
> etc**. 
>     - I do PRs from time to time - I provide PRs regularly - I 
>     am active contributor/maintainer 

Nitpick: would “patches” be more well-understood than PR?
 
> ** Have you ever contributed to Melpa package? 
>     - No - I do PRs from time to time - I provide PRs regularly 
>     - I am a package maintainer 

Nitpick: I guess you mean something more broad than “melpa” here? 
I guess I should understand it as “non-core packages” or “packages 
not shipped with Emacs” (that’s also not entirely correct as it 
may cover ELPA).
 
> ** What Emacs community forums have you visited in the past 
> year?  Answers would be things like 
>     - r/emacs - Emacs mailing list - irc - Emacs meetups - I 
>     follow twitter Emacs related accounts - Other 


Maybe include the Emacs stack exchange or does that not qualify as 
a forum?

    https://emacs.stackexchange.com/

It would also be good to have a banner there once the survey is 
“up”.


> ** If there is another survey in 2021, would you be opposed to 
> it containing optional & general demographics questions? 
>    It could include age backets, gender, country or language

Can’t you just put those in and make them optional?

Kind regards,
Rasmus

-- 
Human: An animal that complicates things more than strictly 
necessary




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 10:54     ` Thibaut Verron
@ 2020-10-10 13:50       ` Philip K.
  2020-10-12 14:36         ` Adrien Brochard
  2020-10-11 11:58       ` Jean Louis
  2020-10-12 14:36       ` Adrien Brochard
  2 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-10-10 13:50 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Adrien Brochard, Richard Stallman, emacs-devel

Thibaut Verron <thibaut.verron@gmail.com> writes:

>> ** Do you use mail client in Emacs?
>>      - Mu4e
>>      - Gnus
>>      - Mut
>>      - notmuch
>>      - do not use
>
> Here too, "other" should be an option.

The list is incomplete, but are there really that many mail clients that
they couldn't be listed. Emacswiki[0] lists:

- Rmail
- Gnus
- MH-E
- Wanderlust
- Mew
- VM
- Notmuch
- mu4e
- mutt

and a few more unmaintained ones. I guess if other could stand for those?

[0]  https://www.emacswiki.org/emacs/CategoryMail

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-10  9:36               ` Philip K.
@ 2020-10-10 16:33                 ` Drew Adams
  2020-10-10 18:02                   ` Dmitry Gutov
  2020-10-11 10:46                 ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-10 16:33 UTC (permalink / raw)
  To: Philip K., rms; +Cc: abrochard, emacs-devel

> > If we want to learn what users think, we should not limit their
> > responses to a small set of 'valid" possible answers.  The plan
> > I designed for inquiries asks users to answer in their own words.
> 
> But wouldn't that make it needlessly hard to analyse the results,

Ease in handling the results shouldn't be a major
consideration.  Quality of the feedback and quality
of its analysis is more important that speed or ease.

> especially if the question should be numerically quantified?

Quantification of bad-quality information doesn't
help.  Better to get a high-quality understanding,
and if some quantification _then_ helps then do it.

> I get the value of plain text responses, but recognizing that the answer to the
> question "how long have you been using emacs", could result in:
> 
> - "Since 1996"
> - "24 Years"
> - "January 1996"
> - "Around the second time Clinton got sworn into office"
> - "1896" (but actually a typo)

A very specific question like that can be asked in
specific terms: how many years.

But even that is likely to be misleading, if kept
apart from considerations of kind and degree of use.

Getting a good picture of Emacs users and uses is not
easy, nor should it be.  And again, users _reasons_
for actions, preferences, etc. are important.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 16:33                 ` Drew Adams
@ 2020-10-10 18:02                   ` Dmitry Gutov
  0 siblings, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-10 18:02 UTC (permalink / raw)
  To: Drew Adams, Philip K., rms; +Cc: abrochard, emacs-devel

On 10.10.2020 19:33, Drew Adams wrote:
> Ease in handling the results shouldn't be a major
> consideration.  Quality of the feedback and quality
> of its analysis is more important that speed or ease.

Difficulty in analysis is likely to result in a lack of transparency of 
such analysis's results.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10  3:52   ` Richard Stallman
@ 2020-10-10 21:44     ` Dmitry Gutov
  2020-10-12  2:04       ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-10 21:44 UTC (permalink / raw)
  To: rms, Karl Fogel; +Cc: abrochard, emacs-devel

Hi Richard,

On 10.10.2020 06:52, Richard Stallman wrote:
> We had a long discussion on this list, in April and/or May I think,
> about how to do polling about a simple change in features.  What we
> need is to invite people to explain their preferences or wishes.

Are you going to do that survey, the one discussed several months ago?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-10  3:56             ` Richard Stallman
  2020-10-10  9:36               ` Philip K.
@ 2020-10-11  1:00               ` Drew Adams
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-11  1:00 UTC (permalink / raw)
  To: rms, Adrien Brochard; +Cc: philipk, emacs-devel

> If we want to learn what users think, we should not limit their
> responses to a small set of 'valid" possible answers.  The plan
> I designed for inquiries asks users to answer in their own words.

That's my suggestion as well.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 23:12   ` Adrien Brochard
                       ` (3 preceding siblings ...)
  2020-10-10 13:17     ` Rasmus
@ 2020-10-11  5:23     ` Richard Stallman
  2020-10-11  7:35       ` Vasilij Schneidermann
  2020-10-12 15:16       ` Adrien Brochard
  2020-10-11 20:54     ` Bonface M. K.
  2020-10-16 13:30     ` Philip K.
  6 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-11  5:23 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

Since this is a general survey rather than a focused inquiry, some of
my plans don't apply.  A multiple choice answer-taker would
be usable in principel for these questions.  But it needs to
meet our ethical criteria -- not sending nonfree JS code to the
browser.

Also, each question should offer a way to answer "none of the above"
or "I'm a strange case".

Your questions seem pretty good overall for a survey.  Here are a few specific
critiques.

  > ** What OS do you primary use?
  >      - Linux

Linux is a kernel, not an operating system.  So it should say,
"GNU/Linux."  See https://gnu.org/gnu/linux-and-gnu.html and
https://gnu.org/gnu/gnu-linux-faq.html, plus the history in
https://gnu.org/gnu/the-gnu-project.html.

  > ** How do you use Emacs?
  >      - GUI
  >      - Terminal (TUI)

Some people will not know those terms, so let's use names that anyone
will understand.

  > ** Which completion/selection framework do you use?

Is it correct to assume a person uses only one?

  > ** Have you ever contributed to Melpa package?

If it mentions Melpa, it must explain the ethical reason we cannot
recommend anything about Melpa.

I would rather not mention that name at all.

  > ** can you recall any difficulties you faced initially learning Emacs?

Add, "Please be as specific and concrete as your memories permit."

  > ** If there is another survey in 2021, would you be opposed to it
  > containing optional & general demographics questions?
  >     It could include age backets, gender, country or language

Let's not ask that.  We should not invite people to make difficulties
for us.

  > ** Do you have a preferred platform for filling out the survey in the
  > future?

That question would be useless -- people would recommend unjust
platforms based on practical convenience.

Let's add a short test: we could offer multiple choice answers for
each of these.  For some questions the user should be able to select
multiple answers, and should select all that are valid.

  > What is GNU?

  > What is GNU/Linux?

  > How does GNU Emacs related to GNU?

  > What is free software (libre software)?

  > Which of these are free liceenses?

  > How does GNU relate to free software?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 10:35             ` Philip K.
@ 2020-10-11  5:24               ` Richard Stallman
  2020-10-11 17:59                 ` Philip K.
  2020-10-11  7:31               ` Tomas Hlavaty
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-11  5:24 UTC (permalink / raw)
  To: Philip K.; +Cc: abrochard, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > The most obvious reason to me is that user error handling is pretty
  > > poor. Because there is no JS, we cannot offer front-end validation, that
  > > means that the backend server is responsible for validating fields
  > > submitted. If validation does not pass, the page must "reload" for the
  > > user and it needs to show exactly what went wrong and preserve the user
  > > input. That's my definition of a site that reloads all the time.

  > That could be mitigated with a "graceful degradation" approach, since
  > most people do have javascript activated by default. HTML5 also has a
  > few attributes that could help, such as pattern or required, depending
  > on what questions are being asked.

It is ok to send some JS code, which is labeled as free such that
LibreJS recognizes it, which does nothing except validate the inputs.
So that a person who enters valid inputs would see no difference between
running the JS code and not running it.

  > >>> - mysql instead of sqlite, which also implies a mysql instance running
  > >>
  > >> SQLite is actually surprisingly resilient, according to [0]:

It would be a mistake to put the input into any sort of database
program.  That would only make things difficult and increase the
special knowledge people would need in order to work on this.

Here's the simple and clean way to do it.

Each time a user responds, convert all the answers into a formulaic
piece text which states the questions and answers.  Email that to a
certain address, which will accumulate these messages in one inbox
file.

Then it will be simple to do all sorts of counting or analysis on that
file.

Database programs are useful when there are hundreds of thousands of
records and you need to search for any one of them.  Or when the data
are being altered.  We will not have so many answers, and each one
will never change once sent.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 10:35             ` Philip K.
  2020-10-11  5:24               ` Richard Stallman
@ 2020-10-11  7:31               ` Tomas Hlavaty
  2020-10-11 12:04                 ` Jean Louis
  2020-10-11 17:47                 ` Philip K.
  1 sibling, 2 replies; 838+ messages in thread
From: Tomas Hlavaty @ 2020-10-11  7:31 UTC (permalink / raw)
  To: emacs-devel

On Sat 10 Oct 2020 at 12:35, "Philip K." <philipk@posteo.net> wrote:
> That could be mitigated with a "graceful degradation" approach, since
> most people do have javascript activated by default.

it should be possible to fill in the survey from emacs

emacs does not support executing javascript code

many people do have javascript disabled by default

many people just close and ignore pages that require javascript

would not it be nice to be able to reply to the survey from emacs?

for example, could the survey work similar to report-emacs-bug where the
template is taken from somewhere dynamically from existing
infrastructure (instead of extra web server), e.g. using a reference to
a message on emacs-survey@gnu.org?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  5:23     ` Richard Stallman
@ 2020-10-11  7:35       ` Vasilij Schneidermann
  2020-10-11 12:08         ` Jean Louis
                           ` (2 more replies)
  2020-10-12 15:16       ` Adrien Brochard
  1 sibling, 3 replies; 838+ messages in thread
From: Vasilij Schneidermann @ 2020-10-11  7:35 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Adrien Brochard, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1462 bytes --]

> If it mentions Melpa, it must explain the ethical reason we cannot
> recommend anything about Melpa.
> 
> I would rather not mention that name at all.

Not mentioning MELPA as an option because you feel uncomfortable about
it will distort survey results, especially for the part where you ask
what package archives people use.  Worse, it leads to a self-reinforcing
effect:  If the true extent of people using MELPA is unknown,
emacs-devel will continue making choices on the false premise that MELPA
isn't a thing at all.  In the worst case GNU ELPA will be eclipsed by
MELPA and cease to be of any practical concern (and it sure seems to me
that this is where things are heading currently).  Remember, this is a
survey to find out how Emacs users use their editor, not about how much
they adhere to FSF ideology.

> Let's add a short test: we could offer multiple choice answers for
> each of these.  For some questions the user should be able to select
> multiple answers, and should select all that are valid.
> 
>   > What is GNU?
> 
>   > What is GNU/Linux?
> 
>   > How does GNU Emacs related to GNU?
> 
>   > What is free software (libre software)?
> 
>   > Which of these are free liceenses?
> 
>   > How does GNU relate to free software?

See my last sentence above.  What's the point of this quiz?  Finding out
what percentage of Emacs users fully believes in GNU's goals?  What will
that information be used for?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10  8:09     ` Teemu Likonen
  2020-10-10 10:45       ` Rasmus
@ 2020-10-11 10:32       ` Jean Louis
  2020-10-11 15:15         ` Drew Adams
  2020-10-11 18:33         ` Philip K.
  2020-10-12 14:32       ` Adrien Brochard
  2 siblings, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 10:32 UTC (permalink / raw)
  To: Teemu Likonen; +Cc: Adrien Brochard, rms, emacs-devel


* Teemu Likonen <tlikonen@iki.fi> [2020-10-10 11:35]:
> * 2020-10-09 19:12:23-04, Adrien Brochard wrote:
> 
> > Please find the list of questions I have gathered at the end of this
> > email.
> 
> Great! I would like to see this survey conducted. It would be
> interesting to see what people use Emacs for and some distribution of
> answers. It's not easy to find good sample of users but if the survey is
> published in some main communication platforms or communities it will be
> good enough, I think.

If survey is published, for example on Reddit, such survey is narrow
and specific to Reddit users, and would represent only that
communication channel.

My proposal on how to publish a survey is to include that in the Help
menu, and let people do it straight from Emacs. That is similar to bug
reporting, but it is not a bug, it is feature request.

Something like:

Tell us how we can improve?

in the Help menu, would lead to description as how RMS said, and from
there on, users would submit the email with their descriptions, likes,
hates, whatever they wish to say.

It could go straight to specific mailing list.

Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10  9:36               ` Philip K.
  2020-10-10 16:33                 ` Drew Adams
@ 2020-10-11 10:46                 ` Jean Louis
  2020-10-11 18:42                   ` Philip K.
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-11 10:46 UTC (permalink / raw)
  To: Philip K.; +Cc: abrochard, rms, emacs-devel

* Philip K. <philipk@posteo.net> [2020-10-10 12:37]:
> Richard Stallman <rms@gnu.org> writes:
> 
> > [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> > [[[ whether defending the US Constitution against all enemies,     ]]]
> > [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> >
> >   > The most obvious reason to me is that user error handling is pretty
> >   > poor. Because there is no JS, we cannot offer front-end validation, that
> >   > means that the backend server is responsible for validating fields
> >   > submitted.
> >
> > If we want to learn what users think, we should not limit their
> > responses to a small set of 'valid" possible answers.  The plan
> > I designed for inquiries asks users to answer in their own words.
> 
> But wouldn't that make it needlessly hard to analyse the results,
> especially if the question should be numerically quantified?

As I have done larger surveys for public relations and I know methods,
I know how tedious it is to evaluate such survey, we have been
employing many people, like 20 people, to just analyze what exactly
did people check or did not check, what did they write, to read their
handwriting, and then to properly analyze it.

However, Emacs feature requests or survey about using Emacs need live
user, not user as a number.

> I get the value of plain text responses, but recognizing that the
> answer to the question "how long have you been using emacs", could
> result in:
> 
> - "Since 1996"
> - "24 Years"
> - "January 1996"
> - "Around the second time Clinton got sworn into office"
> - "1896" (but actually a typo)
> 
> All of these basically mean the same, but the effort to recognize this
> automatically (which would be necessary, if you want to see how factors
> correlate) would not be worth it.

It is better not to do it automatically.

Emacs is developed through number of developers, they are not doing
development automatically, they are well coordinating and
collaborating with each other.

Any user who is sending a request is also collaborating in such
development by proposing features or telling about dislikes, telling
their opinion.

Those users are valuable, their answers should not remain as numbers
on the paper, or communication that comes only one time.

Kind answer on their email or requests, likes or dislikes, will
involve users into collaboration and coordination and better
understanding of what such users were thinking.

We already have mailing lists for Emacs, but we do not have it well
integrated into Emacs, that users can find out about it.

So I am proposing to follow the friendly GNU Hyperbole
https://www.gnu.org/s/hyperbole example, where
Bob Weiner have implemented Hyperbole menu, from which every user is
enabled to subscribe to Hyperbole mailing list or to send email to
Hyperbole mailing list.

Thus menu item like "Tell us how to improve Emacs?" in Help menu could
be the initiation to such collaboration.

And I think that many Emacs users do not use Emacs to send email, so
there shall be option by using eww, to send a form, and form can be
already packaged with Emacs.

Thus user could decide to:

- subscribe to improvement mailing list

- send email with or without subscription, just as almost any GNU
  list,

- unsubscribe

- or send a WWW form, by using eww function

The form would be in HTML format, accessible to eww easily.

Over time, the form could be improved or changed in new versions.

It could include free field to write what one wants, or it could
include set of question as well.

Now this opens the question that the other mailing list,
help-gnu-emacs should also be integrated in the menu, just as the user
survey.

I recommend everybody to install hyperbole package and to see how it
was implemented, it gives incentive to user to collaborate and
coordinate, and if it would not be implemented in the menu, user would
hardly find the mailing list.

Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 10:54     ` Thibaut Verron
  2020-10-10 13:50       ` Philip K.
@ 2020-10-11 11:58       ` Jean Louis
  2020-10-12 14:36       ` Adrien Brochard
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 11:58 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Adrien Brochard, Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-10 13:56]:

> I would add a "I don't know" item here.
> 
> > ** Describe your configuration
> >     - I am using vanilla emacs (little to no configuration).
> >     - Custom configuration
> >     - Spacemacs - https://github.com/syl20bnr/spacemacs
> >     - Doom Emacs - https://github.com/hlissner/doom-emacs
> >     - Prelude - https://github.com/bbatsov/prelude
> >     - purcell emacs.d - https://github.com/purcell/emacs.d
> >     - magnars emacs.d - https://github.com/magnars/.emacs.d
> >     - Emacs Starter Kit - https://github.com/eschulte/emacs-starter-kit
> >     - oh-my-emacs - https://github.com/xiaohanyu/oh-my-emacs
> >     - Better Defaults - https://github.com/technomancy/better-defaults
> >     - Graphene - https://github.com/rdallasgray/graphene
> >     - ohai-emacs - https://github.com/bodil/ohai-emacs
> >     - ergoemacs-mode - https://github.com/ergoemacs/ergoemacs-mode
> >     - Rho Emacs - https://github.com/GChristensen/rho-emacs
> >     - Radian - https://github.com/raxod502/radian
> >     - Centaur Emacs - https://github.com/seagle0128/.emacs.d
> >     - Other

The Emacs bug report system already include packages employed by
various users, so the survey data of who uses which package, on which
system, which Emacs version, is already there in the bug system.

It needs only be evaluated, Emacs Lisp could crawl through the bug
report and find out which packages are used mostly, which
configurations, themes are used mostly by those who report bugs.

Help menu -> Tell us how to improve Emacs, could automatically ask
user to send whatever list of packages user is using, of course by
asking user for permission, in similar way how that does the function
{M-x report-emacs-bug}

I am against advertising of the Microsoft® Github® on any official
Emacs communication lines.

I find the above Microsoft Github list biased for the reason that the
list have been made in specific order by somebody and I do not see why
should Centaur be last and Spacemacs first.

Additionally, whoever made the list, already have got it by
popularity, in fact, there is nothing to be asked, as Github is asking
users to LIKE the project, there are "stars" given by users, so if you
wish to know which Github project is more popular, use the following
search:

https://github.com/search?o=desc&q=emacs&s=stars&type=Repositories

The evaluation is right there, as it is sorted by stars given by its
users. Thus the above list is absolutely not necessary.

Emacs, as free software, in general should not be pointing users to
Github for reasons of non-free Javascript.

Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  7:31               ` Tomas Hlavaty
@ 2020-10-11 12:04                 ` Jean Louis
  2020-10-11 17:47                 ` Philip K.
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 12:04 UTC (permalink / raw)
  To: Tomas Hlavaty; +Cc: emacs-devel

* Tomas Hlavaty <tom@logand.com> [2020-10-11 10:33]:
> On Sat 10 Oct 2020 at 12:35, "Philip K." <philipk@posteo.net> wrote:
> > That could be mitigated with a "graceful degradation" approach, since
> > most people do have javascript activated by default.
> 
> it should be possible to fill in the survey from emacs
> 
> emacs does not support executing javascript code

If any website functions only with Javascript, people would launch
external browser from Emacs, thus jumping to Javascript which could be
non-free.

> many people do have javascript disabled by default

Many is vague, and I am sure it is true, but "many" does not represent
majority, you have to think of default settings in major browsers, if
they have Javascript turned on, majority have Javascript turned on,
regardless how many have it disabled.

> many people just close and ignore pages that require javascript

I agree, though many is not equal to majority.

> would not it be nice to be able to reply to the survey from emacs?

Yes, please.

> for example, could the survey work similar to report-emacs-bug where
> the template is taken from somewhere dynamically from existing
> infrastructure (instead of extra web server), e.g. using a reference
> to a message on emacs-survey@gnu.org?

Exactly good idea.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  7:35       ` Vasilij Schneidermann
@ 2020-10-11 12:08         ` Jean Louis
  2020-10-11 12:50           ` Vasilij Schneidermann
  2020-10-12  2:04         ` Richard Stallman
  2020-10-12  2:04         ` Richard Stallman
  2 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-11 12:08 UTC (permalink / raw)
  To: Richard Stallman, Adrien Brochard, emacs-devel

* Vasilij Schneidermann <mail@vasilij.de> [2020-10-11 10:38]:
> > If it mentions Melpa, it must explain the ethical reason we cannot
> > recommend anything about Melpa.
> > 
> > I would rather not mention that name at all.
> 
> Not mentioning MELPA as an option because you feel uncomfortable about
> it will distort survey results, especially for the part where you ask
> what package archives people use.  Worse, it leads to a self-reinforcing
> effect:  If the true extent of people using MELPA is unknown,
> emacs-devel will continue making choices on the false premise that MELPA
> isn't a thing at all.  In the worst case GNU ELPA will be eclipsed by
> MELPA and cease to be of any practical concern (and it sure seems to me
> that this is where things are heading currently).  Remember, this is a
> survey to find out how Emacs users use their editor, not about how much
> they adhere to FSF ideology.

Does MELPA contains non-free software?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 12:08         ` Jean Louis
@ 2020-10-11 12:50           ` Vasilij Schneidermann
  2020-10-11 17:15             ` Jean Louis
  2020-10-12  2:04             ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Vasilij Schneidermann @ 2020-10-11 12:50 UTC (permalink / raw)
  To: Jean Louis; +Cc: Adrien Brochard, Richard Stallman, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 724 bytes --]

> Does MELPA contains non-free software?

No, it doesn't.  Neither does the website contain non-free JS, it runs
fine with LibreJS.  The only concern here is that MELPA does not adhere
to GNU's coding guidelines, such as never ever referring, linking or
otherwise supporting non-free software (for example by hosting packages
that wrap non-free executables or are tied into working with non-free
operating systems).  And why should they, they are not GNU, they are a
community-provided package archive and a wildly successful one, too.

Even if it contained non-free software, this is beside the point.  What
use is a survey if it doesn't strive to accurately capture the status
quo and instead basks in ideological purity?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-11 10:32       ` Jean Louis
@ 2020-10-11 15:15         ` Drew Adams
  2020-10-11 18:25           ` Jean Louis
  2020-10-11 20:19           ` Proposal for an Emacs User Survey Drew Adams
  2020-10-11 18:33         ` Philip K.
  1 sibling, 2 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-11 15:15 UTC (permalink / raw)
  To: Jean Louis, Teemu Likonen; +Cc: Adrien Brochard, rms, emacs-devel

> If survey is published, for example on Reddit, such survey is narrow
> and specific to Reddit users, and would represent only that
> communication channel.
> 
> My proposal on how to publish a survey is to include that in the Help
> menu, and let people do it straight from Emacs. That is similar to bug
> reporting, but it is not a bug, it is feature request.
                                  ^^^^^^^^^^^^^^^^^^^^^
> Something like:
>   Tell us how we can improve?
> in the Help menu, would lead to description as how RMS said, and from
> there on, users would submit the email with their descriptions, likes,
> hates, whatever they wish to say.
> 
> It could go straight to specific mailing list.

I agree that the `Help' menu could/should have an item
for something like this.

Actually, we already have this functionality, which is
submitting free-form feedback of any kind.  We call it
an enhancement request, and we tell users to use
`M-x report-emacs-bug' for it.  This is not as well
known as it should be, IMO.

It would be good for the `Help' menu to have an item
that explicitly calls this `Suggest Improvements' or
similar.  It would be bound to `report-emacs-bug'.
___

I think that corresponds to what you are suggesting.

However, providing individual feedback to the "bug"
list, as helpful as it might be, inviting a thread
of discussion by interested parties, including some
Emacs core developers, does not also involve or
encourage any broader discussion/communication.

That might be OK, and in fact that aspect hasn't yet
been raised in this current thread.  So far, we've
discussed only submitting a survey, getting results,
and analyzing/discussing them here, on emacs-devel.

So as far as that goes, I think this suggestion from
Jean-Louis does fit the bill.

Well, it doesn't constitute a "survey", but it does
correspond to what RMS, I, and Jean-Louis have
emphasized here: getting users to say, in their own
words, what they want and what they do.

I've said this before (dunno whether I've proposed
a separate `Help' menu item).  We should make
`report-emacs-bug' better known as a recommended
way to submit ANY feedback about Emacs.

The command name can mislead wrt this role.  A
separate `Help' menu item would help (even though
redundant with item `Send Bug Report').  Or change
that item to `Send Feedback or Bug Report'.

It might also make sense, for discoverability etc.,
to add a `send-feedback' alias for `send-bug-report'.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 12:50           ` Vasilij Schneidermann
@ 2020-10-11 17:15             ` Jean Louis
  2020-10-11 17:36               ` Thibaut Verron
  2020-10-12  2:04             ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-11 17:15 UTC (permalink / raw)
  To: emacs-devel; +Cc: Adrien Brochard, Richard Stallman

* Vasilij Schneidermann <mail@vasilij.de> [2020-10-11 15:51]:
> > Does MELPA contains non-free software?
> 
> No, it doesn't.  Neither does the website contain non-free JS, it runs
> fine with LibreJS.  The only concern here is that MELPA does not adhere
> to GNU's coding guidelines, such as never ever referring, linking or
> otherwise supporting non-free software (for example by hosting packages
> that wrap non-free executables or are tied into working with non-free
> operating systems).

In other words packages on MELPA would or could refer, link and
support non-free software including wrapping it.

Hypothetical example could be the emacs package that supports
proprietary speech system, such package could be interesting for
developers, but without proprietary speech system it could not run,
thus disabling freedom of users.

Emacs is free software project, forerunner, so I guess that developers
by GNU principles would not support, improve, develop, those software
packages that are beyond free software principles. What each developer
does in their private life is their own decision, each is free to use
proprietary software how they wish, yet in the written or not written
agreement for Emacs development, you all do not develop or support
proprietary software.

Thus a survey that brings up the issue that somebody would like to see
Emacs Lisp package that supports proprietary speech software on
Windows, would simply not work, as that would be waste of time.

Nevertheless such inputs may come anyway, if good communication
channel is offered, but there is no need to support inputs from users
who would use or do not mind using proprietary wrapped software, as
project is GNU, and Emacs is inseparable of principles of free
software and GNU.

> And why should they, they are not GNU, they are a community-provided
> package archive and a wildly successful one, too.
> 
> Even if it contained non-free software, this is beside the point.
> What use is a survey if it doesn't strive to accurately capture the
> status quo and instead basks in ideological purity?

In my opinion, if GNU project is asking for input by well established
communication line, and I suggest that such is implemented in Help
menu, then it is inseparable from the movement to push free software
philosophy onto users, as that is good thing to do.

Ideological purity is impossible attainment.

Every person is free to make surveys, any company or any individual, a
user could use even proprietary software to make survey for Emacs,
Microsoft would be free to begin its Windows by asking if their editor
is better or Emacs. Any private person can turn on advertising on
Internet and capture Emacs users and ask them any questions. This
freedom of making surveys exist. I am saying this as "Emacs Survey"
can be done independently on global level, but that is not for GNU to
do it in that manner.

MELPA probably collects information of IP addresses, locations, and
number of downloads, thus they have enough data and possibilities for
their own survey. By the way, it disallows me to browse the MELPA.ORG
website without Javascript, I do not know if it is free or not.

Let us imagine Microsoft providing Emacs script repository, that is
quite possible, they do it now indirectly through Github, but we can
imagine that such abusive company could lead users to many non-free
software, and that was never the purpose of Emacs. Would then GNU ask
Microsoft to ask users about that?! I don't think so, so GNU and GNU
Emacs are inseparable from free software enlightenment and should not
lead users to repositories where users may download or otherwise get
abused by proprietary software.

I like looking into extreme hypothetical situations to recognize if
the direction of any action is supportive or not supportive for the
group of people I personally belong, in this case free software
movement. And that does not mean bashing onto anybody who bundles
proprietary software, it just means promoting more of those free
software principles to guide people gently into abuse free future.

Jean






^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 17:15             ` Jean Louis
@ 2020-10-11 17:36               ` Thibaut Verron
  2020-10-11 18:13                 ` Brett Gilio
  2020-10-11 18:34                 ` Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-11 17:36 UTC (permalink / raw)
  To: Jean Louis; +Cc: Adrien Brochard, Richard Stallman, emacs-devel

> MELPA probably collects information of IP addresses, locations, and
> number of downloads, thus they have enough data and possibilities for
> their own survey. By the way, it disallows me to browse the MELPA.ORG
> website without Javascript, I do not know if it is free or not.

LibreJS only blocks two scripts on melpa.org: a twitter widget, and a
google analytics snippet.

Neither of those are necessary for using the site.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  7:31               ` Tomas Hlavaty
  2020-10-11 12:04                 ` Jean Louis
@ 2020-10-11 17:47                 ` Philip K.
  1 sibling, 0 replies; 838+ messages in thread
From: Philip K. @ 2020-10-11 17:47 UTC (permalink / raw)
  To: Tomas Hlavaty; +Cc: emacs-devel

Tomas Hlavaty <tom@logand.com> writes:

> On Sat 10 Oct 2020 at 12:35, "Philip K." <philipk@posteo.net> wrote:
>> That could be mitigated with a "graceful degradation" approach, since
>> most people do have javascript activated by default.
>
> it should be possible to fill in the survey from emacs

Of course, that's what "graceful degradation" implies. If Javascript is
available, it will be used to improve the user experience. If not,
everything still continues working, just eg. without the interactivity
that Javascript might provide.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  5:24               ` Richard Stallman
@ 2020-10-11 17:59                 ` Philip K.
  2020-10-12  2:03                   ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-10-11 17:59 UTC (permalink / raw)
  To: Richard Stallman; +Cc: abrochard, emacs-devel

Richard Stallman <rms@gnu.org> writes:

>   > >>> - mysql instead of sqlite, which also implies a mysql instance running
>   > >>
>   > >> SQLite is actually surprisingly resilient, according to [0]:
>
> It would be a mistake to put the input into any sort of database
> program.  That would only make things difficult and increase the
> special knowledge people would need in order to work on this.
>
> Here's the simple and clean way to do it.
>
> Each time a user responds, convert all the answers into a formulaic
> piece text which states the questions and answers.  Email that to a
> certain address, which will accumulate these messages in one inbox
> file.
>
> Then it will be simple to do all sorts of counting or analysis on that
> file.

The issue I see here is that if you expert plain-text responses, someone
might just submit something that breaks the format, or even submit an
email written in HTML. So the data couldn't just be stored in plain
text, but would have to at least have some decoding to correctly parse
the message, and some encoding the safely store the message. You
wouldn't want someone who could submit 1000 fake or troll responses,
just because they know what what's going on behind the scenes.

> Database programs are useful when there are hundreds of thousands of
> records and you need to search for any one of them.  Or when the data
> are being altered.  We will not have so many answers, and each one
> will never change once sent.

Databases are useful whenever you've got data to work with. SQLite is
useful at whatever sale one is working at, from browsers to cars. And
besides, it's safer to use than directly writing to the file system (see
https://danluu.com/file-consistency/ for more details). And generally
speaking, file systems are also just databases, just that they are
directory-oriented, not record-oriented and usually have better support
in regards to OS primitives.

All in all, I don't this that this should be an issue, SQLite is well
documented, and can easily be extracted into whatever format someone
might need or want, just easier than with a mailbox or other classical
unix-like approaches.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 17:36               ` Thibaut Verron
@ 2020-10-11 18:13                 ` Brett Gilio
  2020-10-11 18:27                   ` Thibaut Verron
  2020-10-11 18:34                 ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Brett Gilio @ 2020-10-11 18:13 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Adrien Brochard, Richard Stallman, Jean Louis, emacs-devel

Thibaut Verron <thibaut.verron@gmail.com> writes:

>
> LibreJS only blocks two scripts on melpa.org: a twitter widget, and a
> google analytics snippet.
>
> Neither of those are necessary for using the site.
>

It would be great if melpa.org didn't require Javascript for
functionality, at all. But that is just my opinion.

It is not possible to browse packages on M-x eww, for example. Perhaps a
fallback would be nice.

-- 
Brett M. Gilio
<brettg@gnu.org>
https://brettgilio.com



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 15:15         ` Drew Adams
@ 2020-10-11 18:25           ` Jean Louis
  2020-10-11 19:47             ` Drew Adams
  2020-10-13  3:48             ` How to request changes in Emacs Richard Stallman
  2020-10-11 20:19           ` Proposal for an Emacs User Survey Drew Adams
  1 sibling, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 18:25 UTC (permalink / raw)
  To: Drew Adams; +Cc: Adrien Brochard, rms, emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-11 18:15]:
> Actually, we already have this functionality, which is
> submitting free-form feedback of any kind.  We call it
> an enhancement request, and we tell users to use
> `M-x report-emacs-bug' for it.  This is not as well
> known as it should be, IMO.

Only that "report Emacs bug" does not sound as free form feedback of
any kind. I know it is, but it does not sound as enhancement
request. It takes time for person to realize that.

> It would be good for the `Help' menu to have an item
> that explicitly calls this `Suggest Improvements' or
> similar.  It would be bound to `report-emacs-bug'.

Such menu in Help could lead users to subscribe, unsubscribe, review
or send email to help-gnu-emacs mailing list, send improvement or
enhancement suggestions or anything, similar like GNU Hyperbole is
doing it since decades.

Survey in the context of the opinion poll:
https://en.wikipedia.org/wiki/Survey_(human_research)#Opinion_poll

The Help menu that would easier enable communication channel with
users is necessary.

Survey itself is not as much important as the ability or capacity in
Emacs development to analyse the data that is already there in public,
as I mentioned, bug report database is there, and there are numbers of
stars or likes on various public projects, then there are search
engines, and various comments of users on other public channels.

Subject of stars/likes and considering that users really like
something because of number of stars/likes is doubtful. Those who have
spent few  thousand dollars on advertising of their services or
products, they will know why is number of stars/likes doubtful.

Example is Spacemacs configuration, I do not know if it is
"configuration" or "text editor built on top of Emacs" as it says on
Archlinux website: https://wiki.archlinux.org/index.php/Spacemacs

What I may say about that, even if Spacemacs developers did not
advertise, they could as well advertise for it and obtain those
stars/likes and apparent online popularity. But number of stars does
not necessarily mean number of users.

Number of users publishing online that they use Spacemacs, does not
necessarily mean that is less then number of users who do not use
Spacemacs, maybe those groups are not willing to publish their
statements, or find it silly, like I do. I find it silly to argue
about theming, fonts, but maybe is that exactly what is attracting
users, some nice theme, flashy, shiny stuff.

That is up to Emacs analysis department (emacs-devel) to accept as
challenge.

> I've said this before (dunno whether I've proposed a separate `Help'
> menu item).  We should make `report-emacs-bug' better known as a
> recommended way to submit ANY feedback about Emacs.

Definitely. 

> The command name can mislead wrt this role.  A
> separate `Help' menu item would help (even though
> redundant with item `Send Bug Report').  Or change
> that item to `Send Feedback or Bug Report'.
> 
> It might also make sense, for discoverability etc.,
> to add a `send-feedback' alias for `send-bug-report'.

That is right.

> Well, it doesn't constitute a "survey", but it does correspond to
> what RMS, I, and Jean-Louis have emphasized here: getting users to
> say, in their own words, what they want and what they do.

Let me emphasize again, there is number of users who will never speak
in public or publish their opinion, why should they? (as thinking from
their view point). In my opinion that is greater number of Emacs
users. It has to be taken in consideration if then developers are
working only for those who are online louder and more exposed to talk,
or if they should be maybe working on some set of principles for
general users.

Let me give you few practical examples from:
https://www.debian.org/users/

There are listed among others, following organizations:

* Electronics Research Group, University of Aberdeen, Aberdeen, Scotland
* Department of Informatics, University of Zurich, Zurich, Switzerland
* General Students' Committee (AStA), Saarland University, Saarbrücken, Germany
* Athénée Royal de Gembloux, Gembloux, Belgium
* Computer Science, Brown University, Providence, RI, USA
* Sidney Sussex College, University of Cambridge, UK
* Centro de Comunicación Científica, Universidad de Buenos Aires, Argentina
* CEIC, Scuola Normale Superiore di Pisa, Italy
* Mexican Space Weather Service (SCiESMEX), Geophysics Institute campus Morelia (IGUM), National University of Mexico (UNAM), Mexico
* COC Araraquara, Brazil
* Department of Computer Science, Savitribai Phule Pune University, India
* Departamento de Arquitectura y Tecnología de Sistemas Informáticos (Facultad de Informática), Universidad Politécnica de Madrid, Madrid, Spain
* Department of Control Engineering, Faculty of Electrical Engineering, Czech Technical University, Czech Republic
* Swiss Federal Institute of Technology Zurich, Department of Physics, ETH Zurich, Switzerland
* Formation Canadienne, Université Libre de Guinée (UG), Conakry, Republic of Guinea
* Genomics Research Group, CRIBI - Università di Padova, Italy
* Department of Geological Sciences and Geotechnology, University of Milano-Bicocca, Italy
* Dipartimento di Geoscienze, Università degli Studi di Padova, Italy
* Nucleo Lab, Universidad Mayor de San Andrés, Bolivia
* Department of Physics, Harvard University, USA

I am to assume that among those organizations there are many people
using Emacs, people of different characteristics, not of those groups
who like theming and online popularities, so those people in those
organizations, who use Emacs, in my opinion, would be less loud online
to promote Emacs in the manner how Doom/Spacemacs or others are doing
it. Such people would be impossible to reach by publishing some online
survey anywhere, but they could be reached through Help menu.

There are various groups of people, now we have groups of people who
think that Spacemacs is editor built on top of Emacs, maybe it is
true, so it is written, but that group of people is now mentioning
"Spacemacs" and not Emacs, so they will even ask classic Emacs
questions under Spacemacs subjects online. To introduce those users to
Emacs development and helpful mailing lists, such menu Help -->
Contact us or Tell us your opinion, would be helpful.

But nevertheless Spacemacs as example of online apparent popularity,
not the real popularity. What if Spacemacs have employed advertising
to reach stars and likes? That is not hard to do.

I do not think that Emacs ever advertised as commercial companies are
doing it, it is self-advertised and promoted through OS distributions.

Real popularity could be somehow obtained if GNU/Linux distributions
and BSD and other operating system distributions and Emacs main
website would publish their statistics.

Real data useful for surveys cannot be accurately obtained by
publishing such survey online anywhere else but in Emacs itself,
including with email and with the anonymous form submission where no
personal user information will be entered. I would even state
explicitly that no IP logs will be kept, all would go to /dev/null and
systems like captcha would not be necessary, as Emacs could formulate
the buffer with the HTML rendered and viewed with eww that already
contains inside tokens that will recognize that such form is coming
from within Emacs and from nowhere else. Separate form could be made
for online public.

Summary:

- there are different groups of users, in my opinion, development is
  rather looking onto feedback of those who are more loud online, as
  those who don't communicate they cannot be reached anyway

- those groups of users who are publicly telling about their ideas
  related to Emacs, may not be, or may be, representative or majority
  group of users, but myself I doubt they are. Relying that those
  groups are representative for majority of Emacs users is doubtful as
  well. 

- it is better to develop for majority, just as by principle was done
  for years for and within Emacs, and I would say to skip all the
  surveys, and to increase the analysis and enhancement
  capacities. Data is already there as mentioned.

- if any survey is done, such survey should target to find out what
  the majority really wants, in order to bring about more Emacs
  popularity. But looking into present popular projects, one can
  easily draw conclusions without vias.

- add the button in the Help menu to contact help-gnu-emacs mailing
  list, subscribe, unsubscribe, send email anyway, or send feedback or
  send bug report. The "Send bug report" menu could be converted to
  multi menu doing that feature.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:13                 ` Brett Gilio
@ 2020-10-11 18:27                   ` Thibaut Verron
  2020-10-11 18:44                     ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-11 18:27 UTC (permalink / raw)
  To: Brett Gilio; +Cc: Adrien Brochard, Richard Stallman, Jean Louis, emacs-devel

> It would be great if melpa.org didn't require Javascript for
> functionality, at all. But that is just my opinion.
>
> It is not possible to browse packages on M-x eww, for example. Perhaps a
> fallback would be nice.

M-x list-packages ?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 10:32       ` Jean Louis
  2020-10-11 15:15         ` Drew Adams
@ 2020-10-11 18:33         ` Philip K.
  2020-10-11 18:45           ` Jean Louis
                             ` (2 more replies)
  1 sibling, 3 replies; 838+ messages in thread
From: Philip K. @ 2020-10-11 18:33 UTC (permalink / raw)
  To: Jean Louis; +Cc: Adrien Brochard, rms, emacs-devel

Jean Louis <bugs@gnu.support> writes:

> * Teemu Likonen <tlikonen@iki.fi> [2020-10-10 11:35]:
>> * 2020-10-09 19:12:23-04, Adrien Brochard wrote:
>> 
>> > Please find the list of questions I have gathered at the end of this
>> > email.
>> 
>> Great! I would like to see this survey conducted. It would be
>> interesting to see what people use Emacs for and some distribution of
>> answers. It's not easy to find good sample of users but if the survey is
>> published in some main communication platforms or communities it will be
>> good enough, I think.
>
> If survey is published, for example on Reddit, such survey is narrow
> and specific to Reddit users, and would represent only that
> communication channel.
>
> My proposal on how to publish a survey is to include that in the Help
> menu, and let people do it straight from Emacs. That is similar to bug
> reporting, but it is not a bug, it is feature request.

But if you have to have mail configured, you're also only going to have
a specific subset of all users.

I think the idea of having a survey that could be filled out from Emacs
is interesting (although we would only get to hear from current users,
not previous users). But it would have to work regardless of what the
user has configured or not. From what I see, that would either mean a
web form that can be filled out using EWW or a package that could be
downloaded from ELPA.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 17:36               ` Thibaut Verron
  2020-10-11 18:13                 ` Brett Gilio
@ 2020-10-11 18:34                 ` Jean Louis
  2020-10-11 19:15                   ` Thibaut Verron
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-11 18:34 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Adrien Brochard, Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-11 20:37]:
> > MELPA probably collects information of IP addresses, locations, and
> > number of downloads, thus they have enough data and possibilities for
> > their own survey. By the way, it disallows me to browse the MELPA.ORG
> > website without Javascript, I do not know if it is free or not.
> 
> LibreJS only blocks two scripts on melpa.org: a twitter widget, and a
> google analytics snippet.
> 
> Neither of those are necessary for using the site.

I expect that any site promoting Emacs based software is accessible
through Emacs and that such site should not expose me to Google
Intelligence and Twitter, I don't like being tracked across other
websites.

I can perfectly use http://elpa.gnu.org through Emacs

I cannot at all use https://melpa.org through Emacs, it is
impossible. It is common sense not to design sites in such stunned way
(sorry I was looking for synonyms of "stupid" not to be too bold).

Website of MELPA is ridiculous. If it promotes Emacs, it should be
accessible through Emacs. And now we discuss what Emacs users want,
example me, I don't want to be pushed around. 

MELPA 

* Packages <--- I can click, but nothing happens
* Getting started <--- I can click, but nothing happens
* GitHub <--- brings me to Microsoft Github (THE LINK WORKS!!! YEAH!!!)

MELPA (Milkypostman’s Emacs Lisp Package Archive)

* Up-to-date packages built on our servers from upstream source
* Installable in any Emacs with 'package.el' - no local version-control tools needed
* Curated - no obsolete, renamed, forked or randomly hacked packages
* Comprehensive - more packages than any other archive
* Automatic updates - new commits result in new packages
* Extensible - contribute recipes via github, and we'll build the packages

This site requires JavaScript to function. You can browse and install packages directly from Emacs (see MELPA's README.md on GitHub).

Source code for this page → 
JavaScript license information 

-------- end of inaccessible MELPA website --------

I cannot wait for non-GNU ELPA to begin.


Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 10:46                 ` Jean Louis
@ 2020-10-11 18:42                   ` Philip K.
  2020-10-11 19:46                     ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-10-11 18:42 UTC (permalink / raw)
  To: Jean Louis; +Cc: abrochard, rms, emacs-devel

Jean Louis <bugs@gnu.support> writes:

> * Philip K. <philipk@posteo.net> [2020-10-10 12:37]:
>> Richard Stallman <rms@gnu.org> writes:
>> 
>> > [[[ To any NSA and FBI agents reading my email: please consider    ]]]
>> > [[[ whether defending the US Constitution against all enemies,     ]]]
>> > [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>> >
>> >   > The most obvious reason to me is that user error handling is pretty
>> >   > poor. Because there is no JS, we cannot offer front-end validation, that
>> >   > means that the backend server is responsible for validating fields
>> >   > submitted.
>> >
>> > If we want to learn what users think, we should not limit their
>> > responses to a small set of 'valid" possible answers.  The plan
>> > I designed for inquiries asks users to answer in their own words.
>> 
>> But wouldn't that make it needlessly hard to analyse the results,
>> especially if the question should be numerically quantified?
>
> As I have done larger surveys for public relations and I know methods,
> I know how tedious it is to evaluate such survey, we have been
> employing many people, like 20 people, to just analyze what exactly
> did people check or did not check, what did they write, to read their
> handwriting, and then to properly analyze it.
>
> However, Emacs feature requests or survey about using Emacs need live
> user, not user as a number.

Of course, but there are still numbers that describe aggregate
phenomenons that individual users don't actively notice. A question I
would be interested in is what the correlation is between people who use
specific configuration-templates (Doom, Spacemacs, etc.) and how long
they have been using Emacs/Age. Depending on what the results are, we
would have a batter guess as to whether the popularity of these
templates is just because newer users aren't secure in configuring their
own Emacs, or if people just like these templates in general (what they
like is individual, that's where plain text responses are interesting).

Other than that, I don't see why both approaches should be possible.
Mixed, or separated, you can ask multiple/single choice questions for
"hard data", and plain text for individual opinions.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:27                   ` Thibaut Verron
@ 2020-10-11 18:44                     ` Jean Louis
  2020-10-11 18:58                       ` Thibaut Verron
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-11 18:44 UTC (permalink / raw)
  To: Thibaut Verron
  Cc: Adrien Brochard, Richard Stallman, Brett Gilio, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-11 21:28]:
> > It would be great if melpa.org didn't require Javascript for
> > functionality, at all. But that is just my opinion.
> >
> > It is not possible to browse packages on M-x eww, for example. Perhaps a
> > fallback would be nice.
> 
> M-x list-packages ?

It is possible that MELPA webmaster have setup that website with
intention not to let Emacs users browse packages through Emacs, but to
force them to install MELPA into Emacs

As the link to packages list is impossible to reach, but the link on
how to add MELPA to Emacs is quite reachable through Emacs.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:33         ` Philip K.
@ 2020-10-11 18:45           ` Jean Louis
  2020-10-13  3:48             ` Richard Stallman
  2020-10-11 19:47           ` Drew Adams
  2020-10-11 20:54           ` Jean Louis
  2 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-11 18:45 UTC (permalink / raw)
  To: Philip K.; +Cc: Adrien Brochard, rms, emacs-devel

* Philip K. <philipk@posteo.net> [2020-10-11 21:33]:
> I think the idea of having a survey that could be filled out from Emacs
> is interesting (although we would only get to hear from current users,
> not previous users). But it would have to work regardless of what the
> user has configured or not. From what I see, that would either mean a
> web form that can be filled out using EWW or a package that could be
> downloaded from ELPA.

To reach previous users, we may ask Vim and VSCode developers to
include the Emacs survey option.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:44                     ` Jean Louis
@ 2020-10-11 18:58                       ` Thibaut Verron
  2020-10-11 20:12                         ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-11 18:58 UTC (permalink / raw)
  To: Jean Louis; +Cc: Adrien Brochard, Richard Stallman, Brett Gilio, emacs-devel

Le dim. 11 oct. 2020 à 20:47, Jean Louis <bugs@gnu.support> a écrit :
>
> * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-11 21:28]:
> > > It would be great if melpa.org didn't require Javascript for
> > > functionality, at all. But that is just my opinion.
> > >
> > > It is not possible to browse packages on M-x eww, for example. Perhaps a
> > > fallback would be nice.
> >
> > M-x list-packages ?
>
> It is possible that MELPA webmaster have setup that website with
> intention not to let Emacs users browse packages through Emacs, but to
> force them to install MELPA into Emacs
>
> As the link to packages list is impossible to reach, but the link on
> how to add MELPA to Emacs is quite reachable through Emacs.

I think you're making an unfair "trial of motives" here.

You can add Melpa to the list of repositories in an emacs instance and
then browse it with list-packages. That will not "install Melpa" if
you don't add the repository line in your init.el.

For the record, here is the (short) discussion on the topic:
https://github.com/melpa/melpa/issues/3483



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:34                 ` Jean Louis
@ 2020-10-11 19:15                   ` Thibaut Verron
  2020-10-11 19:22                     ` Qiantan Hong
  2020-10-11 20:26                     ` Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-11 19:15 UTC (permalink / raw)
  To: Jean Louis; +Cc: Adrien Brochard, Richard Stallman, emacs-devel

> I can perfectly use http://elpa.gnu.org through Emacs
>
> I cannot at all use https://melpa.org through Emacs, it is
> impossible. It is common sense not to design sites in such stunned way
> (sorry I was looking for synonyms of "stupid" not to be too bold).

It seems reasonable to me that a list that changes every now and then
(Elpa) is easier to serve statically than a list which is updated
several times a day (Melpa).

But if the list of GNU Elpa is generated automatically, maybe the code
to do that can be useful to Melpa.

> Website of MELPA is ridiculous. If it promotes Emacs, it should be
> accessible through Emacs. And now we discuss what Emacs users want,
> example me, I don't want to be pushed around.

Or maybe Emacs should have a web browser which can run (free) javascript.

I don't think so, for obvious security reasons, but then again I don't
expect to be able to access all emacs-related websites from within
Emacs.

And, again, Melpa is accessible through Emacs: the entire content of
the website is served on an API which is fully supported by Emacs
(list-packages).

> This site requires JavaScript to function.

At least that's pretty explicit.

> JavaScript license information

And they went through the trouble of using only free javascript for
the website (except for the, admittedly, unnecessary twitter feed and
analytics, which a lot of users will block with their adblocker or
LibreJS).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 19:15                   ` Thibaut Verron
@ 2020-10-11 19:22                     ` Qiantan Hong
  2020-10-13  3:47                       ` Richard Stallman
  2020-10-11 20:26                     ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Qiantan Hong @ 2020-10-11 19:22 UTC (permalink / raw)
  To: thibaut.verron@gmail.com
  Cc: Adrien Brochard, rms@gnu.org, Jean Louis, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 393 bytes --]

> 
> Or maybe Emacs should have a web browser which can run (free) javascript.
> 
Emacs with —with-xwidget build already does. And I was working on some
patches to port librejs and potentially other WebExtensions plugins
to it. The copyright office of my school is a bit slow so it’s been stopped
for a while, but should not take much time once the copyright assignment
is complete.

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 1858 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:42                   ` Philip K.
@ 2020-10-11 19:46                     ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 19:46 UTC (permalink / raw)
  To: Philip K.; +Cc: abrochard, rms, emacs-devel

* Philip K. <philipk@posteo.net> [2020-10-11 21:42]:
> Jean Louis <bugs@gnu.support> writes:
> 
> > * Philip K. <philipk@posteo.net> [2020-10-10 12:37]:
> >> Richard Stallman <rms@gnu.org> writes:
> >> 
> >> > [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> >> > [[[ whether defending the US Constitution against all enemies,     ]]]
> >> > [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> >> >
> >> >   > The most obvious reason to me is that user error handling is pretty
> >> >   > poor. Because there is no JS, we cannot offer front-end validation, that
> >> >   > means that the backend server is responsible for validating fields
> >> >   > submitted.
> >> >
> >> > If we want to learn what users think, we should not limit their
> >> > responses to a small set of 'valid" possible answers.  The plan
> >> > I designed for inquiries asks users to answer in their own words.
> >> 
> >> But wouldn't that make it needlessly hard to analyse the results,
> >> especially if the question should be numerically quantified?
> >
> > As I have done larger surveys for public relations and I know methods,
> > I know how tedious it is to evaluate such survey, we have been
> > employing many people, like 20 people, to just analyze what exactly
> > did people check or did not check, what did they write, to read their
> > handwriting, and then to properly analyze it.
> >
> > However, Emacs feature requests or survey about using Emacs need live
> > user, not user as a number.
> 
> Of course, but there are still numbers that describe aggregate
> phenomenons that individual users don't actively notice. A question I
> would be interested in is what the correlation is between people who use
> specific configuration-templates (Doom, Spacemacs, etc.) and how long
> they have been using Emacs/Age. Depending on what the results are, we
> would have a batter guess as to whether the popularity of these
> templates is just because newer users aren't secure in configuring their
> own Emacs, or if people just like these templates in general (what they
> like is individual, that's where plain text responses are
> interesting).

I have the book of I guess Robert Kyosaki here, I cannot find at
moment exact reference, the idea I got from the book (or maybe not),
is that surveys can be done easily, one can start asking even less
number of users and with simple questions, and one will very soon find
a pattern that becomes very probable final survey result.

As those configuration templates are located on Microsoft Github, one
way to make the survey or find out that information is to submit the
issue there in each configuration, and simply ask them, you will find
out.

Another fact is that developers of those configurations obviously
already did their own analysis on what is needed and wanted and
produced that what became popular configuration. Their survey is
already done. Thus if Spacemacs configuration is most popular, then
core Emacs developers could use those results of established famous
features and see if anything could be implemented easier from
upstream. 

My personal view point on Spacesmacs, Doom, etc. is that those group
of people like shiny, like showing off their theming, they have time
for their hobby, but I have not researched enough, did not install any
of those, I don't even install external themes, I use only those built
ins.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-11 18:33         ` Philip K.
  2020-10-11 18:45           ` Jean Louis
@ 2020-10-11 19:47           ` Drew Adams
  2020-10-11 20:33             ` Jean Louis
  2020-10-11 20:54           ` Jean Louis
  2 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-11 19:47 UTC (permalink / raw)
  To: Philip K., Jean Louis; +Cc: Adrien Brochard, rms, emacs-devel

> > My proposal on how to publish a survey is to include that in the Help
> > menu, and let people do it straight from Emacs. That is similar to bug
> > reporting, but it is not a bug, it is feature request.
> 
> But if you have to have mail configured, you're also only going to have
> a specific subset of all users.

Nothing _limits_ input to email.  That's all we
handle today, and we should at least continue to
handle such input.  But if we want to entertain
supporting other input methods (smoke signals...
whatever), that's not impossible.

> I think the idea of having a survey that could be filled out from Emacs
> is interesting (although we would only get to hear from current users,
> not previous users). But it would have to work regardless of what the
> user has configured or not. From what I see, that would either mean a
> web form that can be filled out using EWW or a package that could be
> downloaded from ELPA.

It's not only either/or.

The point of the suggestion was to leverage the
existing `report-emacs-bug' input of general,
free-form feedback.  Where "leverage" also means
encourage.  And that in turn means new names
(command alias, menu items,... whatever) and
some new description (e.g. rework the wording of
the existing bug-reporting instructions).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-11 18:25           ` Jean Louis
@ 2020-10-11 19:47             ` Drew Adams
  2020-10-11 20:36               ` Jean Louis
  2020-10-13  3:48             ` How to request changes in Emacs Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-11 19:47 UTC (permalink / raw)
  To: Jean Louis; +Cc: Adrien Brochard, rms, emacs-devel

> > Actually, we already have this functionality, which is
> > submitting free-form feedback of any kind.  We call it
> > an enhancement request, and we tell users to use
> > `M-x report-emacs-bug' for it.  This is not as well
> > known as it should be, IMO.
> 
> Only that "report Emacs bug" does not sound as free form feedback of
> any kind. I know it is, but it does not sound as enhancement
> request. It takes time for person to realize that.

Agreed.  Along with the suggestion to (also) pitch
the command as a way to provide feedback of any kind,
we should work on the command's description and even
some of its behavior.

The fact that it is also for suggestions should be as
front-and-center as is the fact that it is the preferred
way to submit a bug report.

> > It would be good for the `Help' menu to have an item
> > that explicitly calls this `Suggest Improvements' or
> > similar.  It would be bound to `report-emacs-bug'.
> 
> Such menu in Help could lead users to subscribe, unsubscribe, review
> or send email to help-gnu-emacs mailing list, send improvement or
> enhancement suggestions or anything, similar like GNU Hyperbole is
> doing it since decades.

Those kinds of things are indeed also possible.
We could add a submenu of `Help' for things
related to the existing mailing lists (reading,
subscribing, submitting).

> The Help menu that would easier enable communication channel with
> users is necessary.
> 
> Survey itself is not as much important as the ability or capacity in
> Emacs development to analyse the data that is already there in public,
> as I mentioned, bug report database is there, and there are numbers of
> stars or likes on various public projects, then there are search
> engines, and various comments of users on other public channels.
> 
> Subject of stars/likes and considering that users really like
> something because of number of stars/likes is doubtful. Those who have
> spent few  thousand dollars on advertising of their services or
> products, they will know why is number of stars/likes doubtful.

I tend to agree.  Almost anything can be of some value,
but extracting real, useful value from some things can be
unobvious, difficult, or otherwise not worth the trial.

> > I've said this before (dunno whether I've proposed a separate `Help'
> > menu item).  We should make `report-emacs-bug' better known as a
> > recommended way to submit ANY feedback about Emacs.
> 
> Definitely.
> 
> > The command name can mislead wrt this role.  A
> > separate `Help' menu item would help (even though
> > redundant with item `Send Bug Report').  Or change
> > that item to `Send Feedback or Bug Report'.
> >
> > It might also make sense, for discoverability etc.,
> > to add a `send-feedback' alias for `send-bug-report'.
> 
> That is right.
> 
> > Well, it doesn't constitute a "survey", but it does correspond to
> > what RMS, I, and Jean-Louis have emphasized here: getting users to
> > say, in their own words, what they want and what they do.
> 
> Let me emphasize again, there is number of users who will never speak
> in public or publish their opinion, why should they? (as thinking from
> their view point). In my opinion that is greater number of Emacs
> users. It has to be taken in consideration if then developers are
> working only for those who are online louder and more exposed to talk,
> or if they should be maybe working on some set of principles for
> general users.

Of course.  For active input we're pretty much limited
to voluntary contribution.  That can be encouraged, but
we can be sure, at most, only that it represents the
views of the volunteers.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:58                       ` Thibaut Verron
@ 2020-10-11 20:12                         ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 20:12 UTC (permalink / raw)
  To: Thibaut Verron
  Cc: Adrien Brochard, Richard Stallman, Brett Gilio, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-11 21:58]:
> Le dim. 11 oct. 2020 à 20:47, Jean Louis <bugs@gnu.support> a écrit :
> >
> > * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-11 21:28]:
> > > > It would be great if melpa.org didn't require Javascript for
> > > > functionality, at all. But that is just my opinion.
> > > >
> > > > It is not possible to browse packages on M-x eww, for example. Perhaps a
> > > > fallback would be nice.
> > >
> > > M-x list-packages ?
> >
> > It is possible that MELPA webmaster have setup that website with
> > intention not to let Emacs users browse packages through Emacs, but to
> > force them to install MELPA into Emacs
> >
> > As the link to packages list is impossible to reach, but the link on
> > how to add MELPA to Emacs is quite reachable through Emacs.
> 
> I think you're making an unfair "trial of motives" here.

Slight act of distracting and magic is done, instead of letting users
understand what MELPA is, like does it at all offer free software (it
is not described on the page or mentioned), it just says: do this and
install this in Emacs, then proceed with installation of packages. It
does not link back to Emacs software page, which I would as
responsible webmaster always do.

As I am not a judge, I make no trials, my impression though remains
the same that it was intentional. Now you say the bug report from 2016
to make MELPA browsable by Emacs still remains same.

> For the record, here is the (short) discussion on the topic:
> https://github.com/melpa/melpa/issues/3483

I see some pretty trivial nonsense there:
> "There is therefore no easy way to fix this, and I don't believe it
> is worth a bigger effort,"

How it was done by using Javascript, it can be done by using Emacs
Lisp or any other programming language, and generate static pages,
quite automatically.

> You can add Melpa to the list of repositories in an emacs instance and
> then browse it with list-packages. That will not "install Melpa" if
> you don't add the repository line in your init.el.

I am speaking of accessibility subject.

It will be remedied with elpa.nongnu.org





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-11 15:15         ` Drew Adams
  2020-10-11 18:25           ` Jean Louis
@ 2020-10-11 20:19           ` Drew Adams
  2020-10-11 20:42             ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-11 20:19 UTC (permalink / raw)
  To: Jean Louis, Teemu Likonen; +Cc: Adrien Brochard, rms, emacs-devel

> I've said this before....  We should make
> `report-emacs-bug' better known as a recommended
> way to submit ANY feedback about Emacs.
...
> It might also make sense, for discoverability etc.,
> to add a `send-feedback' alias for `send-bug-report'.

I'll mention also that I often suggest to users
(e.g. on SE.emacs or Reddit) that they use `M-x
report-emacs-bug' to send an enhancement request.

And pretty much each time I feel obliged to add
something like "(that's for enhancement reports,
as well as bug reports)" so they aren't scared
away by the command name, thinking that it's
something too serious or that they might get
criticized for not submitting a report of a
proper bug.

An alias that emphasizes general feedback to
improve Emacs would be good, I think.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 19:15                   ` Thibaut Verron
  2020-10-11 19:22                     ` Qiantan Hong
@ 2020-10-11 20:26                     ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 20:26 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Adrien Brochard, Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-11 22:16]:
> > I can perfectly use http://elpa.gnu.org through Emacs
> >
> > I cannot at all use https://melpa.org through Emacs, it is
> > impossible. It is common sense not to design sites in such stunned way
> > (sorry I was looking for synonyms of "stupid" not to be too bold).
> 
> It seems reasonable to me that a list that changes every now and then
> (Elpa) is easier to serve statically than a list which is updated
> several times a day (Melpa).

What can be generated online, it can be generated statically, it is
matter of seconds. Thus I am not underestimating the webmaster of
MELPA. He did not want it in 2016, he does not want it now. There is
no "discussion" on the bug report, he closed the bug, finished. It
does not seem to be user friendly.

There is nothing interactive on MELPA to be served dynamically, there
is no user input other than clicking, there are no interactions. I do
not underestimate programmers and their intelligence. If MELPA would
be easily browsable, it would be easily duplicated as a website.

> But if the list of GNU Elpa is generated automatically, maybe the
> code to do that can be useful to Melpa.

Of course it can. For now it seem trivial, and can be done through
Emacs Lisp. 

> > Website of MELPA is ridiculous. If it promotes Emacs, it should be
> > accessible through Emacs. And now we discuss what Emacs users want,
> > example me, I don't want to be pushed around.
> 
> Or maybe Emacs should have a web browser which can run (free)
> javascript.

But why only javascript, maybe Emacs should have Emacs Lisp instead of
Javascript, that way we could run programs on Emacs by installing them
straight from websites without knowing what is going to happen, within
some safe environment so that it does not affect the
system. So far I know, any script could be included in web pages, it
all depends of plugins to browsers, I remember Perl could be included
in the web pages, and other programming languages, why not Emacs Lisp
then.

> I don't think so, for obvious security reasons, but then again I
> don't expect to be able to access all emacs-related websites from
> within Emacs.

That's what I am talking about, it should be accessible through Emacs.

> And, again, Melpa is accessible through Emacs: the entire content of
> the website is served on an API which is fully supported by Emacs
> (list-packages).
> 
> > This site requires JavaScript to function.
> 
> At least that's pretty explicit.

And how that can be good, we speak of Emacs, not of whatever
else. People do use Internet through Emacs.

> > JavaScript license information
> 
> And they went through the trouble of using only free javascript for
> the website (except for the, admittedly, unnecessary twitter feed and
> analytics, which a lot of users will block with their adblocker or
> LibreJS).

Which makes the MELPA website non-free website, not recommended for
freedom lovers.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 19:47           ` Drew Adams
@ 2020-10-11 20:33             ` Jean Louis
  2020-10-11 23:24               ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-11 20:33 UTC (permalink / raw)
  To: Drew Adams; +Cc: Philip K., Adrien Brochard, rms, emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-11 22:48]:
> > > My proposal on how to publish a survey is to include that in the Help
> > > menu, and let people do it straight from Emacs. That is similar to bug
> > > reporting, but it is not a bug, it is feature request.
> > 
> > But if you have to have mail configured, you're also only going to have
> > a specific subset of all users.
> 
> Nothing _limits_ input to email.  That's all we handle today, and we
> should at least continue to handle such input.  But if we want to
> entertain supporting other input methods (smoke signals...
> whatever), that's not impossible.

Is hard for me to understand the above.

Let me say that trends changed, there are now more people using
Internet, and there are more people using Internet without email or
not knowing what email does, or having email, but never using it and
not knowing what it does, including people having email and using it
exclusively on their mobile devices, not knowing they can use it from
computers.

Suspicious is also Windows and other systems but Unix-like systems,
I did not try, I just don't know how would report-emacs-bug function
on Windows, I doubt it is well integrated.

I would just make it as a form, either as Emacs forms from forms.el
library, plus some POST to URL, or as HTML form by using eww.

In such form, user could enter email, but if user does not have email,
need not enter such, neither the name. User could still communicate,
it would be one way, but better some opinions then none, hey.

> > I think the idea of having a survey that could be filled out from Emacs
> > is interesting (although we would only get to hear from current users,
> > not previous users). But it would have to work regardless of what the
> > user has configured or not. From what I see, that would either mean a
> > web form that can be filled out using EWW or a package that could be
> > downloaded from ELPA.
> 
> It's not only either/or.
> 
> The point of the suggestion was to leverage the existing
> `report-emacs-bug' input of general, free-form feedback.  Where
> "leverage" also means encourage.  And that in turn means new names
> (command alias, menu items,... whatever) and some new description
> (e.g. rework the wording of the existing bug-reporting
> instructions).

Not sure, I would leave report-emacs-bug in place, and add feedback or
suggestions with different wording, including access to friendly
mailing lists and IRC channel.

So far fastest way to get live help for Emacs is IRC.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 19:47             ` Drew Adams
@ 2020-10-11 20:36               ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 20:36 UTC (permalink / raw)
  To: Drew Adams; +Cc: Adrien Brochard, rms, emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-11 22:48]:
> Those kinds of things are indeed also possible.  We could add a
> submenu of `Help' for things related to the existing mailing lists
> (reading, subscribing, submitting).

Please install Hyperbole and see how they done that.

> > > Well, it doesn't constitute a "survey", but it does correspond to
> > > what RMS, I, and Jean-Louis have emphasized here: getting users to
> > > say, in their own words, what they want and what they do.
> > 
> > Let me emphasize again, there is number of users who will never speak
> > in public or publish their opinion, why should they? (as thinking from
> > their view point). In my opinion that is greater number of Emacs
> > users. It has to be taken in consideration if then developers are
> > working only for those who are online louder and more exposed to talk,
> > or if they should be maybe working on some set of principles for
> > general users.
> 
> Of course.  For active input we're pretty much limited to voluntary
> contribution.  That can be encouraged, but we can be sure, at most,
> only that it represents the views of the volunteers.

Those who don't want to tell anything, should speak out louder...



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 20:19           ` Proposal for an Emacs User Survey Drew Adams
@ 2020-10-11 20:42             ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 20:42 UTC (permalink / raw)
  To: Drew Adams; +Cc: Adrien Brochard, rms, emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-11 23:20]:
> > I've said this before....  We should make
> > `report-emacs-bug' better known as a recommended
> > way to submit ANY feedback about Emacs.
> ...
> > It might also make sense, for discoverability etc.,
> > to add a `send-feedback' alias for `send-bug-report'.
> 
> I'll mention also that I often suggest to users
> (e.g. on SE.emacs or Reddit) that they use `M-x
> report-emacs-bug' to send an enhancement request.
> 
> And pretty much each time I feel obliged to add
> something like "(that's for enhancement reports,
> as well as bug reports)" so they aren't scared
> away by the command name, thinking that it's
> something too serious or that they might get
> criticized for not submitting a report of a
> proper bug.
> 
> An alias that emphasizes general feedback to
> improve Emacs would be good, I think.

You are putting much energy into that.

Then, did you review the bug database, how many enhancements really
arrived?

Now, speaking of Emacs improvements, those popular configurations are
already showing what some users wish and want, they also do good work
in attracting new users to Emacs.

Speaking of MELPA, that is also something users want, so I hope we
start somehow doing elpa.nongnu.org where such packages can be
invited, so I understood, polished and distributed.

So, all those popular configurations could be then forked into
elpa.nongnu.org including thousands of other packages, after careful
review.

That is for me the summary of this talk, there is need for a shelf
with new shiny shoes.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 23:12   ` Adrien Brochard
                       ` (4 preceding siblings ...)
  2020-10-11  5:23     ` Richard Stallman
@ 2020-10-11 20:54     ` Bonface M. K.
  2020-10-16 13:30     ` Philip K.
  6 siblings, 0 replies; 838+ messages in thread
From: Bonface M. K. @ 2020-10-11 20:54 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: rms, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 6164 bytes --]


Hi all! Just some minor feedback.

Adrien Brochard <abrochard@gmx.com> writes:

[...]
>
> I also agree with this. I think no matter what we are going to get
> selection bias and we should not rush any decision based on the survey
> results.
>
>
> * Survey Questions
> (Please note that any "other" should allow for free text entry for the
> respondent to elaborate)
>
> ** How would you characterize your use of Emacs?
>    - Use it for work
>    - I use it for serious "hobby" projects
>    - I'm just tinkering
>    - I use it for my studies
>    - Other
>

You could use Emacs for "everything". I'd propose
you make this question open-ended?

> ** What do you use Emacs for?
>     - Software development
>     - Research writing
>     - Data science
>     - Writing
>     - Other
>

Same as above. You could use Emacs as a
combination of the above.

> ** How long have you been using Emacs?
>
> ** Which version of Emacs do you use?
>
> ** What OS do you primary use?
>     - Linux
>     - Windows
>     - MacOS
>     - BSD
>     - Other
>
> ** How do you use Emacs?
>     - GUI
>     - Terminal (TUI)
>     - Both
>
> ** How do you run Emacs?
>     - Client/Server mode only
>     - Standalone application only
>     - Both
>
> ** Describe your configuration
>    - I am using vanilla emacs (little to no configuration).
>    - Custom configuration
>    - Spacemacs - https://github.com/syl20bnr/spacemacs
>    - Doom Emacs - https://github.com/hlissner/doom-emacs
>    - Prelude - https://github.com/bbatsov/prelude
>    - purcell emacs.d - https://github.com/purcell/emacs.d
>    - magnars emacs.d - https://github.com/magnars/.emacs.d
>    - Emacs Starter Kit - https://github.com/eschulte/emacs-starter-kit
>    - oh-my-emacs - https://github.com/xiaohanyu/oh-my-emacs
>    - Better Defaults - https://github.com/technomancy/better-defaults
>    - Graphene - https://github.com/rdallasgray/graphene
>    - ohai-emacs - https://github.com/bodil/ohai-emacs
>    - ergoemacs-mode - https://github.com/ergoemacs/ergoemacs-mode
>    - Rho Emacs - https://github.com/GChristensen/rho-emacs
>    - Radian - https://github.com/raxod502/radian
>    - Centaur Emacs - https://github.com/seagle0128/.emacs.d
>    - Other
>
> ** What keybindings do you use?
>    -  Emacs defaults
>    -  Evil/Spacemacs/Doom-Emacs (all the vim-likes)
>    -  CUA-mode
>    -  God-mode
>    -  Boon
>    -  Xah-Fly-Keys
>    -  Custom modal (ryo-modal, etc)
>    -  Custom modifiers (Emacs from scratch)
>    -  Other
>
> ** Prior to using Emacs what was your primary editor?
>    - VIM
>    - VScode
>    - Eclipse
>    - Notepad++
>    - Sublime
>    - Intelij
>    - Other
>
> ** org-mode usage
>     - I use emacs only for org-mode
>     - dayly
>     - from time to time
>     - Not a org-mode user
>
> ** Which completion/selection framework do you use?
>    - helm
>    - ivy
>    - ido
>    - icomplete
>    - other
>    - i don't use a completion framework
>
> ** How do you manage third-party elisp?
>     - built-in package.el
>     - Spacemacs does it for me
>     - straight.el
>     - borg
>     - leaf
>     - el-get
>     - Nix
>     - git submodules without Borg
>     - git subtrees
>     - git clones
>     - guix
>     - quelpa
>     - cask
>     - No third-party deps
>     - other
>
> ** How do you get emacs packages(if applicable)?
>     - No repos
>     - Gnu Elpa
>     - Melpa/Melpa Stable
>     - Directly from the source (e. g. using straight).
>
> ** Can you list some of your favorite package?
>
> ** What package do you use for error checking?
>    - Flymake
>    - Flycheck
>    - None
>
> ** Do you use TRAMP?
>
> ** DO you use Magit?
>
> ** What package do you use for project management?
>     - project.el
>     - projectile
>     - Other(mention)
>     - None
>
> ** Do you use shell/terminal emulator in Emacs?
>     - eshell
>     - shell
>     - term
>     - ansi-term
>     - do not use.
>
> ** Do you use mail client in Emacs?
>     - Mu4e
>     - Gnus
>     - Mut
>     - notmuch
>     - do not use
>
> ** What is your Elisp proficiency?
>     - Beginner/No knowledge
>     - Basic elisp understanding
>     - Intermediate
>     - Advanced
>     - Expert
>
> ** If you use Emacs for programming, which languages do you program in?
>
> ** do you use a language server with lsp-mode? With what languages?
>
> ** Do you use Emacs for debugging? What do you use? (Gdb, dap-mode etc)
>
> ** Which theme do you use?
>
> ** Have you ever contributed to GNU Emacs core/Elpa?
>     - No
>     - No, but I would do that if the process is changed(e. g. using
> github pull requests instead of the mailing list, no papers, etc**.
>     - I do PRs from time to time
>     - I provide PRs regularly
>     - I am active contributor/maintainer
>
> ** Have you ever contributed to Melpa package?
>     - No
>     - I do PRs from time to time
>     - I provide PRs regularly
>     - I am a package maintainer
>
> ** What Emacs community forums have you visited in the past year?
> Answers would be things like
>     - r/emacs
>     - Emacs mailing list
>     - irc
>     - Emacs meetups
>     - I follow twitter Emacs related accounts
>     - Other
>
> ** What are some of the Emacs improvements you are the most interested in?
> ** what do you think are Emacs' greatest strengths?
> ** can you recall any difficulties you faced initially learning Emacs?
> ** What is the one thing you would like emacs to do differently?
> ** How did you hear about this survey?
> ** If there is another survey in 2021, would you be opposed to it
> containing optional & general demographics questions?
>    It could include age backets, gender, country or language
> ** Do you have a preferred platform for filling out the survey in the
> future?
> ** General feedback about the survey process?
>
>
>

-- 
Bonface M. K. (https://www.bonfacemunyoki.com)
Chief Emacs Mchochezi / Twitter: @BonfaceKilz
GPG key = D4F09EB110177E03C28E2FE1F5BBAE1E0392253F

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 869 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:33         ` Philip K.
  2020-10-11 18:45           ` Jean Louis
  2020-10-11 19:47           ` Drew Adams
@ 2020-10-11 20:54           ` Jean Louis
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-11 20:54 UTC (permalink / raw)
  To: Philip K.; +Cc: Adrien Brochard, rms, emacs-devel

* Philip K. <philipk@posteo.net> [2020-10-11 21:34]:
> Jean Louis <bugs@gnu.support> writes:
> 
> > * Teemu Likonen <tlikonen@iki.fi> [2020-10-10 11:35]:
> >> * 2020-10-09 19:12:23-04, Adrien Brochard wrote:
> >> 
> >> > Please find the list of questions I have gathered at the end of this
> >> > email.
> >> 
> >> Great! I would like to see this survey conducted. It would be
> >> interesting to see what people use Emacs for and some distribution of
> >> answers. It's not easy to find good sample of users but if the survey is
> >> published in some main communication platforms or communities it will be
> >> good enough, I think.
> >
> > If survey is published, for example on Reddit, such survey is narrow
> > and specific to Reddit users, and would represent only that
> > communication channel.
> >
> > My proposal on how to publish a survey is to include that in the Help
> > menu, and let people do it straight from Emacs. That is similar to bug
> > reporting, but it is not a bug, it is feature request.
> 
> But if you have to have mail configured, you're also only going to have
> a specific subset of all users.
> 
> I think the idea of having a survey that could be filled out from Emacs
> is interesting (although we would only get to hear from current users,
> not previous users). But it would have to work regardless of what the
> user has configured or not. From what I see, that would either mean a
> web form that can be filled out using EWW or a package that could be
> downloaded from ELPA.

If the eww's eww-submit function get dissected, maybe there will be
simplest POST function, then library forms.el can be used to POST the
information to GNU servers, which in turn arrives by email
easily. Even the CGI script can be written in Emacs Lisp to accept the
email and send into the queue for approval before publishing it to
mailing list.

That would not need to load full eww, it can display users few fields,
if one wish to enter some personal information or not, it would be
equal.

Form would send it to server.

Server side Emacs CGI would send email to queue mailman or some
mailing list manager for approval or censorship :-)

Emails would be sent from form-submission@gnu.org to mailing list with
Reply-To: email address of user who submitted the form. But what if
email address is not working?!

Other users or developers could collaborate or answer questions.

See: share/emacs/28.0.50/etc/forms



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-11 20:33             ` Jean Louis
@ 2020-10-11 23:24               ` Drew Adams
  2020-10-12  4:10                 ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-11 23:24 UTC (permalink / raw)
  To: Jean Louis; +Cc: Philip K., Adrien Brochard, rms, emacs-devel

> > > But if you have to have mail configured, you're also only going to have
> > > a specific subset of all users.
> >
> > Nothing _limits_ input to email.  That's all we handle today, and we
> > should at least continue to handle such input.  But if we want to
> > entertain supporting other input methods (smoke signals...
> > whatever), that's not impossible.
> 
> Is hard for me to understand the above.

It's hard for me to understand what you write, below.

My point there was only that nothing limits acceptance
of user input only in the form of email.  That's all.

To be clear, I'm in favor of continuing to accept
input by email.  I'm strongly in favor of that.
And in particular by `report-emacs-bug'.

I was just saying that nothing prevents accepting
feedback in other ways.  Of course, some ways would
no doubt require some support development.  (Something
like snail mail would not.)

> Let me say that trends changed, there are now more people using
> Internet, and there are more people using Internet without email or
> not knowing what email does, or having email, but never using it and
> not knowing what it does, including people having email and using it
> exclusively on their mobile devices, not knowing they can use it from
> computers.
> 
> Suspicious is also Windows and other systems but Unix-like systems,
> I did not try, I just don't know how would report-emacs-bug function
> on Windows, I doubt it is well integrated.
> 
> I would just make it as a form, either as Emacs forms from forms.el
> library, plus some POST to URL, or as HTML form by using eww.
> 
> In such form, user could enter email, but if user does not have email,
> need not enter such, neither the name. User could still communicate,
> it would be one way, but better some opinions then none, hey.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 17:59                 ` Philip K.
@ 2020-10-12  2:03                   ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-12  2:03 UTC (permalink / raw)
  To: Philip K.; +Cc: abrochard, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > The issue I see here is that if you expert plain-text responses, someone
  > might just submit something that breaks the format, or even submit an
  > email written in HTML.

This is not a major problem.  The only thing that breaks the format of
an inbox file is "From " in column 0, and the worst thing that does is
generate a junk message.

The program that generates the message can easily prevent this from
happening.

  > You
  > wouldn't want someone who could submit 1000 fake or troll responses,
  > just because they know what what's going on behind the scenes.

It's not likely that people will do this, and if they do,
it would not be hard to delete those fake messages from the file.

  > All in all, I don't this that this should be an issue, SQLite is well
  > documented,

Even if it is very good documentation, reading it and learning will
take work.  I don't want to have to read it, or learn how to do
something with SQLite.  It would be an extra unnecessary layer to
cause confusion or problems, and there is no need for that complexity.

                and can easily be extracted into whatever format someone
  > might need or want, just easier than with a mailbox or other classical
  > unix-like approaches.

It is not as easy for people who don't know or use database systems as
it is for you.

If some people find it helpful to analyze the data through a database
system, I have nothing against their doing so.  It won't be hard to
have a program parse the inbox file and enter the data.  The script
can detect when a message was split, and disregard it.

Or people can fix the broken messages with Emacs, either by hand
with a Lisp program.

It is also possible to handle each user's input in two ways
when it is entered: put it into a database _and_ email it.
That way, everyone's preferences are satisfied.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 21:44     ` Dmitry Gutov
@ 2020-10-12  2:04       ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-12  2:04 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: kfogel, abrochard, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > We had a long discussion on this list, in April and/or May I think,
  > > about how to do polling about a simple change in features.  What we
  > > need is to invite people to explain their preferences or wishes.

  > Are you going to do that survey, the one discussed several months ago?

That was an inquiry about using tabs for indentation.

I have been too busy but I will try to get it moving.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  7:35       ` Vasilij Schneidermann
  2020-10-11 12:08         ` Jean Louis
@ 2020-10-12  2:04         ` Richard Stallman
  2020-10-12  2:04         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-12  2:04 UTC (permalink / raw)
  To: Vasilij Schneidermann; +Cc: abrochard, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Not mentioning MELPA as an option because you feel uncomfortable about
  > it will distort survey results, especially for the part where you ask
  > what package archives people use.

That is ok.  This is not a research project.  The reason we are
interested in a survey's results is to make practical decisions about
policies that we could possibly change.

We do not mention places to get software if they lead people to
nonfree software.  See the GNU Coding Standards, node References.  Our
stance about MELPA is determined directly by this principle.  Unless
MELPA's policies change, our stance about it cannot change.  We can
do no other.

  >   Remember, this is a
  > survey to find out how Emacs users use their editor, not about how much
  > they adhere to FSF ideology.

Nobody would disagree with that point, but that abstract question is
not where the disagreement is.

We need to inform people that there is a grave moral flaw in MELPA,
and we can't do that if we ask questions about it just the same as
we do about other repositories.

What we might do is ask

  Which of these exclusively libre Lisp package archives do you use

with a list of those, then

  Do you use any Lisp package archives not in that list?

and people could answer MELPA if they wish.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  7:35       ` Vasilij Schneidermann
  2020-10-11 12:08         ` Jean Louis
  2020-10-12  2:04         ` Richard Stallman
@ 2020-10-12  2:04         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-12  2:04 UTC (permalink / raw)
  To: Vasilij Schneidermann; +Cc: abrochard, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  ...
  > >   > What is free software (libre software)?
  > > 
  > >   > Which of these are free liceenses?
  > > 
  > >   > How does GNU relate to free software?

  > See my last sentence above.  What's the point of this quiz?  Finding out
  > what percentage of Emacs users fully believes in GNU's goals?  What will
  > that information be used for?

We can use it to try to improve our efforts to communicate those
crucial points about our overall goals and what we have achieved.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 12:50           ` Vasilij Schneidermann
  2020-10-11 17:15             ` Jean Louis
@ 2020-10-12  2:04             ` Richard Stallman
  2020-10-12  3:32               ` Thibaut Verron
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-12  2:04 UTC (permalink / raw)
  To: Vasilij Schneidermann; +Cc: abrochard, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Even if it contained non-free software, this is beside the point.  What
  > use is a survey if it doesn't strive to accurately capture the status
  > quo and instead basks in ideological purity?

That's not a fair description of what we are doing, so it is a misled
criticism.  You can't convince me that what I am doing is mistaken by
describing it wrong.  And please don't be so harsh in tone.

Please review the Kind Communications Guidelines,
https://gnu.org/philosophy/kind-communication.html,
and try to express your point in a way that is less harsh.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  2:04             ` Richard Stallman
@ 2020-10-12  3:32               ` Thibaut Verron
  2020-10-12  5:04                 ` Jean Louis
  2020-10-12  5:36                 ` Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-12  3:32 UTC (permalink / raw)
  To: Richard Stallman
  Cc: emacs-devel, Adrien Brochard, bugs, Vasilij Schneidermann

[-- Attachment #1: Type: text/plain, Size: 991 bytes --]

>
>   > Even if it contained non-free software, this is beside the point.  What
>   > use is a survey if it doesn't strive to accurately capture the status
>   > quo and instead basks in ideological purity?
>
> That's not a fair description of what we are doing, so it is a misled
> criticism.


Just as a reminder, here is what the email starter suggested:

> a survey for Emacs users to better grasp the diversity and various usages
out there

There is nothing about taking practical decisions or encouraging free
software (or anything) there.

And I would be worried about selection bias in a survey which voluntarily
omits the most popular options from the lists of choices: how many people
would choose not to complete the survey of they feel that the questions are
biased?

Would it be acceptable to put all major package repos in the list, with a
warning saying that melpa is not a free software repository? The same
warning could be used when mentioning windows, non-free IDEs, etc.

[-- Attachment #2: Type: text/html, Size: 1501 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 23:24               ` Drew Adams
@ 2020-10-12  4:10                 ` Jean Louis
  2020-10-12 17:35                   ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-12  4:10 UTC (permalink / raw)
  To: Drew Adams; +Cc: Philip K., Adrien Brochard, rms, emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-12 02:25]:
> > > > But if you have to have mail configured, you're also only going to have
> > > > a specific subset of all users.
> > >
> > > Nothing _limits_ input to email.  That's all we handle today, and we
> > > should at least continue to handle such input.  But if we want to
> > > entertain supporting other input methods (smoke signals...
> > > whatever), that's not impossible.
> > 
> > Is hard for me to understand the above.
> 
> It's hard for me to understand what you write, below.
> 
> My point there was only that nothing limits acceptance
> of user input only in the form of email.  That's all.
> 
> To be clear, I'm in favor of continuing to accept
> input by email.  I'm strongly in favor of that.
> And in particular by `report-emacs-bug'.

Yes, I have confirmed that.

Additionally for users who did not set up email system, I said that
form can be used to submit information, which in turn is again
converted to email. A form submission can be anonymous, or with email
address again, but email system need not be set.

I am not using Windows, but there I think on Windows mostly. I doubt
GNU/Linux systems all have set up email transport, but they would
rather have WWW access. Is it now clearer?




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  3:32               ` Thibaut Verron
@ 2020-10-12  5:04                 ` Jean Louis
  2020-10-12  5:33                   ` Thibaut Verron
  2020-10-12  5:36                 ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-12  5:04 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-12 06:33]:
> >
> >   > Even if it contained non-free software, this is beside the point.  What
> >   > use is a survey if it doesn't strive to accurately capture the status
> >   > quo and instead basks in ideological purity?
> >
> > That's not a fair description of what we are doing, so it is a misled
> > criticism.
> 
> 
> Just as a reminder, here is what the email starter suggested:
> 
> > a survey for Emacs users to better grasp the diversity and various usages
> out there
> 
> There is nothing about taking practical decisions or encouraging free
> software (or anything) there.

Every opinion poll survey has a purpose, normally the purpose is to
find out what majority wish and want to improve the product or service
and thus reach or gain more customers, strike it, users.

- Encouraging free software is within the context of GNU Emacs subject.

- Encouraging or supporting usage of non-free software is not within
  the context.

Thus the survey or opinion polls cannot be evaluated in the manner to
encourage usage of proprietary software, it is vice versa. Those
opinions vouching for proprietary software would or should be
enlightened of the benefits and safety of free software.

A survey from the context of GNU Emacs development naturally should
involve questions related to free software as the purpose of Emacs was
historically to distribute free software,
https://www.gnu.org/gnu/thegnuproject.html

> Would it be acceptable to put all major package repos in the list,
> with a warning saying that melpa is not a free software repository?

Are there many package repositories? I know of three, there will be
fourth soon elpa.nongnu.org or similar.

They do provide free software naturally as packages should be GPL so
far I understand (not sure), but if they wrap non free software or
have pointers to non free software, such recommendation would be
contrary to principles why GNU Emacs have been made as free software.

> The same warning could be used when mentioning windows, non-free
> IDEs, etc.

Warning you mention is used on Emacs download page, see
https://www.gnu.org/software/emacs/download.html




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  5:04                 ` Jean Louis
@ 2020-10-12  5:33                   ` Thibaut Verron
  2020-10-12  6:29                     ` Jean Louis
                                       ` (3 more replies)
  0 siblings, 4 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-12  5:33 UTC (permalink / raw)
  To: Jean Louis; +Cc: Richard Stallman, emacs-devel

> > Just as a reminder, here is what the email starter suggested:
> >
> > > a survey for Emacs users to better grasp the diversity and various usages
> > out there
> >
> > There is nothing about taking practical decisions or encouraging free
> > software (or anything) there.
>
> Every opinion poll survey has a purpose, normally the purpose is to
> find out what majority wish and want to improve the product or service
> and thus reach or gain more customers, strike it, users.

Yes it has a purpose, I quoted it above. To understand "the diversity
and various usages out there". Specifically excluding some popular
usages defeats that purpose.

If anything, wouldn't we want to get an idea how many Emacs users
currently use a non-free package repository?

On the other hand, there are no questions in the suggested list about
what people want.

> > Would it be acceptable to put all major package repos in the list,
> > with a warning saying that melpa is not a free software repository?
>
> Are there many package repositories? I know of three, there will be
> fourth soon elpa.nongnu.org or similar.

Yes, that sounds about right.

> They do provide free software naturally as packages should be GPL so
> far I understand (not sure), but if they wrap non free software or
> have pointers to non free software, such recommendation would be
> contrary to principles why GNU Emacs have been made as free software.

I don't understand why a question in a survey would be seen as a recommendation.

That's similar, in a sense, to those social surveys asking people if
they have done drugs. I don't think those want to encourage people to
take drugs.

> > The same warning could be used when mentioning windows, non-free
> > IDEs, etc.
>
> Warning you mention is used on Emacs download page, see
> https://www.gnu.org/software/emacs/download.html

Great, so there is precedent ! Why is it acceptable and sufficient on
the main download page but not acceptable in a survey?

Those words are a bit too harsh when applied to Melpa, I hope that we
agree on that. And nobody likes to read propaganda (no matter how
justified) in a survey, so having such a long tirade could again lead
to selection bias.

But, for example, wouldn't something like below be both short and
explicit enough?

"- Melpa (Note: Emacs and the GNU project DO NOT ENDORSE package
repositories which encourage non-free software, see
https://www.gnu.org/philosophy/)"



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  3:32               ` Thibaut Verron
  2020-10-12  5:04                 ` Jean Louis
@ 2020-10-12  5:36                 ` Jean Louis
  2020-10-12  5:52                   ` Thibaut Verron
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-12  5:36 UTC (permalink / raw)
  To: Thibaut Verron
  Cc: emacs-devel, Adrien Brochard, Richard Stallman,
	Vasilij Schneidermann

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-12 06:33]:
> And I would be worried about selection bias in a survey which voluntarily
> omits the most popular options from the lists of choices: how many people
> would choose not to complete the survey of they feel that the questions are
> biased?

That is easy to solve:

- [ ] Check here if you do not wish to complete this survey

- [ ] Check here if you do not want to tell us anything about you

etc.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  5:36                 ` Jean Louis
@ 2020-10-12  5:52                   ` Thibaut Verron
  0 siblings, 0 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-12  5:52 UTC (permalink / raw)
  To: Jean Louis
  Cc: emacs-devel, Adrien Brochard, Richard Stallman,
	Vasilij Schneidermann

Le lun. 12 oct. 2020 à 07:37, Jean Louis <bugs@gnu.support> a écrit :
>
> * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-12 06:33]:
> > And I would be worried about selection bias in a survey which voluntarily
> > omits the most popular options from the lists of choices: how many people
> > would choose not to complete the survey of they feel that the questions are
> > biased?
>
> That is easy to solve:
>
> - [ ] Check here if you do not wish to complete this survey
>
> - [ ] Check here if you do not want to tell us anything about you
>
> etc.

Can't tell if you're serious. But just in case, no, they would just
close the page/buffer/whatever and not send the results.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  5:33                   ` Thibaut Verron
@ 2020-10-12  6:29                     ` Jean Louis
  2020-10-12  6:58                       ` Thibaut Verron
  2020-10-12  7:54                       ` Ihor Radchenko
  2020-10-13  3:53                     ` Richard Stallman
                                       ` (2 subsequent siblings)
  3 siblings, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-12  6:29 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-12 08:34]:
> > > Just as a reminder, here is what the email starter suggested:
> > >
> > > > a survey for Emacs users to better grasp the diversity and various usages
> > > out there
> > >
> > > There is nothing about taking practical decisions or encouraging free
> > > software (or anything) there.
> >
> > Every opinion poll survey has a purpose, normally the purpose is to
> > find out what majority wish and want to improve the product or service
> > and thus reach or gain more customers, strike it, users.
> 
> Yes it has a purpose, I quoted it above. To understand "the diversity
> and various usages out there". Specifically excluding some popular
> usages defeats that purpose.

Tell me examples of popular usage that you refer to?

Free form gives enough possibility for any user to explain anything
they wish.

> If anything, wouldn't we want to get an idea how many Emacs users
> currently use a non-free package repository?

I am not sure if there is any non-free package repository for
Emacs.

MELPA is fetching most packages from the Microsoft Github, and Github
dictates free licenses for any public repository, most of them are
free software. For me is hard to find particular example that uses non
free software. 

That will be work to do, to move some public packages to non-GNU ELPA.

MELPA recipes can be cloned, copy of software can be placed on
nongnu.org automatically, later revised from TODO to be TO PUBLISH,
and distributed ethically. 

> > They do provide free software naturally as packages should be GPL so
> > far I understand (not sure), but if they wrap non free software or
> > have pointers to non free software, such recommendation would be
> > contrary to principles why GNU Emacs have been made as free software.
> 
> I don't understand why a question in a survey would be seen as a
> recommendation.

Above paragraph refers to MELPA, that could wrap non free software in
the free software packages. I can then imagine links in packages pointing
to non free software, that is what was meant with recommendation. It
does not refer to questions in the opinion poll.

> That's similar, in a sense, to those social surveys asking people if
> they have done drugs. I don't think those want to encourage people to
> take drugs.
> 
> > > The same warning could be used when mentioning windows, non-free
> > > IDEs, etc.
> >
> > Warning you mention is used on Emacs download page, see
> > https://www.gnu.org/software/emacs/download.html
> 
> Great, so there is precedent ! Why is it acceptable and sufficient on
> the main download page but not acceptable in a survey?

It is not a new precedent, it was from the creation of Emacs to talk
about free software, and advise people. In my opinion GNU project
should increase the marketing of free software philosophy by power of
10, it is not enough.

> Those words are a bit too harsh when applied to Melpa, I hope that
> we agree on that. And nobody likes to read propaganda (no matter how
> justified) in a survey, so having such a long tirade could again
> lead to selection bias.

GNU project with promotion of free software is not biased as that
would mean that it is influenced in an unfair way.

GNU project is influenced in a fair way and thus should be promoting
and supporting free software and helping users of proprietary software
to understand what is free software and freedom in computing.

The word propaganda you maybe used in a negative connotation, but the
word itself means promoting information to spread some cause. Who is
not interested, would not read it. The point of propaganda that some
will get interested, so propaganda gives results for those who are.

> But, for example, wouldn't something like below be both short and
> explicit enough?
> 
> "- Melpa (Note: Emacs and the GNU project DO NOT ENDORSE package
> repositories which encourage non-free software, see
> https://www.gnu.org/philosophy/)"

I do not think that it is necessary for survey from GNU Emacs to ask
if people are using Melpa or whatever other software
repository.

Reason for that is that it is obvious that people do, people ARE using
MELPA and Marmalade software repositories; AND more important reason
not to ask is that information about usage of those repositories,
likes, number of contributors, it is already available on the
Microsoft Github "Insights" link on the MELPA page. There is no point
in asking users what is already obvious. There are stars or likes on
Github.

If there is certain disagreement between GNU and MELPA, that is valid
reason as well. 

In my opinion, the team of MELPA is preparing the list of packages
well, then GNU team working on ELPA on nongnu.org can fork all the
software and curate and remove whatever is unsafe or not ethical and
make a new repository.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  6:29                     ` Jean Louis
@ 2020-10-12  6:58                       ` Thibaut Verron
  2020-10-12  8:16                         ` Jean Louis
  2020-10-12  7:54                       ` Ihor Radchenko
  1 sibling, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-12  6:58 UTC (permalink / raw)
  To: Jean Louis; +Cc: Richard Stallman, emacs-devel

> Tell me examples of popular usage that you refer to?

Downloading packages from Melpa every day. Or even using Doom or
Spacemacs (both activate the Melpa repository afaict, through Straight
in the case of Doom).

> Free form gives enough possibility for any user to explain anything
> they wish.

But do they wish to?

Imagine a poll for a presidential election, where John Doe and Richard
Miles are the frontrunners.

Now let's say that a pollster frames its question like this:

"Who do you intend to vote for?
- John Doe
- Other (please specify)"

What would you think of the data resulting from such a poll?

>
> > If anything, wouldn't we want to get an idea how many Emacs users
> > currently use a non-free package repository?
>
> I am not sure if there is any non-free package repository for
> Emacs.
>
> MELPA is fetching most packages from the Microsoft Github, and Github
> dictates free licenses for any public repository, most of them are
> free software. For me is hard to find particular example that uses non
> free software.

Okay...

> Above paragraph refers to MELPA, that could wrap non free software in
> the free software packages. I can then imagine links in packages pointing
> to non free software, that is what was meant with recommendation. It
> does not refer to questions in the opinion poll.

Okay.

> GNU project with promotion of free software is not biased as that
> would mean that it is influenced in an unfair way.

The GNU project is not biased. But the proposed amended survey would
be, similar to the hypothetical presidential poll above.

>
> GNU project is influenced in a fair way and thus should be promoting
> and supporting free software and helping users of proprietary software
> to understand what is free software and freedom in computing.
>
> The word propaganda you maybe used in a negative connotation, but the
> word itself means promoting information to spread some cause. Who is
> not interested, would not read it. The point of propaganda that some
> will get interested, so propaganda gives results for those who are.

Who is not interested might also leave the survey and skew the data.
Advertisement
campaigns disguised as surveys are legion.

> > But, for example, wouldn't something like below be both short and
> > explicit enough?
> >
> > "- Melpa (Note: Emacs and the GNU project DO NOT ENDORSE package
> > repositories which encourage non-free software, see
> > https://www.gnu.org/philosophy/)"
>
> I do not think that it is necessary for survey from GNU Emacs to ask
> if people are using Melpa or whatever other software
> repository.
>
> Reason for that is that it is obvious that people do, people ARE using
> MELPA and Marmalade software repositories;

Okay, that is a valid point (although I would be interested to
know if people still use Marmalade). But then we might as well drop
the repository question altogether.

> AND more important reason
> not to ask is that information about usage of those repositories,
> likes, number of contributors, it is already available on the
> Microsoft Github "Insights" link on the MELPA page. There is no point
> in asking users what is already obvious. There are stars or likes on
> Github.

This data might have its own selection bias.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  6:29                     ` Jean Louis
  2020-10-12  6:58                       ` Thibaut Verron
@ 2020-10-12  7:54                       ` Ihor Radchenko
  2020-10-12  8:34                         ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Ihor Radchenko @ 2020-10-12  7:54 UTC (permalink / raw)
  To: Jean Louis, Thibaut Verron; +Cc: Richard Stallman, emacs-devel

> Reason for that is that it is obvious that people do, people ARE using
> MELPA and Marmalade software repositories; AND more important reason
> not to ask is that information about usage of those repositories,
> likes, number of contributors, it is already available on the
> Microsoft Github "Insights" link on the MELPA page. There is no point
> in asking users what is already obvious. There are stars or likes on
> Github.

I disagree that there is no point asking. Assuming that we are
interested to know about MELPA/Marmalade usage, taking information about
usage/stars/contributors/etc from third-party sources will represent
different subset of Emacs users - it cannot be compared with other
results of the presently discussed poll.

All the MELPA/marmalade statistics is inherently biased. It only
represents Emacs users using those repositories. On the other hand,
asking about package repositories in this poll will provide us with a
concrete estimate how popular are MELPA and Mermalade. In future, when
nongnu ELPA is going to be up and running for a while, it may also be
interesting to see how the popularity changes.

Best,
Ihor

Jean Louis <bugs@gnu.support> writes:

> * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-12 08:34]:
>> > > Just as a reminder, here is what the email starter suggested:
>> > >
>> > > > a survey for Emacs users to better grasp the diversity and various usages
>> > > out there
>> > >
>> > > There is nothing about taking practical decisions or encouraging free
>> > > software (or anything) there.
>> >
>> > Every opinion poll survey has a purpose, normally the purpose is to
>> > find out what majority wish and want to improve the product or service
>> > and thus reach or gain more customers, strike it, users.
>> 
>> Yes it has a purpose, I quoted it above. To understand "the diversity
>> and various usages out there". Specifically excluding some popular
>> usages defeats that purpose.
>
> Tell me examples of popular usage that you refer to?
>
> Free form gives enough possibility for any user to explain anything
> they wish.
>
>> If anything, wouldn't we want to get an idea how many Emacs users
>> currently use a non-free package repository?
>
> I am not sure if there is any non-free package repository for
> Emacs.
>
> MELPA is fetching most packages from the Microsoft Github, and Github
> dictates free licenses for any public repository, most of them are
> free software. For me is hard to find particular example that uses non
> free software. 
>
> That will be work to do, to move some public packages to non-GNU ELPA.
>
> MELPA recipes can be cloned, copy of software can be placed on
> nongnu.org automatically, later revised from TODO to be TO PUBLISH,
> and distributed ethically. 
>
>> > They do provide free software naturally as packages should be GPL so
>> > far I understand (not sure), but if they wrap non free software or
>> > have pointers to non free software, such recommendation would be
>> > contrary to principles why GNU Emacs have been made as free software.
>> 
>> I don't understand why a question in a survey would be seen as a
>> recommendation.
>
> Above paragraph refers to MELPA, that could wrap non free software in
> the free software packages. I can then imagine links in packages pointing
> to non free software, that is what was meant with recommendation. It
> does not refer to questions in the opinion poll.
>
>> That's similar, in a sense, to those social surveys asking people if
>> they have done drugs. I don't think those want to encourage people to
>> take drugs.
>> 
>> > > The same warning could be used when mentioning windows, non-free
>> > > IDEs, etc.
>> >
>> > Warning you mention is used on Emacs download page, see
>> > https://www.gnu.org/software/emacs/download.html
>> 
>> Great, so there is precedent ! Why is it acceptable and sufficient on
>> the main download page but not acceptable in a survey?
>
> It is not a new precedent, it was from the creation of Emacs to talk
> about free software, and advise people. In my opinion GNU project
> should increase the marketing of free software philosophy by power of
> 10, it is not enough.
>
>> Those words are a bit too harsh when applied to Melpa, I hope that
>> we agree on that. And nobody likes to read propaganda (no matter how
>> justified) in a survey, so having such a long tirade could again
>> lead to selection bias.
>
> GNU project with promotion of free software is not biased as that
> would mean that it is influenced in an unfair way.
>
> GNU project is influenced in a fair way and thus should be promoting
> and supporting free software and helping users of proprietary software
> to understand what is free software and freedom in computing.
>
> The word propaganda you maybe used in a negative connotation, but the
> word itself means promoting information to spread some cause. Who is
> not interested, would not read it. The point of propaganda that some
> will get interested, so propaganda gives results for those who are.
>
>> But, for example, wouldn't something like below be both short and
>> explicit enough?
>> 
>> "- Melpa (Note: Emacs and the GNU project DO NOT ENDORSE package
>> repositories which encourage non-free software, see
>> https://www.gnu.org/philosophy/)"
>
> I do not think that it is necessary for survey from GNU Emacs to ask
> if people are using Melpa or whatever other software
> repository.
>
> Reason for that is that it is obvious that people do, people ARE using
> MELPA and Marmalade software repositories; AND more important reason
> not to ask is that information about usage of those repositories,
> likes, number of contributors, it is already available on the
> Microsoft Github "Insights" link on the MELPA page. There is no point
> in asking users what is already obvious. There are stars or likes on
> Github.
>
> If there is certain disagreement between GNU and MELPA, that is valid
> reason as well. 
>
> In my opinion, the team of MELPA is preparing the list of packages
> well, then GNU team working on ELPA on nongnu.org can fork all the
> software and curate and remove whatever is unsafe or not ethical and
> make a new repository.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  6:58                       ` Thibaut Verron
@ 2020-10-12  8:16                         ` Jean Louis
  2020-10-12  8:37                           ` Thibaut Verron
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-12  8:16 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-12 10:00]:
> > Tell me examples of popular usage that you refer to?
> 
> Downloading packages from Melpa every day. Or even using Doom or
> Spacemacs (both activate the Melpa repository afaict, through Straight
> in the case of Doom).

Aha.

As there is disagreement between GNU project and MELPA way of
providing software packages, and as it is obvious that many users do
use MELPA, there is no need to ask what is obvious, one has to
implement wider software package repository from GNU project itself.

Spacemacs is configuration, it is also considered software, so also
for this is obvious that 20,000+ Microsoft Github users have given
star/like on Github, as that is what I understand when I read 20.7k+
-- so it is obvious, that need not be asked, asking would be useless
compared to obvious statistical results. (Note, when I use the word
Microsoft in front of Github, it is used in the sense of warning.)

Unless Github statistics are fake, GNU Emacs developers can already
think why those 20,700+ users are using Spacemacs and think how to
improve Emacs in general. In my opinion there is no need to ask what
is obvious. There is need to act.

> > Free form gives enough possibility for any user to explain anything
> > they wish.
> 
> But do they wish to?

So far I read on this list, that was proposed by RMS and few others
acknowledged it, I also think that it should be free form and I and
Drew, we like it to be included permanently in the menu, something
like:

Help -> Tell us how to improve

Then from Tell us how to improve:

-> Report Emacs bug
-> Suggest improvements
-> Subscribe to Help GNU Emacs mailing list
-> Send email to Help GNU Emacs list
-> Unsubscribe from Help GNU Emacs mailing list

The menu item "Suggest improvements" could be similar to
report-emacs-bug just enlightening and inviting user to communicate
about enhancements.

There is no need in Emacs for those opinion poll surveys with set of
questions, it is questionable and unclear who would be doing such
survey, who would be paying for that, and who would be evaluating it.

What is successful action is to listen to users who write to
help-gnu-emacs, devel-emacs and developers also listen to users beyond
official GNU communication lines, so that what is successful is
working, and need not be changed.

Cheapest long term solution is to embed it in Emacs, that is anyway
inviting new users to collaborate. Then listening to users and
improving by understanding their needs.

> Imagine a poll for a presidential election, where John Doe and Richard
> Miles are the frontrunners.
> 
> Now let's say that a pollster frames its question like this:
> 
> "Who do you intend to vote for?
> - John Doe
> - Other (please specify)"
> 
> What would you think of the data resulting from such a poll?

I know what you mean, especially for the reason that I have been doing
surveys with people on the phone, in person face to face, on the
street, and by visiting people at their homes, I have got paid for
making surveys, and I know how to evaluate surveys, and how to write
them properly.

My answer to that proposal is same as Drew's, something like
implementation of the above menus in the Help.

> > GNU project with promotion of free software is not biased as that
> > would mean that it is influenced in an unfair way.
> 
> The GNU project is not biased. But the proposed amended survey would
> be, similar to the hypothetical presidential poll above.

So far I know, GNU project is not encompassing projects that are not
ethical.

For those questions that RMS proposed, I think they are also not
necessary to be made for the reason that every survey gives its
results or data that has to be evaluated, and it is obvious that many
users, millions probably, do not know what is Linux as kernel and what
is operating system.

In that sense, Emacs already has in its splash screen (About GNU Emacs):
Welcome to GNU Emacs, one component of the GNU/Linux operating system

Where the words "GNU/Linux" are hyperlinked to appropriate GNU page.

nd in my opinion, Emacs should contain more information and links to
free software, that should be *contained* in the Emacs distribution
and not just hyperlinked.

For example I think that GNU Manifesto should go back to GNU Emacs
where it was, it should be obtainable through Help system.

Additionally, I would include in the Help system, the option to turn
on "Free Software Menu".

Then the Free Software menu option would appear with various
submenues, delivering GNU free software philosophy straight from
Emacs, without using Internet.

My opinion is maybe in that sense more "pushy" then what RMS wants, I
think that free software philosophy has to be pushy 10 times more than
it is now, as the increase of proprietary software and troublesame
abuses of people on this planet increased as well.

> Okay, that is a valid point (although I would be interested to
> know if people still use Marmalade). But then we might as well drop
> the repository question altogether.

I would drop all the questions, and just have it embedded in Emacs
Help menu for people to complain, suggest improvements, etc. System
already exists, but "Report Emacs bug" does not incite suggesting
improvements.

I read now that Marmalade has been discontinued.

Proposal about making a survey is fine, why not? But where is the
person responsible, money, funds, methods, tactical plan how to
implement the survey, evaluator, and so on?!

All that is time and resources consuming process, while in same time
developers already know what is attracting people, what has to be done
to be improved, they are finally improving it every day.

> > AND more important reason not to ask is that information about
> > usage of those repositories, likes, number of contributors, it is
> > already available on the Microsoft Github "Insights" link on the
> > MELPA page. There is no point in asking users what is already
> > obvious. There are stars or likes on Github.
> 
> This data might have its own selection bias.

Of course. I would not trust the Microsoft Github data at all, and it
does not show logically to be true, here is short analysis:

- we assume here that Spacemacs has 20700 stars/likes on Microsoft
  Github, because it says so on the page. Does that mean those are
  "users" of Spacemacs? Hard to believe, see below why.

- if I open the main Spacemacs Github page, I can see that last
  improvement on Spacemacs was 29th February 2020, there is not much
  going on. But Spacemacs is appearing as first on Github for the
  search word "emacs".

- I can see number of contributors, number is 562 contributors, there
  are so many contributors but the last update was 29th February 2020,
  maybe I am mistaken. So many contributors are counted as such if
  they report a bug, they do not write software necessarily. I can see
  very unrelated or mixture of bugs reported:
  https://github.com/syl20bnr/spacemacs/issues?q=is%3Aissue+is%3Aclosed

- in my opinion, there is maybe 1000 - max 2000 real users of
  Spacemacs, not more than that. I am assumin that maybe each among 4
  will make "issue" and thus become contributor, about 562 x 4 people
  is my imaginative assumption of number of users who ever tried
  Spacemacs, and I am sure that bunch of them stopped using it as
  well. 

It is untrue that 20700 stars mean there are so many users, people
click how they want and wish. Spacemacs is definitely not for
beginners, it is distributed from Git, so user must have and know how
to git pull or clone it.

It could be as well possible that author have advertised Spacemacs
back in time. In general, it is doing good job to advertise Emacs.

Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  7:54                       ` Ihor Radchenko
@ 2020-10-12  8:34                         ` Jean Louis
  2020-10-12  8:54                           ` Ihor Radchenko
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-12  8:34 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: Richard Stallman, Thibaut Verron, emacs-devel

* Ihor Radchenko <yantar92@gmail.com> [2020-10-12 10:56]:
> > Reason for that is that it is obvious that people do, people ARE using
> > MELPA and Marmalade software repositories; AND more important reason
> > not to ask is that information about usage of those repositories,
> > likes, number of contributors, it is already available on the
> > Microsoft Github "Insights" link on the MELPA page. There is no point
> > in asking users what is already obvious. There are stars or likes on
> > Github.
> 
> I disagree that there is no point asking. Assuming that we are
> interested to know about MELPA/Marmalade usage, taking information about
> usage/stars/contributors/etc from third-party sources will represent
> different subset of Emacs users - it cannot be compared with other
> results of the presently discussed poll.
> 
> All the MELPA/marmalade statistics is inherently biased. It only
> represents Emacs users using those repositories. On the other hand,
> asking about package repositories in this poll will provide us with a
> concrete estimate how popular are MELPA and Mermalade. In future, when
> nongnu ELPA is going to be up and running for a while, it may also be
> interesting to see how the popularity changes.

When doing an opinion poll, it involves investment of money, time,
efforts, people, so the answers have to be evaluated with purpose to
do something.

Marmalade is anyway not working any more.

Let us say you wish to ask if users are using MELPA or what else?
There is nothing else to compare.

ELPA is already built-in, there is no other package repository. Now
you wish to find statistical information how many users use MELPA, but
why not simply ask MELPA developers to provide such statistic? They
probably have statistics of downloads or accesses to the
website. There is no point to asking around the corner, when one can
ask directly.

Let us say one wish to evaluate which packages are more popular, you
can take a list of package from MELPA, then run Emacs Lisp through the
list, and then probably use Github API or web scraper, you can find
which package has more stars/likes or number of forks. Similar results
you can get from Github search. None of results, neither survey
results nor Github API/search results are correct results, so it would
be expensive making survey in that way.

So, for number of MELPA downloads, anybody wishing to find out, one
can ask there. Another question how they are evaluating the website
statistics. But for which practical use?!

For popularity of various packages, it is possible to use API (I just
guess so) or web scraper, and obtain statistical information. But for
which practical use?!

Most practical is when user reports a bug, then it can be solved, or
user reports enhancement to software, it could be implemented.

This mailing list is a small survey itself, help-gnu-emacs mailing
list as well, various answers on non-GNU websites also represent
valuable data for improvements, at this moment there is so much data
that demands improvements.

Jean





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  8:16                         ` Jean Louis
@ 2020-10-12  8:37                           ` Thibaut Verron
  2020-10-12 14:09                             ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-12  8:37 UTC (permalink / raw)
  To: Jean Louis; +Cc: Richard Stallman, emacs-devel

> Spacemacs is configuration, it is also considered software, so also
> for this is obvious that 20,000+ Microsoft Github users have given
> star/like on Github, as that is what I understand when I read 20.7k+
> -- so it is obvious, that need not be asked, asking would be useless
> compared to obvious statistical results. (Note, when I use the word
> Microsoft in front of Github, it is used in the sense of warning.)

I would think that those 20k are a gross underestimate, more on that
below. (And I understood that.)

> Unless Github statistics are fake, GNU Emacs developers can already
> think why those 20,700+ users are using Spacemacs and think how to
> improve Emacs in general. In my opinion there is no need to ask what
> is obvious. There is need to act.

The actual number is not obvious, beyond "at least 20k".


> I know what you mean, especially for the reason that I have been doing
> surveys with people on the phone, in person face to face, on the
> street, and by visiting people at their homes, I have got paid for
> making surveys, and I know how to evaluate surveys, and how to write
> them properly.
>
> My answer to that proposal is same as Drew's, something like
> implementation of the above menus in the Help.

So only free form, no multiple choice, and permanently in Emacs?
That's fine for me.

The goal is then sensibly different from that of the suggested survey,
and as you say, they are not mutually exclusive.

> My opinion is maybe in that sense more "pushy" then what RMS wants, I
> think that free software philosophy has to be pushy 10 times more than
> it is now, as the increase of proprietary software and troublesame
> abuses of people on this planet increased as well.
>
> > Okay, that is a valid point (although I would be interested to
> > know if people still use Marmalade). But then we might as well drop
> > the repository question altogether.
>
> I would drop all the questions, and just have it embedded in Emacs
> Help menu for people to complain, suggest improvements, etc. System
> already exists, but "Report Emacs bug" does not incite suggesting
> improvements.

Questions are useful to avoid writer paralysis though.
There could be three systems: "answer survey" (with a few free-form
questions to give inspiration), "send suggestion", "report bug".

>
> Of course. I would not trust the Microsoft Github data at all, and it
> does not show logically to be true, here is short analysis:
>
> - we assume here that Spacemacs has 20700 stars/likes on Microsoft
>   Github, because it says so on the page. Does that mean those are
>   "users" of Spacemacs? Hard to believe, see below why.
>
> - if I open the main Spacemacs Github page, I can see that last
>   improvement on Spacemacs was 29th February 2020, there is not much
>   going on. But Spacemacs is appearing as first on Github for the
>   search word "emacs".

Second is the emacs-mirror (and the first result for a google search
"github emacs" for me).

I don't know how github sorts its results, it is not just stars.

> - I can see number of contributors, number is 562 contributors, there
>   are so many contributors but the last update was 29th February 2020,
>   maybe I am mistaken. So many contributors are counted as such if
>   they report a bug, they do not write software necessarily. I can see
>   very unrelated or mixture of bugs reported:
>   https://github.com/syl20bnr/spacemacs/issues?q=is%3Aissue+is%3Aclosed

Some branches are more recent, see for example buffertabs, last
updated 2 weeks ago and 4k commits ahead of master.

Apparently Github defines contributor as "has published to master"
(possibly via a fork and pull-request?).

The list of contributors is not visible beyond the top 100, but those
100 all have at least one commit on master.

> It is untrue that 20700 stars mean there are so many users, people
> click how they want and wish. Spacemacs is definitely not for
> beginners, it is distributed from Git, so user must have and know how
> to git pull or clone it.

Are you sure about that? The website spacemacs.org has a big
"download" button which serves a zipped copy of master.
Does running spacemacs require knowledge from git after that point?

Regardless, it is possible to run spacemacs without ever visiting the
github page of the project, and github stars cannot track those.
So even though some of those 20k stars are probably not users, or are
no longer users, I still believe that the actual number of users may
be way more than 20k.

A properly conducted survey seems like a good way to get a better
estimate of the actual number.
But I agree that it is not a trivial task.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  8:34                         ` Jean Louis
@ 2020-10-12  8:54                           ` Ihor Radchenko
  2020-10-12 16:36                             ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Ihor Radchenko @ 2020-10-12  8:54 UTC (permalink / raw)
  To: Jean Louis; +Cc: Richard Stallman, Thibaut Verron, emacs-devel

> Let us say you wish to ask if users are using MELPA or what else?
> There is nothing else to compare.

At least we can get ratio between people using MELPA vs. not using
MELPA. As I stated, it might be useful later, when we have nongnu ELPA.
Or it might, for example, reveal that most of Emacs users are actually
not using MELPA (though I don't believe that it is the case).

Note that I am not arguing that we have to include this question in this
specific poll (there will be many other valuable inputs regardless of
this question). Just wanted to point out that MELPA statistics will not
answer the question what fraction of users are _not_ using MELPA. If
that fraction is significant (unlikely), taking only MELPA statistics
might be not representative.

Best,
Ihor


Jean Louis <bugs@gnu.support> writes:

> * Ihor Radchenko <yantar92@gmail.com> [2020-10-12 10:56]:
>> > Reason for that is that it is obvious that people do, people ARE using
>> > MELPA and Marmalade software repositories; AND more important reason
>> > not to ask is that information about usage of those repositories,
>> > likes, number of contributors, it is already available on the
>> > Microsoft Github "Insights" link on the MELPA page. There is no point
>> > in asking users what is already obvious. There are stars or likes on
>> > Github.
>> 
>> I disagree that there is no point asking. Assuming that we are
>> interested to know about MELPA/Marmalade usage, taking information about
>> usage/stars/contributors/etc from third-party sources will represent
>> different subset of Emacs users - it cannot be compared with other
>> results of the presently discussed poll.
>> 
>> All the MELPA/marmalade statistics is inherently biased. It only
>> represents Emacs users using those repositories. On the other hand,
>> asking about package repositories in this poll will provide us with a
>> concrete estimate how popular are MELPA and Mermalade. In future, when
>> nongnu ELPA is going to be up and running for a while, it may also be
>> interesting to see how the popularity changes.
>
> When doing an opinion poll, it involves investment of money, time,
> efforts, people, so the answers have to be evaluated with purpose to
> do something.
>
> Marmalade is anyway not working any more.
>
> Let us say you wish to ask if users are using MELPA or what else?
> There is nothing else to compare.
>
> ELPA is already built-in, there is no other package repository. Now
> you wish to find statistical information how many users use MELPA, but
> why not simply ask MELPA developers to provide such statistic? They
> probably have statistics of downloads or accesses to the
> website. There is no point to asking around the corner, when one can
> ask directly.
>
> Let us say one wish to evaluate which packages are more popular, you
> can take a list of package from MELPA, then run Emacs Lisp through the
> list, and then probably use Github API or web scraper, you can find
> which package has more stars/likes or number of forks. Similar results
> you can get from Github search. None of results, neither survey
> results nor Github API/search results are correct results, so it would
> be expensive making survey in that way.
>
> So, for number of MELPA downloads, anybody wishing to find out, one
> can ask there. Another question how they are evaluating the website
> statistics. But for which practical use?!
>
> For popularity of various packages, it is possible to use API (I just
> guess so) or web scraper, and obtain statistical information. But for
> which practical use?!
>
> Most practical is when user reports a bug, then it can be solved, or
> user reports enhancement to software, it could be implemented.
>
> This mailing list is a small survey itself, help-gnu-emacs mailing
> list as well, various answers on non-GNU websites also represent
> valuable data for improvements, at this moment there is so much data
> that demands improvements.
>
> Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  8:37                           ` Thibaut Verron
@ 2020-10-12 14:09                             ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-12 14:09 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-12 11:38]:
> So only free form, no multiple choice, and permanently in Emacs?
> That's fine for me.
> 
> The goal is then sensibly different from that of the suggested survey,
> and as you say, they are not mutually exclusive.

Yes, like that.

Emacs has its website, various simple qeustion based opinion polls can
easily published on the website, that was done since inception of
websites.

> > My opinion is maybe in that sense more "pushy" then what RMS wants, I
> > think that free software philosophy has to be pushy 10 times more than
> > it is now, as the increase of proprietary software and troublesame
> > abuses of people on this planet increased as well.
> >
> > > Okay, that is a valid point (although I would be interested to
> > > know if people still use Marmalade). But then we might as well drop
> > > the repository question altogether.
> >
> > I would drop all the questions, and just have it embedded in Emacs
> > Help menu for people to complain, suggest improvements, etc. System
> > already exists, but "Report Emacs bug" does not incite suggesting
> > improvements.
> 
> Questions are useful to avoid writer paralysis though.
> There could be three systems: "answer survey" (with a few free-form
> questions to give inspiration), "send suggestion", "report bug".

That is right, that is how users should be motivated to communicate.

> > Of course. I would not trust the Microsoft Github data at all, and it
> > does not show logically to be true, here is short analysis:
> >
> > - we assume here that Spacemacs has 20700 stars/likes on Microsoft
> >   Github, because it says so on the page. Does that mean those are
> >   "users" of Spacemacs? Hard to believe, see below why.
> >
> > - if I open the main Spacemacs Github page, I can see that last
> >   improvement on Spacemacs was 29th February 2020, there is not much
> >   going on. But Spacemacs is appearing as first on Github for the
> >   search word "emacs".
> 
> Second is the emacs-mirror (and the first result for a google search
> "github emacs" for me).

Emacs mirror on Github is second, but obviously there is no movement
there, it shows that statistics are doubtful.

> I don't know how github sorts its results, it is not just stars.

Because nobody knows, and especially because it is from Microsoft, I
would not touch it or believe it. But that is up to imaginary, as for
now, survey evaluators.

> > It is untrue that 20700 stars mean there are so many users, people
> > click how they want and wish. Spacemacs is definitely not for
> > beginners, it is distributed from Git, so user must have and know how
> > to git pull or clone it.
> 
> Are you sure about that? The website spacemacs.org has a big
> "download" button which serves a zipped copy of master.
> Does running spacemacs require knowledge from git after that point?

No info on that. But it is quite easy to ask Spacemacs for website
statistics, as survey for that reason is obviously not necessary. Then
how to know if statistics are real?

By asking various configuration packages for statistics, one can find
out some ratios, but why? One has to ask WHY each time. One WHY could
be to replicate or include or invite the configuration to GNU
project. If that is reason why, then why not ask. If there is nothing
special, it is just good to let people do what they wish.

Example of discussed Spacemacs is clear to me, the data is already
there, so the result of pathetic evaluation is that there are many Vim
users who like now to use Emacs because of Spacemacs, there are many
new keybindings, so if anybody wish to improve Emacs, one could see
which are major features of Spacemacs and could ask developers to
include their settings into main stream Emacs. Why not? Just go
ahead and ask.

GNU project already invited everybody to contribute with their
projects to be included in GNU.

You may ask RMS and Spacemacs developers, if they wish to include
Spacemacs as official part of GNU Emacs, that way GNU Emacs would
possibly gain popularity.

Spacemacs configuration could be optional for user to set, similar
like a theme. Why not. I know there are ways.

> Regardless, it is possible to run spacemacs without ever visiting the
> github page of the project, and github stars cannot track those.
> So even though some of those 20k stars are probably not users, or are
> no longer users, I still believe that the actual number of users may
> be way more than 20k.

Yes, but how do you know that? Like where is information available?

Finally, why is it important? It is clear that some people like Vim
configuration in Emacs, yet it does not mean to change whole
configuration to be like theirs.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10  8:09     ` Teemu Likonen
  2020-10-10 10:45       ` Rasmus
  2020-10-11 10:32       ` Jean Louis
@ 2020-10-12 14:32       ` Adrien Brochard
  2 siblings, 0 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-12 14:32 UTC (permalink / raw)
  To: Teemu Likonen, rms; +Cc: emacs-devel

Thank you!
I added wcheck-mode to the list.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 10:54     ` Thibaut Verron
  2020-10-10 13:50       ` Philip K.
  2020-10-11 11:58       ` Jean Louis
@ 2020-10-12 14:36       ` Adrien Brochard
  2 siblings, 0 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-12 14:36 UTC (permalink / raw)
  To: thibaut.verron; +Cc: Richard Stallman, emacs-devel

Thank you! I've added your suggestions to the survey.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 13:50       ` Philip K.
@ 2020-10-12 14:36         ` Adrien Brochard
  0 siblings, 0 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-12 14:36 UTC (permalink / raw)
  To: Philip K., Thibaut Verron; +Cc: Richard Stallman, emacs-devel

Thank you! Added!

On 10/10/20 9:50 AM, Philip K. wrote:
> Thibaut Verron <thibaut.verron@gmail.com> writes:
>
>>> ** Do you use mail client in Emacs?
>>>       - Mu4e
>>>       - Gnus
>>>       - Mut
>>>       - notmuch
>>>       - do not use
>>
>> Here too, "other" should be an option.
>
> The list is incomplete, but are there really that many mail clients that
> they couldn't be listed. Emacswiki[0] lists:
>
> - Rmail
> - Gnus
> - MH-E
> - Wanderlust
> - Mew
> - VM
> - Notmuch
> - mu4e
> - mutt
>
> and a few more unmaintained ones. I guess if other could stand for those?
>
> [0]  https://www.emacswiki.org/emacs/CategoryMail
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-10 13:17     ` Rasmus
@ 2020-10-12 14:41       ` Adrien Brochard
  0 siblings, 0 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-12 14:41 UTC (permalink / raw)
  To: Rasmus, emacs-devel

Thank you!
I've added your suggestions in. For the lists, you can thank the Reddit
community, they did all the hard work.

>> ** What is your Elisp proficiency?     - Beginner/No knowledge - Basic
>> elisp understanding -     Intermediate - Advanced - Expert
>
> I would find it very hard to decide here.  Could something like this be
> split into more easily quantifiable choices? Like do you know how to use
> ‘defmacro’?

** What is your Elisp proficiency?
     - No knowledge
     - I copy paste some code here and there, mostly for my configuration
     - I can write my own simple functions
     - I can write my own packages

What about these levels?


>> ** If there is another survey in 2021, would you be opposed to it
>> containing optional & general demographics questions?    It could
>> include age backets, gender, country or language
>
> Can’t you just put those in and make them optional?

Some people were vocal about their preference for the survey not to
include demographic questions, even optional, as it was inviting trouble.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11  5:23     ` Richard Stallman
  2020-10-11  7:35       ` Vasilij Schneidermann
@ 2020-10-12 15:16       ` Adrien Brochard
  2020-10-12 16:55         ` Jean Louis
                           ` (2 more replies)
  1 sibling, 3 replies; 838+ messages in thread
From: Adrien Brochard @ 2020-10-12 15:16 UTC (permalink / raw)
  To: rms, emacs-devel

Thank you for your feedback!

I've read many emails on this thread now and I think we've reached a
point where some action needs to be taken. I have purchased
emacssurvey.org and I will proceed to:
- digest all the feedback I got into a final list of questions
- announce the survey opening date on as many channels as I can
- build emacssurvey.org as a no-JS site such that everyone can visit it
- on the survey start date, emacssurvey.org will have two options for
submitting responses
   - visit the questionnaire as plain text and email it to a dedicated
address hosted on emacssurvey.org (which will be possible from Emacs)
   - use an online form which will potentially require non-free JS
- the survey will remain open for 6 weeks, plus some extra time for late
responders
- I will post on as many channels every week to remind people who
haven't responded yet (but obviously not share any partial results)
- after the survey is over and all data is compiled, all results will be
released on emacssurvey.org (and again it will be viewable from Emacs)

By hosting the survey on a different website, I am hoping to accomplish
something similar to the "Devil as Install Fest"
(https://www.gnu.org/philosophy/install-fest-devil.en.html).

What we could still discuss is a disclaimer on emacssurvey.org to be
explicit on how gnu.org is not sponsoring the survey questions. It would
be really helpful if gnu.org could link to emacssurvey.org, but if not,
that's ok too.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  8:54                           ` Ihor Radchenko
@ 2020-10-12 16:36                             ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-12 16:36 UTC (permalink / raw)
  To: Ihor Radchenko; +Cc: Richard Stallman, Thibaut Verron, emacs-devel

* Ihor Radchenko <yantar92@gmail.com> [2020-10-12 11:56]:
> > Let us say you wish to ask if users are using MELPA or what else?
> > There is nothing else to compare.
> 
> At least we can get ratio between people using MELPA vs. not using
> MELPA. As I stated, it might be useful later, when we have nongnu ELPA.
> Or it might, for example, reveal that most of Emacs users are actually
> not using MELPA (though I don't believe that it is the case).

Take in consideration that there are many organizations using
GNU/Linux distributions internally on many many computers, with many
many users. From time to time those users may need to use some
editors. But in general, they will not be excited for any talk we have
here, for any usage of Internet beyond their work or study. That group
of users consider would think it is immature to speak of
configurations, etc.

Debian is collecting some information of organizations using it:
https://www.debian.org/users/

Example:
https://www.debian.org/users/edu/ethz_phys

>  Swiss Federal Institute of Technology Zurich, Department of Physics, ETH Zurich, Switzerland

> We have about 160 workstations which are automatically installed
> with additional science/math/astronomical software. We also have
> about 10 servers. All machines run stable.

Now those 160 workstations with some nice software, maybe they are
used by students, I do not know, but those people whoever use them are
still users of a system, among them there will be those using GNU
Emacs, but they may not be excited for the talk we have here.

One would need to find out with them how many would be using Emacs,
and I doubt anybody would be using MELPA.

Hypothetically, university could have 160 workstations and 2000 users,
maybe some use Emacs, some not, among those who use maybe nobody use
MELPA, while for usage of ELPA, one could say "YES" because it is
embedded, but practically, maybe nobody used neither ELPA or
MELPA. And you would never find out about those 2000 users. In
addition, those 2000 users are growing each year, as there is new
number of students coming to university, those among them using Emacs
would become users of Emacs and would later probably not be using
Emacs, maybe after they finish university there are other things to
do. Yet such case would be very significant case of users of Emacs.

GNU/Linux systems are multi-user systems, one computer could have
large number of users, many would never be involved with any
development, or being proud of using Emacs, so what, it is just editor
for them or just computing environment, but they would not need to
communicate online about that.

Basically, the point of that survey is useless, as it will not reach
the true user base.

It will reach us, people who like polishing their cheap "cars", ricers
by definition, how they call computer users who polish their Window
Manager themes, icons, colors, and now Emacs. Ricers. Jargon file has
to be updated.

Rice

"Rice" is a word that is commonly used to refer to making visual
improvements and customizations on one's desktop. It was inherited
from the practice of customizing cheap Asian import cars to make them
appear to be faster than they actually were - which was also known as
"ricing". Here on /r/unixporn , the word is accepted by the majority
of the community and is used sparingly to refer to a visually
attractive desktop upgraded beyond the default.

From:
https://www.reddit.com/r/unixporn/wiki/themeing/dictionary#wiki_rice

I hope you get my point.

The survey would not be really directed to Emacs users, as the true
user base is hard to reach.

It would be directed to Emacs Ricers, people who like polishing their
Emacs.

> Note that I am not arguing that we have to include this question in this
> specific poll (there will be many other valuable inputs regardless of
> this question).

Those polls are best to be placed on Emacs website.

Or just make a package in Emacs that is similar to Debian's popularity
contest package, see statistics here:
https://popcon.debian.org/

and here is statistics for Emacs:
https://qa.debian.org/popcon.php?package=emacs

I see there about 50000 users, there could be hundreds of thousands of
users, as not everybody is using the package "popularity-contest" to
submit reports about their usage.

Vim is leading before Emacs:
https://qa.debian.org/popcon.php?package=vim

Now those statistics are indication, but not the real information, as
one has to know dynamics and definitions. Popularity contest does not
mean it is popular by use, but by number of installation.

To be popular by use is not same as to be popular by number of
installations.

One can see that on each statistics page that most popular package in
Debian is dpkg, but I really doubt that it is "most popular software
used by users" in Debian. libc6 is also most popular software, but who
knows about that? Do you see that statistics can be doubtful?

Which computer user is going around and telling how he is using libc6
on his computer, being proud, or liking to configure it for his
pleasure?! Yet the package is "popular" as number one.

Example how such popularity is blown up is that Debian package
'education-common' recommends 'vim' or other version of vim. Let us
say somebody wish to install some educational package in Debian, such
could pull 'education-common' which in turn could pull 'vim' as
recommended package, but user would not be really using 'vim', one
would be using what one wants (some other software).

Such popularity contest would counte number of installations of
packages, and so it does it automatically.

> Just wanted to point out that MELPA statistics will not answer the
> question what fraction of users are _not_ using MELPA. If that
> fraction is significant (unlikely), taking only MELPA statistics
> might be not representative.

Nothing can answer that question, as real number of Emacs users cannot
be obtained.

But hey, we can reach those who are online. Emacs Ricers.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12 15:16       ` Adrien Brochard
@ 2020-10-12 16:55         ` Jean Louis
  2020-10-12 17:15         ` Drew Adams
  2020-10-13  3:49         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-12 16:55 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: rms, emacs-devel

* Adrien Brochard <abrochard@gmx.com> [2020-10-12 18:17]:
> Thank you for your feedback!
> 
> I've read many emails on this thread now and I think we've reached a
> point where some action needs to be taken. I have purchased
> emacssurvey.org and I will proceed to:

Well that is what I said, you can do it independent of GNU project.

> - digest all the feedback I got into a final list of questions

I hope you will use "check all that apply" method, and not have "one
option" among the choice of lists.

> - announce the survey opening date on as many channels as I can
> - build emacssurvey.org as a no-JS site such that everyone can visit
> - it

That is right, not hard to do, I have done very complex forms, there
are many ways how to do complex forms, I was using CGI and Perl, but
simple HTML could be just enough.

Always add: "Other" field, which is enough wide and welcoming, to help
people write what they wish else.

When doing professional survey you could not change the parameters
during the survey period, so changing questions would not be good. I
suggest keeping versions, you may do more versions in future.

I hope you will align the purpose of the survey with Emacs
development, so that development may find out what is number one
feature needed and wanted in Emacs, to improve Emacs that way.

> - on the survey start date, emacssurvey.org will have two options for
> submitting responses
>   - visit the questionnaire as plain text and email it to a dedicated
> address hosted on emacssurvey.org (which will be possible from
> Emacs)

That is great.

>   - use an online form which will potentially require non-free JS

It does not require non-free JS or any Javascript. It requires plain
HTML, easy to do, it is even possible to make the Org file, and
process by Emacs Lisp that in turn makes the full survey online.

If your survey page is more complex, and the more complex you make it,
the less results you will get, but if it is multi-page form, then
there are nice Perl modules handling the job. Just see
https://cpan.org and search for forms.

But using any other programming language to generate the forms and
capture its information in the database other than Emacs Lisp, would
be disgrace for me, so just do it in Emacs Lisp, it will perform well.

> - the survey will remain open for 6 weeks, plus some extra time for late
> responders

For 6 weeks survey, you need to put up some money to capture the
users, and if you advertise, you should disclose on which
communication channels you advertised, and evaluation should involve
that advertising.

Your advertising would need to run for exact time of the survey, like
6 weeks, and then the survey results are specific only for that
specific communication channels you used.

Let us say you advertise on Reddit, you would get quite different
results then if you advertise on other network, attracting for example
Github users, or if you advertise so that you attract Debian users, or
scientists, students in universities and similar.

> - I will post on as many channels every week to remind people who
> haven't responded yet (but obviously not share any partial results)

If you do a survey for which you still do various advertising during
the survey time, that cannot be just survey, you would need to reach
users quickly to answer quickly their questions. You could advertise
on some networks using keywords like "emacs" and reach 1000 users
within 24 hours, rather then posting links online for 6 weeks, as in
that way you are changing the dynamic of the survey and also
influencing it consciously or not consciously.

How you have advertised it, and in what time, you would also need to
take in evaluation, along with your personal experience or skills.


Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-12 15:16       ` Adrien Brochard
  2020-10-12 16:55         ` Jean Louis
@ 2020-10-12 17:15         ` Drew Adams
  2020-10-13  3:49         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-12 17:15 UTC (permalink / raw)
  To: Adrien Brochard, rms, emacs-devel

> I've read many emails on this thread now and I think we've reached a
> point where some action needs to be taken.

Why do you think so?

> I have purchased emacssurvey.org and I will proceed to:...

FWIW, I'm not in favor of proceeding this way.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-12  4:10                 ` Jean Louis
@ 2020-10-12 17:35                   ` Drew Adams
  2020-10-12 18:33                     ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-12 17:35 UTC (permalink / raw)
  To: Jean Louis; +Cc: Philip K., Adrien Brochard, rms, emacs-devel

> Additionally for users who did not set up email system,

Most users have an email client, and they can use
that client for this.  But it is a valid point that
some users, who can use email, might nevertheless
not want to, or might prefer another way of sending
feedback.  We can accept feedback in more than one way.

> I said that
> form can be used to submit information, which in turn is again
> converted to email. A form submission can be anonymous, or with email
> address again, but email system need not be set.

Email system need not be set, to send email feedback.
Depending on what you might mean by "email system"
and "set".  It's enough to have a mail client.

> I am not using Windows, but there I think on Windows mostly. I doubt
> GNU/Linux systems all have set up email transport, but they would
> rather have WWW access. Is it now clearer?

I take the point that not everyone will have email
set up on the computer they use for Emacs.  OK.

And some users might prefer not to use email to
provide Emacs feedback.

Other ways to do that can be accepted/supported.
I have nothing specific to say about any such
other ways.
___

On another major question in this thread: I'm in
favor of emphasizing solicitation and consideration
of free-form feedback, over multiple-choice votes
(check-boxes, radio buttons).

And I'm in favor of asking that those submitting
suggestions to give their reasons, for better
understanding.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12 17:35                   ` Drew Adams
@ 2020-10-12 18:33                     ` Jean Louis
  2020-10-12 18:41                       ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-12 18:33 UTC (permalink / raw)
  To: Drew Adams; +Cc: emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-12 20:37]:
> > Additionally for users who did not set up email system,
> 
> Most users have an email client, and they can use that client for
> this.  But it is a valid point that some users, who can use email,
> might nevertheless not want to, or might prefer another way of
> sending feedback.  We can accept feedback in more than one way.

Just thinking of those Windows users and GNU/Linux and BSD users who
would not have the Emacs set for sending email, what if they just use
smartphones to send emails? There are different groups of users today,
is not same as before 20 years when email was so much popular. There
are users using almost exclusively chat systems, disregarding email.

I wonder if users on Windows or GNU/Linux who do use email on their
system would be properly served with the option 'mail-client'.

They would face 3 options, mail-client, transport, smtp, right?

I have just tried it on my Hyperbola GNU/Linux-libre where I have set
mutt as my mail client, so what happened is following:

- I have chosen 'mail client'

- epiphany browser opened, I do not know why exactly

- thereafter xterm opened, with mutt

- mutt asked me pre-defined emails as I specified it in the Emacs M-x
  mail, I guess it would be same as report-emacs-bug

- I found my double signature inside of the new email, and when I
  wanted to send email, my from email was changed to other email
  address

- instead of having Unix style line endings, I could see ^M when
  editing that new email from mutt, very ugly

Overall, on GNU/Linux I am not satisfied with mail-client option, it
can be my own bad configuration.

And I wonder how well would that work on side of other people using
various mail clients, and if at all it would work.

I could see following in the new email that was invoked through mail
client option, those annoying ^M

--Text follows this line--^M
^M
^M
-- ^M
Thanks,^M



Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-12 18:33                     ` Jean Louis
@ 2020-10-12 18:41                       ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-12 18:41 UTC (permalink / raw)
  To: Jean Louis; +Cc: emacs-devel

> Just thinking of those Windows users and GNU/Linux and BSD users who
> would not have the Emacs set for sending email, what if they just use
> smartphones to send emails? There are different groups of users today,
> is not same as before 20 years when email was so much popular. There
> are users using almost exclusively chat systems, disregarding email.
> 
> I wonder if users on Windows or GNU/Linux who do use email on their
> system would be properly served with the option 'mail-client'.

I can't speak to all that you say/ask.  I can say this:

I use Emacs on MS Windows, and I use MS Outlook as
my mail client.  And I have no problem using it with
`report-emacs-bug'.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 19:22                     ` Qiantan Hong
@ 2020-10-13  3:47                       ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-13  3:47 UTC (permalink / raw)
  To: Qiantan Hong; +Cc: abrochard, bugs, thibaut.verron, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Or maybe Emacs should have a web browser which can run (free) javascript.
  > > 
  > Emacs with —with-xwidget build already does.

Please do not do anything along those lines.
What we already did may have been a grave ethical mistake.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-11 18:45           ` Jean Louis
@ 2020-10-13  3:48             ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-13  3:48 UTC (permalink / raw)
  To: Jean Louis; +Cc: philipk, abrochard, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > To reach previous users, we may ask Vim and VSCode developers to
  > include the Emacs survey option.

It could be useful to ask those users a different survey.  However,
the Microsoft management would surely not cooperate; I am not going to
ask them.

We could reach plenty of former Emacs users in other ways.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* How to request changes in Emacs
  2020-10-11 18:25           ` Jean Louis
  2020-10-11 19:47             ` Drew Adams
@ 2020-10-13  3:48             ` Richard Stallman
  2020-10-13  4:59               ` Jean Louis
  2020-10-13 15:56               ` Drew Adams
  1 sibling, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-13  3:48 UTC (permalink / raw)
  To: Jean Louis; +Cc: abrochard, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Only that "report Emacs bug" does not sound as free form feedback of
  > any kind. I know it is, but it does not sound as enhancement
  > request. It takes time for person to realize that.

That is a good point.  Do people have concrete suggestions for
how to make it clearer how to request changes etc?


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12 15:16       ` Adrien Brochard
  2020-10-12 16:55         ` Jean Louis
  2020-10-12 17:15         ` Drew Adams
@ 2020-10-13  3:49         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-13  3:49 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > - digest all the feedback I got into a final list of questions

I am surprised and disappointed that you want to do this on your own,
without the participation of the GNU Project.

Nonetheless, would you please let me review and comment on your text
before you publish it?

  > - after the survey is over and all data is compiled, all results will be
  > released on emacssurvey.org (and again it will be viewable from Emacs)

Please make the results available in a simple textual format as a
single file, as well as any other formats you like.

     > - use an online form which will potentially require non-free JS

Please do not have any nonfree JS code for this site.
That would work directly against the free software movement.
Asking people to run nonfree software is an injustice.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  5:33                   ` Thibaut Verron
  2020-10-12  6:29                     ` Jean Louis
@ 2020-10-13  3:53                     ` Richard Stallman
  2020-10-13  5:25                       ` Jean Louis
  2020-10-13  3:53                     ` Richard Stallman
  2020-10-15  3:52                     ` Richard Stallman
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-13  3:53 UTC (permalink / raw)
  To: thibaut.verron; +Cc: bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I don't understand why a question in a survey would be seen as a
  > recommendation.

Simply mentioning MELPA encourages people to think we consider it
legitimate.  We do not!  And it defeats our goals if people think
that we do.

MELPA contains programs that depend on, that require installation of,
various nonfree programs.  Thus, it leads people to install those.
This encourages injustice -- the injustice of those nonfree programs.

Most Emacs users have probably never thought about this issue.  They
take for granted that nonfree programs are legitimate, they believe
everyone considers them legitimate, and they assume we do too.

It is important to educate these people that the GNU Project does not
agree with "everyone" on this.

Some Emacs users have though about this but were not convinced, and
then they probably dropped the question from their thoughts.  If we
treat MELPA as if it were as legitimate as the free archives, they
will be encouraged in considering it as legitimate as the free
archives.

Perhaps we should do something to show them what the issue is.
Perhaps with text like this:

======================================================================
GNU Emacs is part of the GNU operating system.  The GNU Project aims
to escape, then replace, all nonfree software with freedom-respecting
free software.

We maintain an Emacs package archive that consists of free packages
that can run in a free environment.  There is another Emacs package
archive called Melpa which distributes packages require the user to
install some nonfree programs.  That practice is harmful because it
encourages the installation of those nonfree programs, and that works
against our goal -- it prioritizes short-term convenience over
freedom.

Rather than prioritize short-term convenience over freedom, we
normally avoid mentioning that Malpa exists.

As a special exception, we mentioned it in a question in this survey,
to get data about its use.  That does not mean we have changed our
minds about our criticism of Melpa.
======================================================================

How about that?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  5:33                   ` Thibaut Verron
  2020-10-12  6:29                     ` Jean Louis
  2020-10-13  3:53                     ` Richard Stallman
@ 2020-10-13  3:53                     ` Richard Stallman
  2020-10-13  5:27                       ` Jean Louis
  2020-10-15  3:52                     ` Richard Stallman
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-13  3:53 UTC (permalink / raw)
  To: thibaut.verron; +Cc: bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Warning you mention is used on Emacs download page, see
  > > https://www.gnu.org/software/emacs/download.html

  > Great, so there is precedent ! Why is it acceptable and sufficient on
  > the main download page but not acceptable in a survey?

I am not sure what those words mean.  I will look at that page
and see if I can figure it out.  Would people like to explain what
part or aspect of that page is at issue here?
-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: How to request changes in Emacs
  2020-10-13  3:48             ` How to request changes in Emacs Richard Stallman
@ 2020-10-13  4:59               ` Jean Louis
  2020-10-16  4:00                 ` Richard Stallman
  2020-10-13 15:56               ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-13  4:59 UTC (permalink / raw)
  To: Richard Stallman; +Cc: abrochard, drew.adams, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-13 06:50]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > Only that "report Emacs bug" does not sound as free form feedback of
>   > any kind. I know it is, but it does not sound as enhancement
>   > request. It takes time for person to realize that.
> 
> That is a good point.  Do people have concrete suggestions for
> how to make it clearer how to request changes etc?

We discussed that in this same thread, concrete proposal would be to
expand the menu item Help -> Send Bug Report

The item "Send Bug Report" could be placeholder for something like
"Tell us how to improve" which would expand in more submenu options,
something like:

- Send Bug Report

- Suggest Emacs improvements

- Send email to Help GNU Emacs

- Join the Help GNU Emacs mailing list

- Leave Help GNU Emacs mailing list

The item "Suggest Emacs improvements" would be similar like
report-emacs-bug, with different wordings, as user is not speaking
about the bug, email could be sent to mailing list. It would be free
form, and it could also include various information of the system
similar as report-emacs-bug

GNU Hyperbole has similar features built in.

Drew Adams could give maybe better references to emails in this
thread, you could review the thread by the subject How to make Emacs
popular again.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-13  3:53                     ` Richard Stallman
@ 2020-10-13  5:25                       ` Jean Louis
  2020-10-15  3:59                         ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-13  5:25 UTC (permalink / raw)
  To: Richard Stallman; +Cc: thibaut.verron, emacs-devel

It is good to develop verified, safe, separate repository at
elpa.nongnu.org that would be included in Emacs as default, so that
people can get the safe, verified packages from repository that takes
care of users and help them understand freedom issues.

For MELPA warning it is good to be specific, as if there is some
wrapped proprietary software on MELPA, then let us find out which
software it is, and one can make a list, or even ask MELPA not to
include such.

Which one it is exactly?

The list of packages that wrap proprietary software would be anyway
required, if GNU wish to publish elpa.nongnu.org

Above is based on below.

* Richard Stallman <rms@gnu.org> [2020-10-13 06:53]:
> Some Emacs users have though about this but were not convinced, and
> then they probably dropped the question from their thoughts.  If we
> treat MELPA as if it were as legitimate as the free archives, they
> will be encouraged in considering it as legitimate as the free
> archives.
> 
> Perhaps we should do something to show them what the issue is.
> Perhaps with text like this:
> 
> ======================================================================
> GNU Emacs is part of the GNU operating system.  The GNU Project aims
> to escape, then replace, all nonfree software with freedom-respecting
> free software.
> 
> We maintain an Emacs package archive that consists of free packages
> that can run in a free environment.  There is another Emacs package
> archive called Melpa which distributes packages require the user to
> install some nonfree programs.  That practice is harmful because it
> encourages the installation of those nonfree programs, and that works
> against our goal -- it prioritizes short-term convenience over
> freedom.
> 
> Rather than prioritize short-term convenience over freedom, we
> normally avoid mentioning that Malpa exists.
> 
> As a special exception, we mentioned it in a question in this survey,
> to get data about its use.  That does not mean we have changed our
> minds about our criticism of Melpa.
> ======================================================================



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-13  3:53                     ` Richard Stallman
@ 2020-10-13  5:27                       ` Jean Louis
  2020-10-16  3:59                         ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-13  5:27 UTC (permalink / raw)
  To: Richard Stallman; +Cc: thibaut.verron, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-13 06:53]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > > Warning you mention is used on Emacs download page, see
>   > > https://www.gnu.org/software/emacs/download.html
> 
>   > Great, so there is precedent ! Why is it acceptable and sufficient on
>   > the main download page but not acceptable in a survey?
> 
> I am not sure what those words mean.  I will look at that page
> and see if I can figure it out.  Would people like to explain what
> part or aspect of that page is at issue here?

You missed to follow the thread. Discussion was about warning users
about non-free software in the survey itself.

On that page, we are warning users with below wording.


Nonfree systems

The reason for GNU Emacs's existence is to provide a powerful editor for the GNU operating system. Versions of GNU, such as GNU/Linux, are the primary
platforms for Emacs development. 

However, GNU Emacs includes support for some other systems that volunteers choose to support.

The purpose of the GNU system is to give users the freedom that proprietary software takes away from its users. Proprietary operating systems (like other
proprietary programs) are an injustice, and we aim for a world in which they do not exist. 

To improve the use of proprietary systems is a misguided goal. Our aim, rather, is to eliminate them. We include support for some proprietary systems in GNU
Emacs in the hope that running Emacs on them will give users a taste of freedom and thus lead them to free themselves. 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: How to request changes in Emacs
  2020-10-13  3:48             ` How to request changes in Emacs Richard Stallman
  2020-10-13  4:59               ` Jean Louis
@ 2020-10-13 15:56               ` Drew Adams
  2020-10-14  4:42                 ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-13 15:56 UTC (permalink / raw)
  To: rms, Jean Louis; +Cc: abrochard, emacs-devel

>   > Only that "report Emacs bug" does not sound as free form feedback of
>   > any kind. I know it is, but it does not sound as enhancement
>   > request. It takes time for person to realize that.
> 
> That is a good point.  Do people have concrete suggestions for
> how to make it clearer how to request changes etc?

There have been concrete suggestions for this.
For instance:

https://lists.gnu.org/archive/html/emacs-devel/2020-10/msg00552.html

The suggestions there include:

1. Alias `report-emacs-bug' to a name that suggests
   sending feedback in general, not just reporting a bug.

2. Change the description of that command, to reflect
   the fact that it is for _both_ sending general feedback
   and reporting bugs.  And change the descriptions in
   manuals accordingly.

3. Changing the Help menu item for reporting a but,
   so it suggests either reporting a bug or sending
   general feedback.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: How to request changes in Emacs
  2020-10-13 15:56               ` Drew Adams
@ 2020-10-14  4:42                 ` Richard Stallman
  2020-10-14  5:12                   ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-14  4:42 UTC (permalink / raw)
  To: Drew Adams; +Cc: abrochard, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

emacs-feedback could be a good name, but perhaps it should not insert
into the message some of the things that report-emacs-bug inserts.
They are relevant if the subject is a bug that just occurred, but not
in other circumstances.



-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: How to request changes in Emacs
  2020-10-14  4:42                 ` Richard Stallman
@ 2020-10-14  5:12                   ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-14  5:12 UTC (permalink / raw)
  To: rms; +Cc: abrochard, bugs, emacs-devel

> emacs-feedback could be a good name, but perhaps it should not insert
> into the message some of the things that report-emacs-bug inserts.
> They are relevant if the subject is a bug that just occurred, but not
> in other circumstances.

Agreed.  They are not necessarily relevant, not all anyway.
___

[I suggested, in 2013 and 2016, that we modularize the
possible info to automatically gather and send, and let
users choose which such pieces they want to send.

That modularization would also make it clearer & easier to
handle a new command for sending feedback a bit differently
from `report-emacs-bug', in terms of what to include.

https://lists.gnu.org/archive/html/emacs-devel/2016-05/msg00238.html

https://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00431.html]



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-12  5:33                   ` Thibaut Verron
                                       ` (2 preceding siblings ...)
  2020-10-13  3:53                     ` Richard Stallman
@ 2020-10-15  3:52                     ` Richard Stallman
  2020-10-15  5:57                       ` Thibaut Verron
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-15  3:52 UTC (permalink / raw)
  To: thibaut.verron; +Cc: bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Warning you mention is used on Emacs download page, see
  > > https://www.gnu.org/software/emacs/download.html

  > Great, so there is precedent ! Why is it acceptable and sufficient on
  > the main download page but not acceptable in a survey?

I am not sure what those words mean.  I looked at that page to see if
I could figure it out, but I was stuck.  Would people like to explain
what part or aspect of that page is at issue here?
-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-13  5:25                       ` Jean Louis
@ 2020-10-15  3:59                         ` Richard Stallman
  2020-10-15  5:19                           ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-15  3:59 UTC (permalink / raw)
  To: Jean Louis; +Cc: thibaut.verron, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > For MELPA warning it is good to be specific, as if there is some
  > wrapped proprietary software on MELPA, then let us find out which
  > software it is, and one can make a list, or even ask MELPA not to
  > include such.

  > Which one it is exactly?

I don't know, but probably someone here knows of some examples.

I have a vague recollection, though, that some of us already asked the
maintainers of Melpa to make this change, and they did not want to.

Does anyone actually know?

  > The list of packages that wrap proprietary software would be anyway
  > required, if GNU wish to publish elpa.nongnu.org

Yes and no.  We would not try to import all packages from MELPA except
those that were excluded for this reason.  Rather, we would need to
examine each package to decide whether to import it, and whether and
how change it.  In the process we would see if the package has any
problems that might be reasons not to import it.



-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-15  3:59                         ` Richard Stallman
@ 2020-10-15  5:19                           ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-15  5:19 UTC (permalink / raw)
  To: Richard Stallman; +Cc: thibaut.verron, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-15 07:00]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > For MELPA warning it is good to be specific, as if there is some
>   > wrapped proprietary software on MELPA, then let us find out which
>   > software it is, and one can make a list, or even ask MELPA not to
>   > include such.
> 
>   > Which one it is exactly?
> 
> I don't know, but probably someone here knows of some examples.
> 
> I have a vague recollection, though, that some of us already asked the
> maintainers of Melpa to make this change, and they did not want to.
> 
> Does anyone actually know?

Maybe these:

- lastpass, LastPass proprietary software command wrapper, it probably
  interacts with proprietary software from Emacs, inciting users to
  try out or use or install LastPass

- sharper, dotnet CLI wrapper, I am just blindly assuming that dotnet
  CLI is Microsoft proprietary programming language

Jean



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-15  3:52                     ` Richard Stallman
@ 2020-10-15  5:57                       ` Thibaut Verron
  0 siblings, 0 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-15  5:57 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Jean Louis, emacs-devel

Le jeu. 15 oct. 2020 à 05:52, Richard Stallman <rms@gnu.org> a écrit :
>
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > > Warning you mention is used on Emacs download page, see
>   > > https://www.gnu.org/software/emacs/download.html
>
>   > Great, so there is precedent ! Why is it acceptable and sufficient on
>   > the main download page but not acceptable in a survey?
>
> I am not sure what those words mean.  I looked at that page to see if
> I could figure it out, but I was stuck.  Would people like to explain
> what part or aspect of that page is at issue here?

As Jean-Louis said, the warning he was referring too is the preamble
of the section "Non-free systems".



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-13  5:27                       ` Jean Louis
@ 2020-10-16  3:59                         ` Richard Stallman
  2020-10-16  6:02                           ` Marcel Ventosa
  2020-10-16  7:05                           ` Thibaut Verron
  0 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-16  3:59 UTC (permalink / raw)
  To: Jean Louis; +Cc: thibaut.verron, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > On that page, we are warning users with below wording.

Yes.  I wrote those words.  It is crucial to have them there, because
we mention Windows and MacOS.  Where we mention them, we should explain
why they are unjust -- because otherwise people will assume we share
the usual amoral attitude towards them.

I think of it as a denunciation, not a warning.

Why is it ok to mention Windows and MacOS there?  Because everyone
using a computer already knows about them.  See node References
in the GNU Coding Standards (https://www.gnu.org/prep/standards/).

I hope that only a minority of Emacs users know about MELPA, and I'd
rather not inform the rest about it.  But if something is going to
inform them anyway, it is better to do it with a denunciation.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: How to request changes in Emacs
  2020-10-13  4:59               ` Jean Louis
@ 2020-10-16  4:00                 ` Richard Stallman
  2020-10-16  4:47                   ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-16  4:00 UTC (permalink / raw)
  To: Jean Louis; +Cc: abrochard, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > The item "Send Bug Report" could be placeholder for something like
  > "Tell us how to improve" which would expand in more submenu options,
  > something like:

I guess so.  Perhaps it should be renamed to "Give Feedback."

I always find submenus inconvenient to select from; am I the only
one?  Is it because I rarely do that?

  > - Send Bug Report

  > - Suggest Emacs improvements

  > - Send email to Help GNU Emacs

I suggest

  Mail a question to help-gnu-emacs.

  > - Join the Help GNU Emacs mailing list

  > - Leave Help GNU Emacs mailing list

I think the last two are not needed.  If a user finds out about
help-gnu-emacs, perse can decide to join.  Also, that command could
display, in some way, guidance on how to subscribe or unsubscribe.

Having fewer options could permit a more convenient interface for
choosing an option.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: How to request changes in Emacs
  2020-10-16  4:00                 ` Richard Stallman
@ 2020-10-16  4:47                   ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-16  4:47 UTC (permalink / raw)
  To: rms, Jean Louis; +Cc: abrochard, emacs-devel

>> - Send Bug Report
>> - Suggest Emacs improvements

I suggested it's also possible to combine those two:

  A separate `Help' menu item would help (even though
  redundant with item `Send Bug Report').  Or change
  that item to `Send Feedback or Bug Report'.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  3:59                         ` Richard Stallman
@ 2020-10-16  6:02                           ` Marcel Ventosa
  2020-10-16  6:52                             ` Thibaut Verron
                                               ` (2 more replies)
  2020-10-16  7:05                           ` Thibaut Verron
  1 sibling, 3 replies; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-16  6:02 UTC (permalink / raw)
  To: Richard Stallman; +Cc: thibaut.verron, Jean Louis, emacs-devel

On Thu, 15 Oct 2020 23:59:07 -0400
Richard Stallman <rms@gnu.org> wrote:

> I hope that only a minority of Emacs users know about MELPA, and I'd
> rather not inform the rest about it.  But if something is going to
> inform them anyway, it is better to do it with a denunciation.


I've been using Emacs (and MELPA) for the best part of a decade and
knew nothing about this! I'm concerned to use only free software and
actively avoid proprietary software, so this is a bit of a shock.

Is there anywhere I can read more about this issue?

I think this illustrates well why any initiative related with GNU (even
by association) should avoid mentioning proprietary software without a
clear warning and should, in fact, do its utmost to educate users about
free software.

I've used Trisquel, Parabola and Replicant for many years, and in all
of those cases, installing proprietary software is purposely made
difficult (For example, using a `your-freedom' package in Parabola. It
makes sense to force a user to actively remove `your-freedom' if he or
she wants to install a proprietary program; difficult to do so by
mistake.

In fact, I would go the extra mile and say Emacs should expressly warn
users over the dangers of installing proprietary software from
unofficial repositories (by the way, I always just assumed MELPA was
somehow official and related to ELPA, because its name is so similar to
ELPA). This survey could provide a good opportunity for such
information/education.

Over the years, as I worked on my emacs configuration, I read many
other confiruations, but none (that I recall) gave any warnings about
MELPA, so I never thought twice about it.

Any other caveats regarding unwittingly running proprietary software
inside of Emacs?

Sorry to derail the conversation.

Marcel



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  6:02                           ` Marcel Ventosa
@ 2020-10-16  6:52                             ` Thibaut Verron
  2020-10-16  7:24                               ` Marcel Ventosa
                                                 ` (2 more replies)
  2020-10-16 16:33                             ` MELPA issues - " Jean Louis
  2020-10-18  4:10                             ` Richard Stallman
  2 siblings, 3 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16  6:52 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Richard Stallman, Jean Louis, emacs-devel

Le ven. 16 oct. 2020 à 08:03, Marcel Ventosa <mve1@runbox.com> a écrit :
>
> On Thu, 15 Oct 2020 23:59:07 -0400
> Richard Stallman <rms@gnu.org> wrote:
>
> > I hope that only a minority of Emacs users know about MELPA, and I'd
> > rather not inform the rest about it.  But if something is going to
> > inform them anyway, it is better to do it with a denunciation.
>
>
> I've been using Emacs (and MELPA) for the best part of a decade and
> knew nothing about this! I'm concerned to use only free software and
> actively avoid proprietary software, so this is a bit of a shock.

As I understand it, Melpa packages cannot *be* or *install* non-free
software. But some will not work without such software, which can in
theory encourage users to install it.

So unless you yourself installed non-free software, Melpa cannot have
made your Emacs configuration non-free by accident.

> In fact, I would go the extra mile and say Emacs should expressly warn
> users over the dangers of installing proprietary software from
> unofficial repositories (by the way, I always just assumed MELPA was
> somehow official and related to ELPA, because its name is so similar to
> ELPA). This survey could provide a good opportunity for such
> information/education.

ELPA means Emacs Lisp Package Archive, so both Melpa and GNU Elpa are ELPA's.
I think that commonly referring to GNU Elpa as simply Elpa (which I am
also guilty of) is a bigger source of confusion than Melpa and GNU
Elpa sharing the same suffix.

GNU Elpa and the future Non-GNU Elpa are (will be) activated by
default as package archives, Melpa is not.
The hope is that once 99% of the packages by the community are
available in an archive activated by default, users will not rush to
install Melpa in the same proportions as today.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  3:59                         ` Richard Stallman
  2020-10-16  6:02                           ` Marcel Ventosa
@ 2020-10-16  7:05                           ` Thibaut Verron
  2020-10-16 13:23                             ` Philip K.
                                               ` (2 more replies)
  1 sibling, 3 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16  7:05 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Jean Louis, emacs-devel

Le ven. 16 oct. 2020 à 05:59, Richard Stallman <rms@gnu.org> a écrit :
> I hope that only a minority of Emacs users know about MELPA, and I'd
> rather not inform the rest about it.  But if something is going to
> inform them anyway, it is better to do it with a denunciation.

I believe that it is too late for such hopes, and that a majority of
Emacs users know about Melpa and/or uses it. Some people know about it
without using it (most of them probably read this list) and some
people use it without knowing it (users of pre-configured emacs'es).

For instance, those three links were on the first page of a duckduckgo
search for "install emacs packages":

https://www.emacswiki.org/emacs/InstallingPackages
http://ergoemacs.org/emacs/emacs_package_system.html
http://pragmaticemacs.com/emacs/install-packages/

None of them denunciate anything, only one of them even mentions that
Melpa is not official.

I believe that if the Emacs webpage and manual were to mention Melpa,
it would inform a lot of users about the potential risks to freedom of
Melpa, and only inform a few users of the existence of Melpa.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  6:52                             ` Thibaut Verron
@ 2020-10-16  7:24                               ` Marcel Ventosa
  2020-10-16  7:53                                 ` Thibaut Verron
  2020-10-16 17:08                                 ` Jean Louis
  2020-10-16 17:04                               ` Jean Louis
  2020-10-18  4:09                               ` Richard Stallman
  2 siblings, 2 replies; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-16  7:24 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, Jean Louis, emacs-devel

On Fri, 16 Oct 2020 08:52:49 +0200
Thibaut Verron <thibaut.verron@gmail.com> wrote:

> Le ven. 16 oct. 2020 à 08:03, Marcel Ventosa <mve1@runbox.com> a
> écrit :
> >
> > On Thu, 15 Oct 2020 23:59:07 -0400
> > Richard Stallman <rms@gnu.org> wrote:
> >  
> > > I hope that only a minority of Emacs users know about MELPA, and
> > > I'd rather not inform the rest about it.  But if something is
> > > going to inform them anyway, it is better to do it with a
> > > denunciation.  
> >
> >
> > I've been using Emacs (and MELPA) for the best part of a decade and
> > knew nothing about this! I'm concerned to use only free software and
> > actively avoid proprietary software, so this is a bit of a shock.  
> 
> As I understand it, Melpa packages cannot *be* or *install* non-free
> software. But some will not work without such software, which can in
> theory encourage users to install it.
> 
> So unless you yourself installed non-free software, Melpa cannot have
> made your Emacs configuration non-free by accident.

I understand, thanks for the explanation. In that case, I think I'm
well informed enough to have avoived the dangers. I wonder how many
people are not. AFAIK, both Trisquel and Parabola keep out packages
that recommend or encourage proprietary software, which seems essential
to protect users' freedom. 

> > In fact, I would go the extra mile and say Emacs should expressly
> > warn users over the dangers of installing proprietary software from
> > unofficial repositories (by the way, I always just assumed MELPA was
> > somehow official and related to ELPA, because its name is so
> > similar to ELPA). This survey could provide a good opportunity for
> > such information/education.  
> 
> ELPA means Emacs Lisp Package Archive, so both Melpa and GNU Elpa are
> ELPA's. I think that commonly referring to GNU Elpa as simply Elpa
> (which I am also guilty of) is a bigger source of confusion than
> Melpa and GNU Elpa sharing the same suffix.

As written on the MELPA Github about page:

"MELPA is Milkypostman's ELPA or Milkypostman's Experimental Lisp
Package Archive if you're not into the whole brevity thing." 

Perhaps the shared `E' in `Elpa' is purely coincidental?

> GNU Elpa and the future Non-GNU Elpa are (will be) activated by
> default as package archives, Melpa is not.
> The hope is that once 99% of the packages by the community are
> available in an archive activated by default, users will not rush to
> install Melpa in the same proportions as today.

This will be good news! In the meantime, I wonder how many others are
unaware of the potential dangers of using MELPA. A prominent place to
inform Emacs users about these dangers would be useful; perhaps this
survey will provide a good first opportunity. In any case, I'm thankful
to RMS and this survey related conversation for an important discovery. 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  7:24                               ` Marcel Ventosa
@ 2020-10-16  7:53                                 ` Thibaut Verron
  2020-10-16  8:25                                   ` Marcel Ventosa
  2020-10-16 18:57                                   ` Jean Louis
  2020-10-16 17:08                                 ` Jean Louis
  1 sibling, 2 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16  7:53 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Richard Stallman, Jean Louis, emacs-devel

Le ven. 16 oct. 2020 à 09:24, Marcel Ventosa <mve1@runbox.com> a écrit :
>
> On Fri, 16 Oct 2020 08:52:49 +0200
> Thibaut Verron <thibaut.verron@gmail.com> wrote:
>
> > Le ven. 16 oct. 2020 à 08:03, Marcel Ventosa <mve1@runbox.com> a
> > écrit :
> > >
> > > On Thu, 15 Oct 2020 23:59:07 -0400
> > > Richard Stallman <rms@gnu.org> wrote:
> > >
> > > > I hope that only a minority of Emacs users know about MELPA, and
> > > > I'd rather not inform the rest about it.  But if something is
> > > > going to inform them anyway, it is better to do it with a
> > > > denunciation.
> > >
> > >
> > > I've been using Emacs (and MELPA) for the best part of a decade and
> > > knew nothing about this! I'm concerned to use only free software and
> > > actively avoid proprietary software, so this is a bit of a shock.
> >
> > As I understand it, Melpa packages cannot *be* or *install* non-free
> > software. But some will not work without such software, which can in
> > theory encourage users to install it.
> >
> > So unless you yourself installed non-free software, Melpa cannot have
> > made your Emacs configuration non-free by accident.
>
> I understand, thanks for the explanation. In that case, I think I'm
> well informed enough to have avoived the dangers. I wonder how many
> people are not.

I personally don't think many users install non-free software because
they saw it wrapped in a Melpa package.

Taking the example of emacs-lastpass given above, I don't see how
anyone would even find this package without searching for it with the
keyword "lastpass".

The audience, rather, is users who are currently using Lastpass in
their browsers but are interested in bringing some of their online
activities to Emacs, but rely on their password manager to do so.

In due time, with the new "taste of freedom", they might even switch
to Keepass or Bitwarden (note: I don't use a password manager in
Emacs, so I have no idea of the quality of each support package,
beyond their existence), but in any case, I believe that for those
users, the existence of transitional solutions is a good thing.

I absolutely support the fact that Melpa is not activated by default,
and that there should be a warning about the existence of those
packages everywhere possible. But I still consider that the value of
those packages outweigh their dangers, just like the win32 build of
Emacs.

> > ELPA means Emacs Lisp Package Archive, so both Melpa and GNU Elpa are
> > ELPA's. I think that commonly referring to GNU Elpa as simply Elpa
> > (which I am also guilty of) is a bigger source of confusion than
> > Melpa and GNU Elpa sharing the same suffix.
>
> As written on the MELPA Github about page:
>
> "MELPA is Milkypostman's ELPA or Milkypostman's Experimental Lisp
> Package Archive if you're not into the whole brevity thing."
>
> Perhaps the shared `E' in `Elpa' is purely coincidental?

I didn't know about the Experimental version, thanks. If anything, the
quoted sentence is self-contradicting for me.
Also, the title of the melpa.org page is "MELPA (Milkypostman’s Emacs
Lisp Package Archive)".

In any case, I don't know if an acronym with a different vowel but
still ending with LPA, such as Milpa, would be less confusing.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  7:53                                 ` Thibaut Verron
@ 2020-10-16  8:25                                   ` Marcel Ventosa
  2020-10-16 12:17                                     ` Dmitry Gutov
                                                       ` (2 more replies)
  2020-10-16 18:57                                   ` Jean Louis
  1 sibling, 3 replies; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-16  8:25 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, Jean Louis, emacs-devel

On Fri, 16 Oct 2020 09:53:22 +0200
Thibaut Verron <thibaut.verron@gmail.com> wrote:

> Le ven. 16 oct. 2020 à 09:24, Marcel Ventosa <mve1@runbox.com> a
> écrit :
> >
> > On Fri, 16 Oct 2020 08:52:49 +0200
> > Thibaut Verron <thibaut.verron@gmail.com> wrote:
> >  
> > > Le ven. 16 oct. 2020 à 08:03, Marcel Ventosa <mve1@runbox.com> a
> > > écrit :  
> > > >
> > > > On Thu, 15 Oct 2020 23:59:07 -0400
> > > > Richard Stallman <rms@gnu.org> wrote:
> > > >  
> > > > > I hope that only a minority of Emacs users know about MELPA,
> > > > > and I'd rather not inform the rest about it.  But if
> > > > > something is going to inform them anyway, it is better to do
> > > > > it with a denunciation.  
> > > >
> > > >
> > > > I've been using Emacs (and MELPA) for the best part of a decade
> > > > and knew nothing about this! I'm concerned to use only free
> > > > software and actively avoid proprietary software, so this is a
> > > > bit of a shock.  
> > >
> > > As I understand it, Melpa packages cannot *be* or *install*
> > > non-free software. But some will not work without such software,
> > > which can in theory encourage users to install it.
> > >
> > > So unless you yourself installed non-free software, Melpa cannot
> > > have made your Emacs configuration non-free by accident.  
> >
> > I understand, thanks for the explanation. In that case, I think I'm
> > well informed enough to have avoived the dangers. I wonder how many
> > people are not.  
> 
> I personally don't think many users install non-free software because
> they saw it wrapped in a Melpa package.
> 
> Taking the example of emacs-lastpass given above, I don't see how
> anyone would even find this package without searching for it with the
> keyword "lastpass".
> 
> The audience, rather, is users who are currently using Lastpass in
> their browsers but are interested in bringing some of their online
> activities to Emacs, but rely on their password manager to do so.
> 
> In due time, with the new "taste of freedom", they might even switch
> to Keepass or Bitwarden (note: I don't use a password manager in
> Emacs, so I have no idea of the quality of each support package,
> beyond their existence), but in any case, I believe that for those
> users, the existence of transitional solutions is a good thing.

I understand your point, and transitional solutions may indeed be a good
thing (though they can lead both ways). However, it's a long-standing
position of GNU not to be seen to endorse these compromises, whether or
not their existence is a good thing. For me, the name GNU has always
signified a free software safe haven. The idea that one might be misled
into installing proprietary software because of well earned trust in GNU
should be avoided at all costs.

I would posit the same if I was a member of a vegan organization that
was relaxing their views on eating animals to ease the transition. While
there is little doubt transitions can be beneficial, the vegan
organization should not confuse it's tenets.

Perhaps. Transitional solutions go both ways though. A cursory glance at
Reddit's Emacs group is enough to notice not only ignorance of the
philosophy behind GNU, but quite recurrent mockery of what it stands
for. Usually in the form of deriding RMS. For the most recent example,
one user comments under abrochard's survey post: "So, will you be
censoring the survey to maintain ideological purity, like rms
insisted?", to which abrochard responds: "I agree with you. The
discussion around Melpa is a big factor as to why the survey is
happening in parallel to the gnu project."

> I absolutely support the fact that Melpa is not activated by default,
> and that there should be a warning about the existence of those
> packages everywhere possible. But I still consider that the value of
> those packages outweigh their dangers, just like the win32 build of
> Emacs.
> 
> > > ELPA means Emacs Lisp Package Archive, so both Melpa and GNU Elpa
> > > are ELPA's. I think that commonly referring to GNU Elpa as simply
> > > Elpa (which I am also guilty of) is a bigger source of confusion
> > > than Melpa and GNU Elpa sharing the same suffix.  
> >
> > As written on the MELPA Github about page:
> >
> > "MELPA is Milkypostman's ELPA or Milkypostman's Experimental Lisp
> > Package Archive if you're not into the whole brevity thing."
> >
> > Perhaps the shared `E' in `Elpa' is purely coincidental?  
> 
> I didn't know about the Experimental version, thanks. If anything, the
> quoted sentence is self-contradicting for me.
> Also, the title of the melpa.org page is "MELPA (Milkypostman’s Emacs
> Lisp Package Archive)".
> 
> In any case, I don't know if an acronym with a different vowel but
> still ending with LPA, such as Milpa, would be less confusing.

Yes, I see it as a problem when an unofficial offshoot of a project does
not make it crystal clear that it is so. In fact, and on the same topic,
a post was made about the survey yesterday on Reddit by Abrochard with
the title "The Emacs User Survey 2020 will open on Oct 19th," which
makes it sound as though it were an official survey. Further down the
thread, a user criticized RMS of trying to censor the survey, mentioning
the MELPA discussion in particular, to which Abrochard responded: "I
agree with you. The discussion around Melpa is a big factor as to why
the survey is happening in parallel to the gnu project."

I'm not saying the obfuscation is purposeful either in the case of
`MELPA' imitating the name of the existing `GNU ELPA', or of Adrien
calling his survey *The* Emacs User survey", but what I do think is that
all non-GNU initiatives that affect perception of GNU, particularly the
ones that clearly do not share the GNU philosophy (the survey referred
to `GNU/Linux' as `Linux', for example), would seem much more
transparent if they were very clearly and visibly labeled as unofficial.
My hope, of course, would be that these initiatives could respect the
GNU philosophy, even if they did not share it.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  8:25                                   ` Marcel Ventosa
@ 2020-10-16 12:17                                     ` Dmitry Gutov
  2020-10-16 13:45                                       ` Marcel Ventosa
                                                         ` (2 more replies)
  2020-10-16 17:29                                     ` Jean Louis
  2020-10-17  4:22                                     ` Richard Stallman
  2 siblings, 3 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 12:17 UTC (permalink / raw)
  To: Marcel Ventosa, Thibaut Verron; +Cc: Richard Stallman, Jean Louis, emacs-devel

On 16.10.2020 11:25, Marcel Ventosa wrote:

> Perhaps. Transitional solutions go both ways though. A cursory glance at
> Reddit's Emacs group is enough to notice not only ignorance of the
> philosophy behind GNU, but quite recurrent mockery of what it stands
> for. Usually in the form of deriding RMS. For the most recent example,
> one user comments under abrochard's survey post: "So, will you be
> censoring the survey to maintain ideological purity, like rms
> insisted?", to which abrochard responds: "I agree with you. The
> discussion around Melpa is a big factor as to why the survey is
> happening in parallel to the gnu project."

Do you think the "mockery" is entirely without merit?

It's not even so much real mockery as probably the only way the user 
could describe the conflict.

When a survey purposefully omits a well-known and popular option, it is 
going to discount a sizable portion of our community, and ignore a 
project that has done a lot to popularize Emacs over the years.

I think it's both insulting to its developers, and stinks of thought 
police. Far from the idea of user freedom I hope to expect from GNU and FSF.

> I'm not saying the obfuscation is purposeful either in the case of
> `MELPA' imitating the name of the existing `GNU ELPA', or of Adrien
> calling his survey *The* Emacs User survey", but what I do think is that
> all non-GNU initiatives that affect perception of GNU, particularly the
> ones that clearly do not share the GNU philosophy (the survey referred
> to `GNU/Linux' as `Linux', for example), would seem much more
> transparent if they were very clearly and visibly labeled as unofficial.
> My hope, of course, would be that these initiatives could respect the
> GNU philosophy, even if they did not share it.

Calling it "THE Emacs User survey" is perhaps unfortunate. But likewise 
it is unfortunate how Emacs leadership does little to follow the 
external, "unofficial" polls.

A survey doesn't have to be "the official GNU survey" to be useful.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  7:05                           ` Thibaut Verron
@ 2020-10-16 13:23                             ` Philip K.
  2020-10-16 18:46                             ` Jean Louis
  2020-10-17  4:22                             ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Philip K. @ 2020-10-16 13:23 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, Jean Louis, emacs-devel

Thibaut Verron <thibaut.verron@gmail.com> writes:

> Le ven. 16 oct. 2020 à 05:59, Richard Stallman <rms@gnu.org> a écrit :
>> I hope that only a minority of Emacs users know about MELPA, and I'd
>> rather not inform the rest about it.  But if something is going to
>> inform them anyway, it is better to do it with a denunciation.
>
> I believe that it is too late for such hopes, and that a majority of
> Emacs users know about Melpa and/or uses it. Some people know about it
> without using it (most of them probably read this list) and some
> people use it without knowing it (users of pre-configured emacs'es).
>
> For instance, those three links were on the first page of a duckduckgo
> search for "install emacs packages":
>
> https://www.emacswiki.org/emacs/InstallingPackages
> http://ergoemacs.org/emacs/emacs_package_system.html
> http://pragmaticemacs.com/emacs/install-packages/

And that's only if the user already knows that they want to install
packages (instead of "plug-ins" or "extensions", as other software would
refer to the concept). From my experience, almost every non-official
beginners tutorial will either mention or just give you the code to
configure MELPA. And with all the starter-packages that offer to
pre-configure Emacs, you don't even think about it.

But that's currently unavoidable, a lot of the advocacy for Emacs is
based on promoting certain packages (Magit, Evil, Org-mode extensions
such as Roam, etc.) that are for the most part only available on MELPA.
Non-GNU Elpa should help to mitigate this problem, as my impression is
that most people intrigued in Emacs, would quickly loose interest, if it
weren't for these specific packages.

(In general I think that that kind promotion isn't good, at least in the
long term. Emacs is seen as getting in the way of whatever package you
need, and they therefore follow whatever method they find to avoid
learning. While possible, it leaves many on a fragile tower of
abstractions and hacks, that could break at any moment.)

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-09 23:12   ` Adrien Brochard
                       ` (5 preceding siblings ...)
  2020-10-11 20:54     ` Bonface M. K.
@ 2020-10-16 13:30     ` Philip K.
  6 siblings, 0 replies; 838+ messages in thread
From: Philip K. @ 2020-10-16 13:30 UTC (permalink / raw)
  To: Adrien Brochard; +Cc: emacs-devel

Adrien Brochard <abrochard@gmx.com> writes:

> ** How do you use Emacs?
>     - GUI
>     - Terminal (TUI)
>     - Both

I'd suggest also asking how they use the GUI. Do they keep everything as
it is, or hide the scroll-, tool- and menu bar (or just parts).

Perhaps, if it turns out that most people disable some feature, it could
be turned off by default in the next release? If you ask me, just
removing the tool-bar would improve the default look more than anything
else.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 12:17                                     ` Dmitry Gutov
@ 2020-10-16 13:45                                       ` Marcel Ventosa
  2020-10-16 14:04                                         ` Dmitry Gutov
  2020-10-16 19:08                                         ` Jean Louis
  2020-10-16 13:57                                       ` Ergus
  2020-10-16 16:09                                       ` Alfred M. Szmidt
  2 siblings, 2 replies; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-16 13:45 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Jean Louis, Richard Stallman, Thibaut Verron, emacs-devel

On Fri, 16 Oct 2020 15:17:16 +0300
Dmitry Gutov <dgutov@yandex.ru> wrote:

> Do you think the "mockery" is entirely without merit?

Yes, and I think mockery precludes understanding, particularly as we
are dealing with a thoughtful man and a well developed and time tested
philosophy, successfully put into practice against the odds.

> ignore a project that has done a lot to popularize Emacs over the years.

I fail to understand the narrative that pushes popularity over all else.
What would be the use of making Emacs the most popular editor if it
discarded the philosophy that brought it about?

I've noticed a trend of speaking about Emacs and other free software
projects as if they were "commodities" and "products," but as I see
them, it is precisely because they are community driven projects that
they are not "commodities" or "products".

> I think it's both insulting to its developers, and stinks of thought 
> police. Far from the idea of user freedom I hope to expect from GNU and FSF.

You are conflating freedom, as in the freedom to do whatever you want,
with software freedom as defined by GNU, which succintly means that
users have the freedom to run, copy, distribute, study, change and
improve software. 

I don't understand how refusing to draw attention to a repository that
recommends proprietary software turns anyone into the "thought police".

I see no reason why the GNU project or the FSF should raise awareness of
solutions that go against their founding philosophy, except to raise
awareness to its dangers.

Further up the list, I read RMS suggesting mentioning MELPA with a
disclaimer and warning about its use. 

In fact, one of the most worrying aspects of this survey idea, as I see
it, is the suggested use of non-free Javascript to implement it.

> it is unfortunate how Emacs leadership does little to follow the 
> external, "unofficial" polls.

What do you mean by this?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 12:17                                     ` Dmitry Gutov
  2020-10-16 13:45                                       ` Marcel Ventosa
@ 2020-10-16 13:57                                       ` Ergus
  2020-10-16 15:31                                         ` Eli Zaretskii
  2020-10-16 19:11                                         ` Jean Louis
  2020-10-16 16:09                                       ` Alfred M. Szmidt
  2 siblings, 2 replies; 838+ messages in thread
From: Ergus @ 2020-10-16 13:57 UTC (permalink / raw)
  To: Dmitry Gutov
  Cc: Marcel Ventosa, Thibaut Verron, Richard Stallman, Jean Louis,
	emacs-devel

On Fri, Oct 16, 2020 at 03:17:16PM +0300, Dmitry Gutov wrote:
>On 16.10.2020 11:25, Marcel Ventosa wrote:
>
>>Perhaps. Transitional solutions go both ways though. A cursory glance at
>>Reddit's Emacs group is enough to notice not only ignorance of the
>>philosophy behind GNU, but quite recurrent mockery of what it stands
>>for. Usually in the form of deriding RMS. For the most recent example,
>>one user comments under abrochard's survey post: "So, will you be
>>censoring the survey to maintain ideological purity, like rms
>>insisted?", to which abrochard responds: "I agree with you. The
>>discussion around Melpa is a big factor as to why the survey is
>>happening in parallel to the gnu project."
>
>Do you think the "mockery" is entirely without merit?
>
>It's not even so much real mockery as probably the only way the user 
>could describe the conflict.
>
>When a survey purposefully omits a well-known and popular option, it 
>is going to discount a sizable portion of our community, and ignore a 
>project that has done a lot to popularize Emacs over the years.
>
>I think it's both insulting to its developers, and stinks of thought 
>police. Far from the idea of user freedom I hope to expect from GNU 
>and FSF.
>
>>I'm not saying the obfuscation is purposeful either in the case of
>>`MELPA' imitating the name of the existing `GNU ELPA', or of Adrien
>>calling his survey *The* Emacs User survey", but what I do think is that
>>all non-GNU initiatives that affect perception of GNU, particularly the
>>ones that clearly do not share the GNU philosophy (the survey referred
>>to `GNU/Linux' as `Linux', for example), would seem much more
>>transparent if they were very clearly and visibly labeled as unofficial.
>>My hope, of course, would be that these initiatives could respect the
>>GNU philosophy, even if they did not share it.
>
>Calling it "THE Emacs User survey" is perhaps unfortunate. But 
>likewise it is unfortunate how Emacs leadership does little to follow 
>the external, "unofficial" polls.
>
>A survey doesn't have to be "the official GNU survey" to be useful.
>
I totally agree. I have contributed (and almost maintain) some melpa
packages that have been abandoned by their creators. It is not possible
to add them to elpa because most of the contributors are not active
anymore or are hard to contact, or just don't care at all. This doesn't
mean that they are "bad" or "dangerous" packages just because they can't
follow the paperwork. And that doesn't mean that I should rewrite all
the code just to avoid including the other authors to add them to
elpa. That would be unethical. 

Some melpa packages like LSP, magit, elpy are basically the only
alternative the users have to make emacs useful for their
purposes. While others like helm, use-package, evil are essential for a
huge part of the users.

At the end anyone can use, read the code, distribute and improve that
code... so it is free independently of what a piece of paper says (or
don't say) and closing the code will just kill the packages.

Reject using melpa for ideological reasons means that the users won't
have alternatives for their work and emacs will become like a useless
tool for a big part of our community; whitout melpa many users will go
for more "useful" alternatives that really steal their freedom like
VSCode or Atom... because they need to have the work done any way.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 13:45                                       ` Marcel Ventosa
@ 2020-10-16 14:04                                         ` Dmitry Gutov
  2020-10-16 14:33                                           ` Marcel Ventosa
  2020-10-16 19:17                                           ` Jean Louis
  2020-10-16 19:08                                         ` Jean Louis
  1 sibling, 2 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 14:04 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Jean Louis, Richard Stallman, Thibaut Verron, emacs-devel

On 16.10.2020 16:45, Marcel Ventosa wrote:
> On Fri, 16 Oct 2020 15:17:16 +0300
> Dmitry Gutov <dgutov@yandex.ru> wrote:
> 
>> Do you think the "mockery" is entirely without merit?
> 
> Yes, and I think mockery precludes understanding, particularly as we
> are dealing with a thoughtful man and a well developed and time tested
> philosophy, successfully put into practice against the odds.

Shutting our eyes to actual user behavior also precludes understanding.

>> ignore a project that has done a lot to popularize Emacs over the years.
> 
> I fail to understand the narrative that pushes popularity over all else.

Strawman.

> What would be the use of making Emacs the most popular editor if it
> discarded the philosophy that brought it about?

It doesn't.

And picking on 2-3 "ideologically impure" packages (out of several 
thousands!) that are distributed on MELPA is counter-productive.

>> I think it's both insulting to its developers, and stinks of thought
>> police. Far from the idea of user freedom I hope to expect from GNU and FSF.
> 
> You are conflating freedom, as in the freedom to do whatever you want,

I don't. But a certain freedom of thought, knowledge and discussion is 
necessary, as should be apparent to any educated individual.

> I don't understand how refusing to draw attention to a repository that
> recommends proprietary software turns anyone into the "thought police".

It's a *survey*! A survey is supposed to gather insight into what users 
do, and what they need. Not shape their behavior.

You can't be effective at affecting change anyway, if you don't know 
what's going on outside.

> Further up the list, I read RMS suggesting mentioning MELPA with a
> disclaimer and warning about its use.

That didn't seem to be the preferred option, in RMS's opinion.

> In fact, one of the most worrying aspects of this survey idea, as I see
> it, is the suggested use of non-free Javascript to implement it.

Didn't Philip show a prototype that didn't use JavaScript?

>> it is unfortunate how Emacs leadership does little to follow the
>> external, "unofficial" polls.
> 
> What do you mean by this?

I don't recall any single change in Emacs' behavior that resulted from 
an external poll or survey.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:04                                         ` Dmitry Gutov
@ 2020-10-16 14:33                                           ` Marcel Ventosa
  2020-10-16 14:58                                             ` Thibaut Verron
                                                               ` (3 more replies)
  2020-10-16 19:17                                           ` Jean Louis
  1 sibling, 4 replies; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-16 14:33 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Thibaut Verron, Richard Stallman, Jean Louis, emacs-devel

On Fri, 16 Oct 2020 17:04:22 +0300
Dmitry Gutov <dgutov@yandex.ru> wrote:

> On 16.10.2020 16:45, Marcel Ventosa wrote:
> > On Fri, 16 Oct 2020 15:17:16 +0300
> > Dmitry Gutov <dgutov@yandex.ru> wrote:
> >   
> >> Do you think the "mockery" is entirely without merit?  
> > 
> > Yes, and I think mockery precludes understanding, particularly as we
> > are dealing with a thoughtful man and a well developed and time
> > tested philosophy, successfully put into practice against the odds.
> >  
> 
> Shutting our eyes to actual user behavior also precludes
> understanding.

From what I just read from Thibaut, a free software compatible solution
to replace MELPA is underway. Refusing to draw attention to something is
not "shutting our eyes".

> >> ignore a project that has done a lot to popularize Emacs over the
> >> years.  
> > 
> > I fail to understand the narrative that pushes popularity over all
> > else.  
> 
> Strawman.

I thought your argument was popularity, something that keeps coming up
in these kinds of discussions. What was your argument?

> > What would be the use of making Emacs the most popular editor if it
> > discarded the philosophy that brought it about?  
> 
> It doesn't.
> 
> And picking on 2-3 "ideologically impure" packages (out of several 
> thousands!) that are distributed on MELPA is counter-productive.

We could turn this argument around and ask why the developers who
maintain MELPA don't remove `2-3' packages that promote non-free
software. What came first, the GNU Emacs or the MELPA?

> >> I think it's both insulting to its developers, and stinks of
> >> thought police. Far from the idea of user freedom I hope to expect
> >> from GNU and FSF.  
> > 
> > You are conflating freedom, as in the freedom to do whatever you
> > want,  
> 
> I don't. But a certain freedom of thought, knowledge and discussion
> is necessary, as should be apparent to any educated individual.
> 
> > I don't understand how refusing to draw attention to a repository
> > that recommends proprietary software turns anyone into the "thought
> > police".  
> 
> It's a *survey*! A survey is supposed to gather insight into what
> users do, and what they need. Not shape their behavior.
> 
> You can't be effective at affecting change anyway, if you don't know 
> what's going on outside.

Indeed. As I recall, RMS suggested open questions instead of multiple
choice questions that "shape their behavior". With open questions, there
is no need to mention MELPA at all in fact. With open questions, the
insights that could be derived would be much more interesting.

> > Further up the list, I read RMS suggesting mentioning MELPA with a
> > disclaimer and warning about its use.  
> 
> That didn't seem to be the preferred option, in RMS's opinion.
> 
> > In fact, one of the most worrying aspects of this survey idea, as I
> > see it, is the suggested use of non-free Javascript to implement
> > it.  
> 
> Didn't Philip show a prototype that didn't use JavaScript?

That's very good news if the issue has been settled.

> >> it is unfortunate how Emacs leadership does little to follow the
> >> external, "unofficial" polls.  
> > 
> > What do you mean by this?  
> 
> I don't recall any single change in Emacs' behavior that resulted
> from an external poll or survey.

Why should Emacs development be guided by (external) survey results? I
would think it should be guided, for the most part, by what the people
putting their time into it want to create, within the principles of the
philosophy of the project and its goals. Also, anyone can suggest
changes and convince the maintainers that these changes are in the best
interest of the project (and contribute the actual changes if they are
accepted).

If they are not, Emacs makes it quite simple to implement changes for
personal "improvements". I have written functions that serve me
personally and change the behavior of Emacs to suit my needs. There are
limits to what I can do, which could be pushed if I dedicated a greater
effort to do so. How is that unfair?

If I thought one of my changes could benefit the community at large, I
would approach the maintainers and suggest it. If they disagreed with my
view, I could publish the code and could still share it with anyone
willing to run it.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:33                                           ` Marcel Ventosa
@ 2020-10-16 14:58                                             ` Thibaut Verron
  2020-10-16 15:51                                               ` Alfred M. Szmidt
  2020-10-17  4:20                                               ` Richard Stallman
  2020-10-16 15:36                                             ` Ergus
                                                               ` (2 subsequent siblings)
  3 siblings, 2 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 14:58 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: emacs-devel, Richard Stallman, Jean Louis, Dmitry Gutov

> > And picking on 2-3 "ideologically impure" packages (out of several
> > thousands!) that are distributed on MELPA is counter-productive.
>
> We could turn this argument around and ask why the developers who
> maintain MELPA don't remove `2-3' packages that promote non-free
> software.

I sincerely hope it doesn't happen. Those packages might rely on
non-free software, but they are still packages that some users find
valuable or even vital, and that they would want to find somewhere
else if not available on Melpa. Removing them from Melpa would only
move the "problem".

Also, is the goal of the GNU project to deny users the right to run
the software they want or need? Or is it to give them a choice of free
options to replace non-free software?

Having those packages removed would make it more difficult to use
non-free software, but it would do nothing to improve the power of
free software.

> What came first, the GNU Emacs or the MELPA?

What does it have to do with the question?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 13:57                                       ` Ergus
@ 2020-10-16 15:31                                         ` Eli Zaretskii
  2020-10-16 19:11                                         ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2020-10-16 15:31 UTC (permalink / raw)
  To: Ergus; +Cc: rms, bugs, mve1, emacs-devel, dgutov, thibaut.verron

> Date: Fri, 16 Oct 2020 15:57:16 +0200
> From: Ergus <spacibba@aol.com>
> Cc: Marcel Ventosa <mve1@runbox.com>,
>  Thibaut Verron <thibaut.verron@gmail.com>,
>  Richard Stallman <rms@gnu.org>, Jean Louis <bugs@gnu.support>,
>  emacs-devel <emacs-devel@gnu.org>
> 
> Reject using melpa for ideological reasons means that the users won't
> have alternatives for their work and emacs will become like a useless
> tool for a big part of our community; whitout melpa many users will go
> for more "useful" alternatives that really steal their freedom like
> VSCode or Atom... because they need to have the work done any way.

I believe the efforts to start nonGNU ELPA are intended to address
that.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:33                                           ` Marcel Ventosa
  2020-10-16 14:58                                             ` Thibaut Verron
@ 2020-10-16 15:36                                             ` Ergus
  2020-10-16 19:08                                             ` Dmitry Gutov
  2020-10-16 19:22                                             ` Jean Louis
  3 siblings, 0 replies; 838+ messages in thread
From: Ergus @ 2020-10-16 15:36 UTC (permalink / raw)
  To: Marcel Ventosa
  Cc: Dmitry Gutov, Thibaut Verron, Richard Stallman, Jean Louis,
	emacs-devel

On Fri, Oct 16, 2020 at 09:33:12PM +0700, Marcel Ventosa wrote:
>On Fri, 16 Oct 2020 17:04:22 +0300
>Dmitry Gutov <dgutov@yandex.ru> wrote:
>
>
>From what I just read from Thibaut, a free software compatible solution
>to replace MELPA is underway. Refusing to draw attention to something is
>not "shutting our eyes".
>
Melpa will never die. Specially because it is a more open community; has
been around for long time and anyone can contribute almost
anonymously. It is the equivalent to the AUR in arch linux.

>
>I thought your argument was popularity, something that keeps coming up
>in these kinds of discussions. What was your argument?
>
Popularity, usability... there are many. Many packages in melpa are just
unique and has a lot of work invested on them that nobody is planning to
duplicate (ex: magit) 

>
>We could turn this argument around and ask why the developers who
>maintain MELPA don't remove `2-3' packages that promote non-free
>software. What came first, the GNU Emacs or the MELPA?
>
Because this 1) don't improve free software alternatives in any way 2)
will force the user to use free software instead of giving them the
option to choose it 3) Because it will restrict melpa in a way opposed
to its intention... Basically if a user is concerned then

1) will not add melpa to emacs
2) will read every package licenses...

>
>Indeed. As I recall, RMS suggested open questions instead of multiple
>choice questions that "shape their behavior". With open questions, there
>is no need to mention MELPA at all in fact. With open questions, the
>insights that could be derived would be much more interesting.
>
>
>That's very good news if the issue has been settled.
>
>
>Why should Emacs development be guided by (external) survey results? I
>would think it should be guided, for the most part, by what the people
>putting their time into it want to create, within the principles of the
>philosophy of the project and its goals. Also, anyone can suggest
>changes and convince the maintainers that these changes are in the best
>interest of the project (and contribute the actual changes if they are
>accepted).
>
The main problem we have in emacs is the limited number of active
developers. Half of the time the problem is not to convince the
developers to do the work; but having someone to do it... So in that
scenario, all the work invested in melpa packages is something we are
not in conditions to reject; because those developers provide support
and packages that we don't have the man power to do.

>If they are not, Emacs makes it quite simple to implement changes for
>personal "improvements". I have written functions that serve me
>personally and change the behavior of Emacs to suit my needs. There are
>limits to what I can do, which could be pushed if I dedicated a greater
>effort to do so. How is that unfair?
>
>If I thought one of my changes could benefit the community at large, I
>would approach the maintainers and suggest it. If they disagreed with my
>view, I could publish the code and could still share it with anyone
>willing to run it.
>
Exactly... and you can share those changes freely in melpa instead of
keeping them to you if you don't have a copyright, the changes are small
or just someone in your team don't want to register a copyright for any
reason, your package is in an initial state or for very specific uses;
your boss does don't give you a disclaim for your code, or you just want
to share your changes with the hope that someone in the future improve
what you did or find your idea useful in a more informal way.

That's the freedom that many users find in melpa over elpa. (like AUR in
arch linux). Share what they did freely without compromise and probably
get improves and feedback from the community without asking who are you
or if you have a copyright document or feeling the responsibility to
maintain the package in the future.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:58                                             ` Thibaut Verron
@ 2020-10-16 15:51                                               ` Alfred M. Szmidt
  2020-10-16 16:10                                                 ` Thibaut Verron
  2020-10-17  4:20                                               ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-16 15:51 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, rms, bugs, dgutov

   > > And picking on 2-3 "ideologically impure" packages (out of several
   > > thousands!) that are distributed on MELPA is counter-productive.
   >
   > We could turn this argument around and ask why the developers who
   > maintain MELPA don't remove `2-3' packages that promote non-free
   > software.

   I sincerely hope it doesn't happen. 

We should all hope that it does, since such software is bad, one way
that is being done is with the non-GNU ELPA archive.

   Also, is the goal of the GNU project to deny users the right to run
   the software they want or need? Or is it to give them a choice of
   free options to replace non-free software?

The goal of the GNU project is to replace all non-free sofware, since
any non-free software is unjust.  That means, we do not want to
recommend users to install any kind of non-free software.

This isn't the same thing as prohibiting users what they can do on
their own accord, but rather that the project goal is to eliminate an
injustice being done to all computer users.  And with that means that
we do not want to do anything that would work against our goals.

   Having those packages removed would make it more difficult to use
   non-free software, but it would do nothing to improve the power of
   free software.

That may be so, but recommending users to use non-free software would
be worse -- it would be immoral and unethical.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 12:17                                     ` Dmitry Gutov
  2020-10-16 13:45                                       ` Marcel Ventosa
  2020-10-16 13:57                                       ` Ergus
@ 2020-10-16 16:09                                       ` Alfred M. Szmidt
  2 siblings, 0 replies; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-16 16:09 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: mve1, bugs, rms, thibaut.verron, emacs-devel

   When a survey purposefully omits a well-known and popular option, it is 
   going to discount a sizable portion of our community, and ignore a 
   project that has done a lot to popularize Emacs over the years.

Only that wasn't what was being suggested, rather there where two
solution purposed to solve that issue (either freeform text, or a
disclaimer about why MELPA isn't recommended).

And just because a different project popularizes a GNU project,
doesn't mean that it must automatically be supported -- specially if
there are ethical and moral reasons to not.

   I think it's both insulting to its developers, and stinks of thought 
   police. Far from the idea of user freedom I hope to expect from GNU and FSF.

What users do, and what the GNU or the FSF does are quite different
things -- the GNU project and the FSF try to protect that users have
the freedom, with that comes a responsibility to users to not point
them towards software that is non-free.  What users do, is up to them.

That is neither insulting, or being thought police -- the GNU project
has a specific goal, somethings are simply not related to it, or
against it.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 15:51                                               ` Alfred M. Szmidt
@ 2020-10-16 16:10                                                 ` Thibaut Verron
  2020-10-16 16:16                                                   ` Alfred M. Szmidt
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 16:10 UTC (permalink / raw)
  To: Alfred M. Szmidt
  Cc: Marcel Ventosa, emacs-devel, Richard Stallman, Jean Louis,
	Dmitry Gutov

Le ven. 16 oct. 2020 à 17:51, Alfred M. Szmidt <ams@gnu.org> a écrit :
>
>    > > And picking on 2-3 "ideologically impure" packages (out of several
>    > > thousands!) that are distributed on MELPA is counter-productive.
>    >
>    > We could turn this argument around and ask why the developers who
>    > maintain MELPA don't remove `2-3' packages that promote non-free
>    > software.
>
>    I sincerely hope it doesn't happen.
>
> We should all hope that it does, since such software is bad, one way
> that is being done is with the non-GNU ELPA archive.

I hope that once the non-GNU Elpa archive exists, those non-free
packages will still live on Melpa, and will die their just death,
once, and not before, a free alternative exists.

>
>    Also, is the goal of the GNU project to deny users the right to run
>    the software they want or need? Or is it to give them a choice of
>    free options to replace non-free software?
>
> The goal of the GNU project is to replace all non-free sofware, since
> any non-free software is unjust.  That means, we do not want to
> recommend users to install any kind of non-free software.
>
> This isn't the same thing as prohibiting users what they can do on
> their own accord, but rather that the project goal is to eliminate an
> injustice being done to all computer users.  And with that means that
> we do not want to do anything that would work against our goals.

The message I was answering to suggested asking the maintainers of
Melpa to remove some packages.

This is not about what the FSF and the GNU project do or don't do, or
even recommend, this is about telling an Emacs user what to put in
their privately maintained repository.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 16:10                                                 ` Thibaut Verron
@ 2020-10-16 16:16                                                   ` Alfred M. Szmidt
  2020-10-16 16:32                                                     ` Thibaut Verron
  0 siblings, 1 reply; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-16 16:16 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, rms, bugs, dgutov

Asking to for non-free software to be removed is a laudable thing to
do and it is something I hope more people will do, but it is not
telling someone what they should or shouldn't do.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 16:16                                                   ` Alfred M. Szmidt
@ 2020-10-16 16:32                                                     ` Thibaut Verron
  2020-10-16 16:50                                                       ` Alfred M. Szmidt
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 16:32 UTC (permalink / raw)
  To: Alfred M. Szmidt
  Cc: Marcel Ventosa, emacs-devel, Richard Stallman, Jean Louis,
	Dmitry Gutov

Le ven. 16 oct. 2020 à 18:16, Alfred M. Szmidt <ams@gnu.org> a écrit :
>
> Asking to for non-free software to be removed is a laudable thing to
> do and it is something I hope more people will do, but it is not
> telling someone what they should or shouldn't do.

Would you mind clarifying the difference between the two? As it is,
your message reads like doublethink to me.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-16  6:02                           ` Marcel Ventosa
  2020-10-16  6:52                             ` Thibaut Verron
@ 2020-10-16 16:33                             ` Jean Louis
  2020-10-16 18:09                               ` Dmitry Gutov
  2020-10-17  2:59                               ` Marcel Ventosa
  2020-10-18  4:10                             ` Richard Stallman
  2 siblings, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 16:33 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Richard Stallman, thibaut.verron, emacs-devel

* Marcel Ventosa <mve1@runbox.com> [2020-10-16 09:03]:
> On Thu, 15 Oct 2020 23:59:07 -0400
> Richard Stallman <rms@gnu.org> wrote:
> 
> > I hope that only a minority of Emacs users know about MELPA, and I'd
> > rather not inform the rest about it.  But if something is going to
> > inform them anyway, it is better to do it with a denunciation.
> 
> 
> I've been using Emacs (and MELPA) for the best part of a decade and
> knew nothing about this! I'm concerned to use only free software and
> actively avoid proprietary software, so this is a bit of a shock.
> 
> Is there anywhere I can read more about this issue?

I have not checked all the software on MELPA, but due to Github
policies that free (of charge)repositories should have only free (as
in liberty)software licenses, I am assuming that probably none of
those software is non-free. But there can be MELPA software that is
vague because maybe maintainers have not put the proper license, which
is often the case.

The software provided by MELPA may lead users to non-free software or
may control non-free software or be made exclusively for usage of free
software.

Example that I have found is ChatWork package, it works with ChatWork
chat software, for which I only assume it is proprietary, I have not
checked it very good, it seemed to be so from verification of their
website.

Corporations can very easily sponsor somebody to provide software for
Emacs to provide features that control or interact with their
proprietary software.

It is also method of advertising.

Then there is software to access various websites, let us say software
that provides quotes from specific website, it could be funny quote or
smart one, but maybe the purpose is simply advertising. Finally,
fetching something from other website I consider dangerous, package
itself need not be, but other packages following, could be easily
dangerous.

More danger from MELPA comes from the fact that MELPA is not verifying
the packages, not that I know, I have read they said they are not
doing it.

There is plethora of insecurities on MELPA. It is far from harmless.

So far I understood, the packages arriving to GNU ELPA are assigned
with copyright to FSF, I am also assuming as user that such packages
are somehow reviewed by developers, not just one developer, and that
they are placed into ELPA as duplicate or copy from the upstream. I
may be wrong in all that assumption, but I think that GNU ELPA
packages are verified for freedom and mostly for security and safety
of users. We are speaking of loading true programming language code
and executing such on users' computers.

It is not equivalent to Javascript, it is far more dangerous than
Javascript which tend to execute in safe environment, which tends to
execute in such way as not to abuse users' computers and data, yet
people have found ways to crack browsers and to crack and enter into
users' file systems, there are many ways how Javascript can be
malicious.

The more packages there are that are not verified, but simple offered
for download through MELPA, the more and more insecurities are coming
in future.

MELPA is allowing Google to track users by using Google Analytics on
their website, that speaks already about the webmaster's lack of
skills in managing the website. There are so many free software
programs for web statistics, and there is no need for third party
tracking.

Now, the real insecurity comes from program that are sourced from
Github. If there are 4000+ packages, there can be 1000+ authors, maybe
even 2000+ authors.

Each of those authors represent insecurity to computing, as their
packages are not verified each time they are pulled, they are blindly
trusted.

The blind trust to MELPA packages is what is making it highly insecure
for computer users.

It requires just 1 author for their accounts to be cracked and for
malicious code to be inserted, thousands of computer users can be
affected that way.

Finally, author can go nut himself, and can become psychotic, there
are programmers who became so, they can introduce malicious code
themselves, or can do it by claiming it was somebody else.

Packages that I think do not belong in free software repository for
reason they are using proprietary information or wrapping proprietary
software, or use known spying networks:

babel - that uses non-free Babelfish translations (if I am mistaken
tell me)

chatwork - that uses non-free ChatWork proprietary chat software

bing-dict - that uses Microsoft Bing proprietary dictionary

calfw-gcal - to edit Google calendar

Obviously I came to letter C, I could browse more and find more
troublesome packages.

Yet major insecurity is number of packages where they are not verified
by human to be safe and blind offering and blind acceptance by users
thinking they are safe.

Jean






^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 16:32                                                     ` Thibaut Verron
@ 2020-10-16 16:50                                                       ` Alfred M. Szmidt
  2020-10-16 17:16                                                         ` Thibaut Verron
  0 siblings, 1 reply; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-16 16:50 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, rms, bugs, dgutov

   > Asking to for non-free software to be removed is a laudable thing to
   > do and it is something I hope more people will do, but it is not
   > telling someone what they should or shouldn't do.

   Would you mind clarifying the difference between the two? 

Could you please get me a cup of tea?

I want a cup of tea, get me one.

Is there anyone who wants to implement frobnitz in Emacs?

You must implement frobnitz in Emacs otherwise we will start using vi.

   As it is, your message reads like doublethink to me.

That is unfriendly to say the least.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  6:52                             ` Thibaut Verron
  2020-10-16  7:24                               ` Marcel Ventosa
@ 2020-10-16 17:04                               ` Jean Louis
  2020-10-16 17:39                                 ` Vasilij Schneidermann
  2020-10-18  4:09                               ` Richard Stallman
  2 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-16 17:04 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Marcel Ventosa, Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-16 09:53]:
> Le ven. 16 oct. 2020 à 08:03, Marcel Ventosa <mve1@runbox.com> a écrit :
> >
> > On Thu, 15 Oct 2020 23:59:07 -0400
> > Richard Stallman <rms@gnu.org> wrote:
> >
> > > I hope that only a minority of Emacs users know about MELPA, and I'd
> > > rather not inform the rest about it.  But if something is going to
> > > inform them anyway, it is better to do it with a denunciation.
> >
> >
> > I've been using Emacs (and MELPA) for the best part of a decade and
> > knew nothing about this! I'm concerned to use only free software and
> > actively avoid proprietary software, so this is a bit of a shock.
> 
> As I understand it, Melpa packages cannot *be* or *install* non-free
> software. But some will not work without such software, which can in
> theory encourage users to install it.

MELPA as such is definitely free software project with few freedom
issues with some pakages and lax attitude on usage of proprietary
information through Emacs. For example, I like that when I find
definition in a dictionary, that I can freely include it in the
instruction book, and not that I am chased with licenses not allowing
me to include such information.

MELPA does have a checklist for packages:

Checklist

Please confirm with x:

    The package is released under a GPL-Compatible Free Software License.
    [x ] I've read CONTRIBUTING.org
    [ x] I've used the latest version of package-lint to check for packaging issues, and addressed its feedback
    [ x] My elisp byte-compiles cleanly
    [ x] M-x checkdoc is happy with my docstrings
    [ x] I've built and installed the package using the instructions in CONTRIBUTING.org
    I have confirmed some of these without doing them

Example:
https://github.com/melpa/melpa/pull/6387

People and MELPA maintainer are verifying packages, but they do not
possibly verify it each time. So it is prone to security issues at any
time. Once package is accepted, they are not automatically verifying
the package, so far I understand, packages are built in real time and
offered to users in real time.

Any account can be cracked and malicious code introduced at any
time.

Github is in general unsafe place for development as it is held by
major company providing proprietary software, one never knows what are
they up to.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  7:24                               ` Marcel Ventosa
  2020-10-16  7:53                                 ` Thibaut Verron
@ 2020-10-16 17:08                                 ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 17:08 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Richard Stallman, Thibaut Verron, emacs-devel

* Marcel Ventosa <mve1@runbox.com> [2020-10-16 10:24]:
> I understand, thanks for the explanation. In that case, I think I'm
> well informed enough to have avoived the dangers. I wonder how many
> people are not. AFAIK, both Trisquel and Parabola keep out packages
> that recommend or encourage proprietary software, which seems essential
> to protect users' freedom.

Which packages?

Please report the issues in their issue trackers. Both of them are
removing anything like that, that is what I know.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 16:50                                                       ` Alfred M. Szmidt
@ 2020-10-16 17:16                                                         ` Thibaut Verron
  2020-10-16 17:32                                                           ` Alfred M. Szmidt
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 17:16 UTC (permalink / raw)
  To: Alfred M. Szmidt
  Cc: mve1, emacs-devel, Richard Stallman, Jean Louis, Dmitry Gutov

Le ven. 16 oct. 2020 à 18:50, Alfred M. Szmidt <ams@gnu.org> a écrit :
>
>    > Asking to for non-free software to be removed is a laudable thing to
>    > do and it is something I hope more people will do, but it is not
>    > telling someone what they should or shouldn't do.
>
>    Would you mind clarifying the difference between the two?
>
> Could you please get me a cup of tea?
>
> I want a cup of tea, get me one.
>
> Is there anyone who wants to implement frobnitz in Emacs?
>
> You must implement frobnitz in Emacs otherwise we will start using vi.

So the difference is to say "please" and be polite when we ask them to
remove some packages?

What if they say no? Does it change our opinion of them?

> >    As it is, your message reads like doublethink to me.
> That is unfriendly to say the least.

I regret my choice of words, my intention was not to be offensive.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  8:25                                   ` Marcel Ventosa
  2020-10-16 12:17                                     ` Dmitry Gutov
@ 2020-10-16 17:29                                     ` Jean Louis
  2020-10-16 19:11                                       ` Thibaut Verron
  2020-10-17  4:22                                     ` Richard Stallman
  2 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-16 17:29 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Richard Stallman, Thibaut Verron, emacs-devel

* Marcel Ventosa <mve1@runbox.com> [2020-10-16 11:25]:
> I understand your point, and transitional solutions may indeed be a good
> thing (though they can lead both ways). However, it's a long-standing
> position of GNU not to be seen to endorse these compromises, whether or
> not their existence is a good thing. For me, the name GNU has always
> signified a free software safe haven. The idea that one might be misled
> into installing proprietary software because of well earned trust in GNU
> should be avoided at all costs.

That is right.

> I would posit the same if I was a member of a vegan organization that
> was relaxing their views on eating animals to ease the transition. While
> there is little doubt transitions can be beneficial, the vegan
> organization should not confuse it's tenets.

That is right, some organization lose their purpose or deviate it.

GNU project never deviates its purpose and is in that sense without compromises.

> Perhaps. Transitional solutions go both ways though. A cursory
> glance at Reddit's Emacs group is enough to notice not only
> ignorance of the philosophy behind GNU, but quite recurrent mockery
> of what it stands for. Usually in the form of deriding RMS. For the
> most recent example, one user comments under abrochard's survey
> post: "So, will you be censoring the survey to maintain ideological
> purity, like rms insisted?", to which abrochard responds: "I agree
> with you. The discussion around Melpa is a big factor as to why the
> survey is happening in parallel to the gnu project."

That is right, there is some mockery of free software philosophy,
especially on IRC #emacs channel, that is very sad state that
intelligent people cannot recognize they are being very rude, it is
type of opression taking place on official GNU communication lines, as
long as #emacs channel on IRC is considered official, that I do not
know. Reddit is not.

> Yes, I see it as a problem when an unofficial offshoot of a project does
> not make it crystal clear that it is so.

It is very easy to clone MELPA, to build packages, to exclude list of
packages and to have your own ELPA locally installed, or to offer such
on Internet for others, in a fixed mode, not continually built
mode. It requires review, and collaboration of many developers to make
it safe and secure for others.

> In fact, and on the same topic, a post was made about the survey
> yesterday on Reddit by Abrochard with the title "The Emacs User
> Survey 2020 will open on Oct 19th," which makes it sound as though
> it were an official survey. Further down the thread, a user
> criticized RMS of trying to censor the survey, mentioning the MELPA
> discussion in particular, to which Abrochard responded: "I agree
> with you. The discussion around Melpa is a big factor as to why the
> survey is happening in parallel to the gnu project."

The Reddit page is hidden propaganda, they said "they contacted
emacs-devel but got no response" which is not true. There were
positive feedbacks overall, and acknowledgment including
acknowledgment by RMS. 

> I'm not saying the obfuscation is purposeful either in the case of
> `MELPA' imitating the name of the existing `GNU ELPA', or of Adrien
> calling his survey *The* Emacs User survey", but what I do think is that
> all non-GNU initiatives that affect perception of GNU, particularly the
> ones that clearly do not share the GNU philosophy (the survey referred
> to `GNU/Linux' as `Linux', for example), would seem much more
> transparent if they were very clearly and visibly labeled as
> unofficial.

If it would be some belief or only philosophy, fine, but it is not. It
is technical term.

Obviously people do not call "Linux" for Android operating system,
neither they call Android GNU because it is not GNU. Yet it runs on
Linux kernel. Also Replicant operating system is not called
GNU/Replicant as it is not GNU, so it is Replicant, operating system
running in Linux kernel.

Linux when published by Linus Torvalds in beginning, there is where he
said that you need GNU for operating system, Linux is only kernel. How
more clearer than that can it be?

Now when somebody says: Archlinux that is derived name, it can be
named of operating system. By the way, Archlinux is promoting
proprietary software without differences, so I cannot recommend it.

Jean




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 17:16                                                         ` Thibaut Verron
@ 2020-10-16 17:32                                                           ` Alfred M. Szmidt
  2020-10-16 17:55                                                             ` Thibaut Verron
  0 siblings, 1 reply; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-16 17:32 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, rms, bugs, dgutov

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1485 bytes --]


   Le ven. 16 oct. 2020 à 18:50, Alfred M. Szmidt <ams@gnu.org> a écrit :
   >
   >    > Asking to for non-free software to be removed is a laudable thing to
   >    > do and it is something I hope more people will do, but it is not
   >    > telling someone what they should or shouldn't do.
   >
   >    Would you mind clarifying the difference between the two?
   >
   > Could you please get me a cup of tea?
   >
   > I want a cup of tea, get me one.
   >
   > Is there anyone who wants to implement frobnitz in Emacs?
   >
   > You must implement frobnitz in Emacs otherwise we will start using vi.

   So the difference is to say "please" and be polite when we ask them to
   remove some packages?

That is the differences between asking someone if they can do
something for you, and giving them an order ... so yes?  

   What if they say no? Does it change our opinion of them?

If someone brings you a cup of tea, or does something for you, don't
you hold them to a slightly higher regard?

And if someone, or a project, removes something that we find
problematic, instead of maybe insisting on keeping it around, don't
you think that also changes the overal perception between the two
parties?

If they say no, then they said no.  Maybe one can convince them of
otherwise, but trying to force their hand would be unkind and unfair.
Just like it is unkind to try and force the GNU project to for example
recommend Melpa in Emacs since it would go against our principles.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 17:04                               ` Jean Louis
@ 2020-10-16 17:39                                 ` Vasilij Schneidermann
  0 siblings, 0 replies; 838+ messages in thread
From: Vasilij Schneidermann @ 2020-10-16 17:39 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 527 bytes --]

> Any account can be cracked and malicious code introduced at any
> time.
> 
> Github is in general unsafe place for development as it is held by
> major company providing proprietary software, one never knows what are
> they up to.

And how is that different for, say, Savannah?  In fact, I'd expect
Github to have a dedicated security team, bug bounties to entice
security researchers into discovering and reporting security issues and
overall better security features for locking down your account, such as
2FA.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 17:32                                                           ` Alfred M. Szmidt
@ 2020-10-16 17:55                                                             ` Thibaut Verron
  2020-10-16 18:16                                                               ` Alfred M. Szmidt
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 17:55 UTC (permalink / raw)
  To: Alfred M. Szmidt
  Cc: mve1, emacs-devel, Richard Stallman, Jean Louis, Dmitry Gutov

Le ven. 16 oct. 2020 à 19:32, Alfred M. Szmidt <ams@gnu.org> a écrit :
>    So the difference is to say "please" and be polite when we ask them to
>    remove some packages?
>
> That is the differences between asking someone if they can do
> something for you, and giving them an order ... so yes?

Okay, with the slight difference that clearly they *can* do it:
removing a package is a trivial action. The question is really whether
they *want* to do it.

> If they say no, then they said no.  Maybe one can convince them of
> otherwise, but trying to force their hand would be unkind and unfair.

Okay, as long as their saying no would not immediately make them as
"bad" as the few packages they refuse to remove.

I still personally do not wish for them to remove those packages, and
I explained why earlier, but that's just me.

> Just like it is unkind to try and force the GNU project to for example
> recommend Melpa in Emacs since it would go against our principles.

As far as I can tell, nobody in this conversation is asking for that.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-16 16:33                             ` MELPA issues - " Jean Louis
@ 2020-10-16 18:09                               ` Dmitry Gutov
  2020-10-16 22:00                                 ` Qiantan Hong
  2020-10-17  2:59                               ` Marcel Ventosa
  1 sibling, 1 reply; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 18:09 UTC (permalink / raw)
  To: Jean Louis, Marcel Ventosa; +Cc: Richard Stallman, thibaut.verron, emacs-devel

On 16.10.2020 19:33, Jean Louis wrote:
> But there can be MELPA software that is
> vague because maybe maintainers have not put the proper license, which
> is often the case.

"GPL compatible license" is among the requirements for inclusion.

It's in their CONTRIBUTING.org, take a look: 
https://raw.githubusercontent.com/melpa/melpa/master/CONTRIBUTING.org



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 17:55                                                             ` Thibaut Verron
@ 2020-10-16 18:16                                                               ` Alfred M. Szmidt
  0 siblings, 0 replies; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-16 18:16 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, rms, bugs, dgutov

   >    So the difference is to say "please" and be polite when we ask them to
   >    remove some packages?
   >
   > That is the differences between asking someone if they can do
   > something for you, and giving them an order ... so yes?

   Okay, with the slight difference that clearly they *can* do it:
   removing a package is a trivial action. The question is really whether
   they *want* to do it.

Indeed.

   > If they say no, then they said no.  Maybe one can convince them of
   > otherwise, but trying to force their hand would be unkind and unfair.

   Okay, as long as their saying no would not immediately make them as
   "bad" as the few packages they refuse to remove.

There is are large difference between calling them, which I am
guessing you mean those who maintain a project, and the actions, or
the situation bad.

   > Just like it is unkind to try and force the GNU project to for example
   > recommend Melpa in Emacs since it would go against our principles.

   As far as I can tell, nobody in this conversation is asking for that.

When the discussion was raised before about a non-GNU ELPA, that was
exactly what being demanded.  And it is what is being demanded by
having an Emacs survey that mentions MELPA for example.  Maybe demand
is slightly strong, but several harsh words have been used in
describing why the GNU project does not wish to do that.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  7:05                           ` Thibaut Verron
  2020-10-16 13:23                             ` Philip K.
@ 2020-10-16 18:46                             ` Jean Louis
  2020-10-17  4:22                             ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 18:46 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-16 10:06]:
> I believe that if the Emacs webpage and manual were to mention Melpa,
> it would inform a lot of users about the potential risks to freedom of
> Melpa, and only inform a few users of the existence of Melpa.

It is alright to file issue at MELPA, to see if they will remedy any
non-free issue.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  7:53                                 ` Thibaut Verron
  2020-10-16  8:25                                   ` Marcel Ventosa
@ 2020-10-16 18:57                                   ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 18:57 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Marcel Ventosa, Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-16 10:54]:
> I personally don't think many users install non-free software because
> they saw it wrapped in a Melpa package.

- helm-lastpass was downloaded 777 times
- lastpass was downloaded 987 times

1 user guided to use non-free software is already many.

- chatwork package was downloaded 1093 times

> Taking the example of emacs-lastpass given above, I don't see how
> anyone would even find this package without searching for it with the
> keyword "lastpass".

They can find it in the list, for majority of packages I did not
search by keyword, I was just downloading, inspecting code for short
time, and trying to use it.

> The audience, rather, is users who are currently using Lastpass in
> their browsers but are interested in bringing some of their online
> activities to Emacs, but rely on their password manager to do so.

That is not based on data, unless you have made opinion poll for that
specific package.

I am really thinking that some of users will download lastpass when
they see there is Emacs package for lastpass

I have been downloading like espeak or festival speech packages, which
are free software, when I have seen there are Emacs packages for
speech, in the same way users will be guided to proprietary software.

MELPA is to ELPA what Archlinux and Debian is to Guix and other free
software distributions. They do not explicitly warn users about
proprietary software, even though I do not think MELPA is letting
non-free software being distributed.

> I absolutely support the fact that Melpa is not activated by default,
> and that there should be a warning about the existence of those
> packages everywhere possible. But I still consider that the value of
> those packages outweigh their dangers, just like the win32 build of
> Emacs.

Proprietary software wrapped is security issue, and largest danger is
lack of security as MELPA is not reviewing software updates, any time
malicious code can be inserted which could affect thousands of users.

Here is example when Gentoo Linux was cracked on Github:
https://nakedsecurity.sophos.com/2018/06/29/linux-distro-hacked-on-github-all-code-considered-compromised/

Here is example when Linux Mint distribution was cracked:
https://www.techrepublic.com/article/why-the-linux-mint-hack-is-an-indicator-of-a-larger-problem/



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:33                                           ` Marcel Ventosa
  2020-10-16 14:58                                             ` Thibaut Verron
  2020-10-16 15:36                                             ` Ergus
@ 2020-10-16 19:08                                             ` Dmitry Gutov
  2020-10-16 19:52                                               ` Jean Louis
                                                                 ` (2 more replies)
  2020-10-16 19:22                                             ` Jean Louis
  3 siblings, 3 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 19:08 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Thibaut Verron, Richard Stallman, Jean Louis, emacs-devel

On 16.10.2020 17:33, Marcel Ventosa wrote:

>> Shutting our eyes to actual user behavior also precludes
>> understanding.
> 
>  From what I just read from Thibaut, a free software compatible solution
> to replace MELPA is underway. Refusing to draw attention to something is
> not "shutting our eyes".

To make a replacement for something, you need to know what something is, 
and why it exists.

>>>> ignore a project that has done a lot to popularize Emacs over the
>>>> years.
>>>
>>> I fail to understand the narrative that pushes popularity over all
>>> else.
>>
>> Strawman.
> 
> I thought your argument was popularity, something that keeps coming up
> in these kinds of discussions. What was your argument?

You made a strawman claiming that I somehow push popularity "over all else".

My argument is that they have done a lot for the community. Some of 
those effects reach the core too.

>> And picking on 2-3 "ideologically impure" packages (out of several
>> thousands!) that are distributed on MELPA is counter-productive.
> 
> We could turn this argument around and ask why the developers who
> maintain MELPA don't remove `2-3' packages that promote non-free
> software. What came first, the GNU Emacs or the MELPA?

No, we couldn't "turn this argument around". Those statements are not 
even remotely on the same level.

Some Emacs maintainers themselves are known to use proprietary software. 
And use Emacs on proprietary OSes. And yet, somehow, MELPA is the odd 
one out?

>> You can't be effective at affecting change anyway, if you don't know
>> what's going on outside.
> 
> Indeed. As I recall, RMS suggested open questions instead of multiple
> choice questions that "shape their behavior". With open questions, there
> is no need to mention MELPA at all in fact. With open questions, the
> insights that could be derived would be much more interesting.

So we won't suggest ELPA as an option either? What about the users who 
don't know the difference? MELPA is also an ELPA, after all (as in 
"Emacs Lisp Package Archive").

>> Didn't Philip show a prototype that didn't use JavaScript?
> 
> That's very good news if the issue has been settled.

It's solvable, let's put it this way.

>>>> it is unfortunate how Emacs leadership does little to follow the
>>>> external, "unofficial" polls.
>>>
>>> What do you mean by this?
>>
>> I don't recall any single change in Emacs' behavior that resulted
>> from an external poll or survey.
> 
> Why should Emacs development be guided by (external) survey results?

Why should it use the scientific method? Why should it pay attention to 
other people, or the world at large? Is that what you're asking?

> I
> would think it should be guided, for the most part, by what the people
> putting their time into it want to create, within the principles of the
> philosophy of the project and its goals.

It's not a painting or a novel. It's a software project, with certain 
expectations of practicality.

> Also, anyone can suggest
> changes and convince the maintainers that these changes are in the best
> interest of the project (and contribute the actual changes if they are
> accepted).

No, not "anyone can convince".

And like I said: no attention to external polls. Which is what you asked 
me to clarify.

> If they are not, Emacs makes it quite simple to implement changes for
> personal "improvements". I have written functions that serve me
> personally and change the behavior of Emacs to suit my needs. There are
> limits to what I can do, which could be pushed if I dedicated a greater
> effort to do so. How is that unfair?

You're veering the discussion off to the side for some reason.

But if we're talking of "unfair", releasing Emacs under GPL, enabling 
such excellent extensibility that multiple communities spring up over 
years, ones brimming with creativity and people dedicating years of 
their spare time to the extensions, and then badmouthing them from afar 
as though they violated some existing contract (social or legal), *that* 
is unfair.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 13:45                                       ` Marcel Ventosa
  2020-10-16 14:04                                         ` Dmitry Gutov
@ 2020-10-16 19:08                                         ` Jean Louis
  2020-10-16 19:47                                           ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-16 19:08 UTC (permalink / raw)
  To: Marcel Ventosa
  Cc: emacs-devel, Richard Stallman, Thibaut Verron, Dmitry Gutov

* Marcel Ventosa <mve1@runbox.com> [2020-10-16 16:45]:
> I've noticed a trend of speaking about Emacs and other free software
> projects as if they were "commodities" and "products," but as I see
> them, it is precisely because they are community driven projects that
> they are not "commodities" or "products".

My opinion is that Emacs is a product, and it is software commodity as
well. Definitions from Wordnet here below like 1. maybe 2, and 5 do
apply, it is product in few definitions. It has been sold for money in
past through GNU project, which is totally alright, and is probably
sold even today, I just don't know where.

If product is community driven, it still remains product. There is
nothing wrong with that word or calling it a product, because it is,
major and significant free software product made by Emacs developers.

* Overview of noun product

The noun product has 6 senses (first 4 from tagged texts)
1. (52) merchandise, ware, product -- (commodities offered for sale; "good business depends on having good merchandise"; "that store offers a variety of products")
2. (25) product, production -- (an artifact that has been created by someone or some process; "they improve their product every year"; "they export most of their agricultural production")
3. (8) product, mathematical product -- (a quantity obtained by multiplication; "the product of 2 and 3 is 6")
4. (2) product -- (a chemical substance formed as a result of a chemical reaction; "a product of lime and nitric acid")
5. product -- (a consequence of someone's efforts or of a particular set of circumstances; "skill is the product of hours of practice"; "his reaction was the product of hunger and fatigue")
6. intersection, product, Cartesian product -- (the set of elements common to two or more sets; "the set of red hats is the intersection of the set of hats and the set of red things")

> > I think it's both insulting to its developers, and stinks of thought 
> > police. Far from the idea of user freedom I hope to expect from
> > GNU and FSF.

It is not important if somebody cals it a product, what is important
is if the distributor or seller provides license with it and gives
same rights to its buyers or users.

> I don't understand how refusing to draw attention to a repository that
> recommends proprietary software turns anyone into the "thought
> police".

It is "proprietary thought police" and there is nothing wrong with
it. Even the thought police will not say there is anything wrong with
thought police. :-p

So when we distribute free software, we tend to speak out against
proprietary software being distributed or promoted together with free
software.

In that sense we are policing various free software repositories and
speaking out publicly against, or denouncing, the inclusion, usage,
and dangers of proprietary software.

So, next time somebody thinks of proprietary software, just remember,
we are watching... slap on fingers.

> In fact, one of the most worrying aspects of this survey idea, as I see
> it, is the suggested use of non-free Javascript to implement it.

Idea about Emacs survey is alright, only that awareness of free
software has yet to arrive to those who initiated the survey, as they
proposed using Google Spreadsheet and similar, which would in fact put
Emacs users at direct risk.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 13:57                                       ` Ergus
  2020-10-16 15:31                                         ` Eli Zaretskii
@ 2020-10-16 19:11                                         ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 19:11 UTC (permalink / raw)
  To: Ergus
  Cc: Marcel Ventosa, emacs-devel, Richard Stallman, Thibaut Verron,
	Dmitry Gutov

* Ergus <spacibba@aol.com> [2020-10-16 16:58]:
> Reject using melpa for ideological reasons means that the users won't
> have alternatives for their work and emacs will become like a useless
> tool for a big part of our community; whitout melpa many users will go
> for more "useful" alternatives that really steal their freedom like
> VSCode or Atom... because they need to have the work done any way.

Not true, it is very easy to replicate MELPA, and publish on a
website, while removing any proprietary wrappers or accessors.

In fact MELPA is free software project, so everybody is free to do it,
all what you need is a standard server software, git, Emacs, web
server, it is quite easy.

Just git clone melpa, make, you will see what is happening, then you
can modify it little and have all proprietary stuff removed.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 17:29                                     ` Jean Louis
@ 2020-10-16 19:11                                       ` Thibaut Verron
  2020-10-16 19:54                                         ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 19:11 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, Richard Stallman, emacs-devel

> The Reddit page is hidden propaganda, they said "they contacted
> emacs-devel but got no response" which is not true.

Where exactly? The exact statement I find is this:

> From there I got a lot of feedback around the set of questions itself but also how to distribute it. You can find the whole thread on the archives under "Proposal for an Emacs User Survey".

That's quite far from "I got no response", so I'm curious as to which
message you refer to.

>
> > I'm not saying the obfuscation is purposeful either in the case of
> > `MELPA' imitating the name of the existing `GNU ELPA', or of Adrien
> > calling his survey *The* Emacs User survey", but what I do think is that
> > all non-GNU initiatives that affect perception of GNU, particularly the
> > ones that clearly do not share the GNU philosophy (the survey referred
> > to `GNU/Linux' as `Linux', for example), would seem much more
> > transparent if they were very clearly and visibly labeled as
> > unofficial.
>
> If it would be some belief or only philosophy, fine, but it is not. It
> is technical term.
>
> Obviously people do not call "Linux" for Android operating system,
> neither they call Android GNU because it is not GNU. Yet it runs on
> Linux kernel. Also Replicant operating system is not called
> GNU/Replicant as it is not GNU, so it is Replicant, operating system
> running in Linux kernel.
>
> Linux when published by Linus Torvalds in beginning, there is where he
> said that you need GNU for operating system, Linux is only kernel. How
> more clearer than that can it be?
>
> Now when somebody says: Archlinux that is derived name, it can be
> named of operating system. By the way, Archlinux is promoting
> proprietary software without differences, so I cannot recommend it.
>
> Jean
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:04                                         ` Dmitry Gutov
  2020-10-16 14:33                                           ` Marcel Ventosa
@ 2020-10-16 19:17                                           ` Jean Louis
  2020-10-16 19:36                                             ` Dmitry Gutov
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-16 19:17 UTC (permalink / raw)
  To: Dmitry Gutov
  Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

* Dmitry Gutov <dgutov@yandex.ru> [2020-10-16 17:04]:
> And picking on 2-3 "ideologically impure" packages (out of several
> thousands!) that are distributed on MELPA is counter-productive.

There are few only until letter C, and I did not finish letter C, so I
guess there are many, number of downloads in thousands, that is pretty
devastating for a repository that is supposed to push free software,
in other words, repository is hypocritical.

Would it be only hypocritical without influencing users, fine, but it
does influence thousands of users and is promoting the download number
of software that guides users to non-free software, so that is how it
becomes not ethical.

You know, in many countries, government is working for people, but
from time to time, they will simply kill someone. You get the idea? Is
it counter productive to complain on few killed?

> > I don't understand how refusing to draw attention to a repository that
> > recommends proprietary software turns anyone into the "thought police".
> 
> It's a *survey*! A survey is supposed to gather insight into what users do,
> and what they need. Not shape their behavior.

Every professional public survey is there to shape their behavior. You
do the survey, you find out what public wants, then you make changes
in such manner to influence public to gather more around you.

All professional surveys are like that. There is nothing wrong with it.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:33                                           ` Marcel Ventosa
                                                               ` (2 preceding siblings ...)
  2020-10-16 19:08                                             ` Dmitry Gutov
@ 2020-10-16 19:22                                             ` Jean Louis
  3 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 19:22 UTC (permalink / raw)
  To: Marcel Ventosa
  Cc: emacs-devel, Richard Stallman, Thibaut Verron, Dmitry Gutov

* Marcel Ventosa <mve1@runbox.com> [2020-10-16 17:33]:
> > I don't recall any single change in Emacs' behavior that resulted
> > from an external poll or survey.
> 
> Why should Emacs development be guided by (external) survey results? I
> would think it should be guided, for the most part, by what the people
> putting their time into it want to create, within the principles of the
> philosophy of the project and its goals. Also, anyone can suggest
> changes and convince the maintainers that these changes are in the best
> interest of the project (and contribute the actual changes if they are
> accepted).

There is nothing wrong for Emacs developers to look into external
survey results, to look into comments people are making around various
websites, or any outside data, it is finally their creation, there is
nothing wrong into looking into survey results, especially if
something useful can be created out of it.

There shall be even a checklist to look for bugs in various GNU/Linux
distributions where users report various bugs, as such could be maybe
overseen if not reported upstream, then to look into whatever data is
available externally, that is all fine.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:17                                           ` Jean Louis
@ 2020-10-16 19:36                                             ` Dmitry Gutov
  2020-10-16 19:43                                               ` Dmitry Gutov
  2020-10-16 20:03                                               ` Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 19:36 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

On 16.10.2020 22:17, Jean Louis wrote:
> * Dmitry Gutov <dgutov@yandex.ru> [2020-10-16 17:04]:
>> And picking on 2-3 "ideologically impure" packages (out of several
>> thousands!) that are distributed on MELPA is counter-productive.
> 
> There are few only until letter C, and I did not finish letter C, so I
> guess there are many, number of downloads in thousands, that is pretty

Not too long ago I went through the first 100 or so most popular 
packages on MELPA (at the request of RMS), and like 2-3 of them 
encouraged or required proprietary software to be installed. Ones near 
the tail of that 100, when sorted by popularity. It's a minor fraction.

> devastating for a repository that is supposed to push free software,
> in other words, repository is hypocritical.

No, it's supposed to _publish_ free software.

> Would it be only hypocritical without influencing users, fine, but it
> does influence thousands of users and is promoting the download number
> of software that guides users to non-free software, so that is how it
> becomes not ethical.

Some time ago I read an essay about infighting in the political left 
community. How a lot of members choose to find and attack progressively 
personal character faults in their fellow activists, instead of working 
together and presenting a united front against the capitalist oppressors.

You can draw an easy parallel to the software community and the struggle 
vs proprietary software.

> You know, in many countries, government is working for people, but
> from time to time, they will simply kill someone. You get the idea? Is
> it counter productive to complain on few killed?

It's counter-productive to quarrel with your neighbor about unmowed 
lawns or whatever when the government is doing the killing.

>>> I don't understand how refusing to draw attention to a repository that
>>> recommends proprietary software turns anyone into the "thought police".
>>
>> It's a *survey*! A survey is supposed to gather insight into what users do,
>> and what they need. Not shape their behavior.
> 
> Every professional public survey is there to shape their behavior. You
> do the survey, you find out what public wants, then you make changes
> in such manner to influence public to gather more around you.

That's what I said.

But it doesn't work as well if the survey is biased from the outset.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:36                                             ` Dmitry Gutov
@ 2020-10-16 19:43                                               ` Dmitry Gutov
  2020-10-16 20:03                                               ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 19:43 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

Sorry,

On 16.10.2020 22:36, Dmitry Gutov wrote:
> Not too long ago I went through the first 100 or so most popular 
                                             ^ 1000
> packages on MELPA




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-16 19:08                                         ` Jean Louis
@ 2020-10-16 19:47                                           ` Drew Adams
  2020-10-16 20:15                                             ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-10-16 19:47 UTC (permalink / raw)
  To: Jean Louis, Marcel Ventosa
  Cc: Dmitry Gutov, Richard Stallman, Thibaut Verron, emacs-devel

> My opinion is that Emacs is a product,

Certainly.  It is produced, by labor.  It doesn't
fall from the sky.

> and it is software commodity as well. 

No, not really.  A commodity is something that's
produced for sale.

And a common connation of "commodity" is something
that is run-of-the-mill, as opposed to specially
produced (even if for sale).

> It has been sold for money in past through GNU
> project, which is totally alright, and is probably
> sold even today, I just don't know where.

GNU Emacs is not produced for sale, and it's not,
in general, sold.  Generally, it's not a commodity.

If someone sells GNU Emacs then yes, in that case
it could be said to be a commodity.

But as a general characterization that's not true:
Emacs is not produced for sale.  That's not why
it's produced, and selling it is not typical.

In particular, because in its usual form it's also
provided for free (no sale).  If someone sells it,
they likely sell some specialized version of it,
or they sell something else along with it, such as
support services.

Citing synonyms for "product" doesn't suffice, as
a product can be, and most often is (in a market
society), a commodity.

Synonyms describe usage, and they're often given
liberally, intended to include more than draw
distinctions.  Why?  Because people often look to
a thesaurus for a word that means something similar.
Often they're looking for a given word that they
can't quite think of.  Whether the word they're
looking for really means the same thing, or very
close to it, doesn't always matter.  The point is
to help them find that related word.

One shouldn't look to a thesaurus imagining that
a list of synonyms it provides are really exact
synonyms, or even very close.

(And no two words are ever precisely synonymous.
Every word has its own connotations.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:08                                             ` Dmitry Gutov
@ 2020-10-16 19:52                                               ` Jean Louis
  2020-10-16 20:16                                                 ` Dmitry Gutov
  2020-10-16 20:17                                               ` Alfred M. Szmidt
  2020-10-17 11:40                                               ` Marcel Ventosa
  2 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-16 19:52 UTC (permalink / raw)
  To: Dmitry Gutov
  Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

* Dmitry Gutov <dgutov@yandex.ru> [2020-10-16 22:08]:
> My argument is that they have done a lot for the community. Some of
> those effects reach the core too.

That is right, and that still does not mean it is good to endorse
MELPA as free software repository as it is for reasons of those
packages in question, dangerous for users, as proprietary software in
itself is dangerous.

It may sound not logical, but contributions are welcome from anybody,
and denunciation is good tool to point out to users that GNU and also
FSF is not endorsing the non-free software distributions, and also
non-free software repositories.

> Some Emacs maintainers themselves are known to use proprietary
> software. And use Emacs on proprietary OSes. And yet, somehow, MELPA
> is the odd one out?

Everybody is welcome to contribute to GNU.

GNU policies do not mind if developers use proprietary software or
operating systems, that is how free software entered proprietary
operating systems.

It does not matter if Emacs maintainers are themselves using
proprietary software as they do not necessarily push or set the
policies for the overall GNU project.

In any case, everybody is welcome to contribute in creation and
maintenance of free software operating systems and its parts.

Denunciation would not discriminate between Emacs developers or non
Emacs developers, but it would speaking out against publicly
distribution of software that purports to be free, but its sole
purpose was to run proprietary software or to interact with non-free
software or interacting with proprietary Services as Software
Substitutes: http://www.gnu.org/philosophy/who-does-that-server-really-serve.html

Add your useful voice to Github issue on MELPA, to remove such
software packages that wrap proprietary: https://github.com/melpa/melpa/issues/7185

> > Why should Emacs development be guided by (external) survey results?
> 
> Why should it use the scientific method?

I think it is far from being scientific. Those few people proposed it
who do not have any experience in making a survey. If one has
experience, one is not making any questions, one just do it. Finally,
it was not a professional opinion poll agency.

> > Also, anyone can suggest changes and convince the maintainers that
> > these changes are in the best interest of the project (and
> > contribute the actual changes if they are accepted).
> 
> No, not "anyone can convince".

Just {M-x report-emacs-bug} and they will not ask you for name, birth
day, developers will look into the bug report, or suggestion
improvement, it is a group decision.

If you have something to propose, you are free, and anybody is free,
it is so far I know, not even a subscription mailing list, people can
write to mailing list without being subscribed, great thing.

There are other mailing lists like help-gnu-emacs, also very friendly.

I am only sorry for #emacs IRC channel being unfriendly especially
towards free software movement at times, but that is due to few who do
their personal hate promotion, or have nothing better to do in life,
or simply work for proprietary software and hate themselves.

> > If they are not, Emacs makes it quite simple to implement changes for
> > personal "improvements". I have written functions that serve me
> > personally and change the behavior of Emacs to suit my needs. There are
> > limits to what I can do, which could be pushed if I dedicated a greater
> > effort to do so. How is that unfair?
> 
> You're veering the discussion off to the side for some reason.
> 
> But if we're talking of "unfair", releasing Emacs under GPL, enabling such
> excellent extensibility that multiple communities spring up over years, ones
> brimming with creativity and people dedicating years of their spare time to
> the extensions, and then badmouthing them from afar as though they violated
> some existing contract (social or legal), *that* is unfair.

Everybody is free to make proprietary software by using Emacs Lisp and
run it with Emacs Lisp. So people are also free to sell such
proprietary software. GNU is not supporting those communities.

Similarly, packages can be made solely for purpose of running
proprietary software or interacting with such, or interacting with
Service as a Software Substitute, or fetching some proprietary
information. When such software is promoted on supposedly free
software repository, and free software repository has no clear policy
on protecting users' freedom, then it is appropriate to speak out
against it.

There is maybe no written contract, yet there is unspoken
understanding that if person is releasing free software such as Emacs
package that such should not use proprietary software, as that defeats
the purpose.

- Hey brother... I made here one spectacular Emacs package.

- wow, great, I hope you have free software license, that I can use it
  too.

- sure it has free software license, fine GPL terms here inside

- alright, give me that I try

- sure, here it is, to run this software you only need to download
  the proprietary LastPass, then it will work

- oh, is that so? And what does LastPass do to my computer? Do they
  track me? Read my information? Read my passwords?





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:11                                       ` Thibaut Verron
@ 2020-10-16 19:54                                         ` Jean Louis
  2020-10-16 20:20                                           ` Thibaut Verron
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-16 19:54 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Marcel Ventosa, Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-16 22:12]:
> > The Reddit page is hidden propaganda, they said "they contacted
> > emacs-devel but got no response" which is not true.
> 
> Where exactly? The exact statement I find is this:
> 
> > From there I got a lot of feedback around the set of questions itself but also how to distribute it. You can find the whole thread on the archives under "Proposal for an Emacs User Survey".
> 
> That's quite far from "I got no response", so I'm curious as to which
> message you refer to.

https://www.reddit.com/r/emacs/comments/j6x7ad/proposal_for_an_emacs_user_survey/g820ywv/?utm_source=reddit&utm_medium=web2x&context=3




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:36                                             ` Dmitry Gutov
  2020-10-16 19:43                                               ` Dmitry Gutov
@ 2020-10-16 20:03                                               ` Jean Louis
  2020-10-16 20:29                                                 ` Thibaut Verron
  2020-10-16 21:10                                                 ` Dmitry Gutov
  1 sibling, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 20:03 UTC (permalink / raw)
  To: Dmitry Gutov
  Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

* Dmitry Gutov <dgutov@yandex.ru> [2020-10-16 22:37]:
> > devastating for a repository that is supposed to push free software,
> > in other words, repository is hypocritical.
> 
> No, it's supposed to _publish_ free software.

Alright, I just think of policies.

Imagine if free software repository would publish only software that
wraps around proprietary software, would that be free? So it is matter
of policy.

For same reaso Debian GNU/Linux cannot be said to be free, at many
pages they guide users to include non-free software, unspoken from
Archlinux or other distributions.

So it is just matter of endorsement.

> > Would it be only hypocritical without influencing users, fine, but it
> > does influence thousands of users and is promoting the download number
> > of software that guides users to non-free software, so that is how it
> > becomes not ethical.
> 
> Some time ago I read an essay about infighting in the political left
> community. How a lot of members choose to find and attack progressively
> personal character faults in their fellow activists, instead of working
> together and presenting a united front against the capitalist oppressors.
> 
> You can draw an easy parallel to the software community and the struggle vs
> proprietary software.

That question is best answered here:
https://github.com/melpa/melpa/issues/7185

So that is request to remove those packages and to make a policy not
to include such, that is best way to raise the issue and see if we are
truly together in free software promotion.

> But it doesn't work as well if the survey is biased from the outset.

But survey is "biased" (opinionated) from beginning, it was not published on
emacs-devel initially, it was published on Reddit initially and I am
sure there are reasons for initiator for the survey, those reasons may
be that whay you call biased, I call it opinions, but not necessarily
unjust opinions (biased).

It is better to say opinionated. Again I see nothing wrong against
opinionated surveys as what Emacs teaches its users it to become
opinionated, they constantly try to improve their configurations,
themese, etc.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:47                                           ` Drew Adams
@ 2020-10-16 20:15                                             ` Jean Louis
  2020-10-16 20:59                                               ` Drew Adams
  2020-10-17  4:19                                               ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 20:15 UTC (permalink / raw)
  To: Drew Adams
  Cc: Marcel Ventosa, Dmitry Gutov, Richard Stallman, Thibaut Verron,
	emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-16 22:48]:
> > and it is software commodity as well. 
> 
> No, not really.  A commodity is something that's
> produced for sale.

Emacs have been sold and can be sold today, thus it is commodity by
definition.

> And a common connation of "commodity" is something
> that is run-of-the-mill, as opposed to specially
> produced (even if for sale).
> 
> > It has been sold for money in past through GNU
> > project, which is totally alright, and is probably
> > sold even today, I just don't know where.
> 
> GNU Emacs is not produced for sale, and it's not,
> in general, sold.  Generally, it's not a commodity.
> 
> If someone sells GNU Emacs then yes, in that case
> it could be said to be a commodity.
> 
> But as a general characterization that's not true:
> Emacs is not produced for sale.  That's not why
> it's produced, and selling it is not typical.

Read:
https://www.gnu.org/bulletins/bull24.html

If it is typical or not, it was sold and can be sold any time now,
there is no problem selling it, so it is still commodity.

> In particular, because in its usual form it's also provided for free
> (no sale).  If someone sells it, they likely sell some specialized
> version of it, or they sell something else along with it, such as
> support services.

Commodity is if traded, so you say, you cannot possibly know who sold
it and how many times, and how. So it is impossible to say "it is not
commodity" as "it is not sold" as you cannot oversee the planet.

In fact it is sold on many GNU/Linux distributions, it is bundled in
the GNU/Linux operating systems and sold through commercial
distributions, including sold as part of pre-installed systems.

When a customer purchases notebook with Windows, customer is in the
same time indirectly getting the commodity named Windows, even though
did not get any receipt for Windows, but for the notebook (depending
of the shop and country). That does not make Windows less commodity in
its term.

GNU Emacs is pre-installed on many computers, and such installation
require some time, effort, money spent for employees, DVDs, Internet,
very similar to installation of proprietary software. Customer need
not pay directly for the GNU/Linux distribution, but is paying
indirectly.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:52                                               ` Jean Louis
@ 2020-10-16 20:16                                                 ` Dmitry Gutov
  0 siblings, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 20:16 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

On 16.10.2020 22:52, Jean Louis wrote:
> - sure, here it is, to run this software you only need to download
>    the proprietary LastPass, then it will work

I never said we should applaud individual packages like this.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:08                                             ` Dmitry Gutov
  2020-10-16 19:52                                               ` Jean Louis
@ 2020-10-16 20:17                                               ` Alfred M. Szmidt
  2020-10-17 11:40                                               ` Marcel Ventosa
  2 siblings, 0 replies; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-16 20:17 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: mve1, thibaut.verron, rms, bugs, emacs-devel

When recommending someone to use Emacs, one is recommending free
software, but when one recommends a package repository that can
contain non-free software or software that depends on non-free
software, then one could end up promoting non-free software -- at
which point it is simpler to simply not refer to such repositories.

(standards) References has a good section on it.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:54                                         ` Jean Louis
@ 2020-10-16 20:20                                           ` Thibaut Verron
  0 siblings, 0 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 20:20 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, Richard Stallman, emacs-devel

Le ven. 16 oct. 2020 à 21:54, Jean Louis <bugs@gnu.support> a écrit :
>
> * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-16 22:12]:
> > > The Reddit page is hidden propaganda, they said "they contacted
> > > emacs-devel but got no response" which is not true.
> >
> > Where exactly? The exact statement I find is this:
> >
> > > From there I got a lot of feedback around the set of questions itself but also how to distribute it. You can find the whole thread on the archives under "Proposal for an Emacs User Survey".
> >
> > That's quite far from "I got no response", so I'm curious as to which
> > message you refer to.
>
> https://www.reddit.com/r/emacs/comments/j6x7ad/proposal_for_an_emacs_user_survey/g820ywv/?utm_source=reddit&utm_medium=web2x&context=3

I see, thanks. I was not looking for the correct thread or the correct
user. In any case, I believe that it refers to the suggestion he
posted below the remark, and not about the present survey suggestion:

> :How about creating a new function that generates a report of how a user has configured emacs. Various options, global-minor-modes, faces, etc, similar to what report-emacs-bug generates. Setup a separate email address to receive reports and automatically tabulate what the popular settings are."

I have not seen that thread, so I don't know can't comment about
whether they got responses or not.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 20:03                                               ` Jean Louis
@ 2020-10-16 20:29                                                 ` Thibaut Verron
  2020-10-16 20:40                                                   ` Jean Louis
  2020-10-17  4:19                                                   ` Richard Stallman
  2020-10-16 21:10                                                 ` Dmitry Gutov
  1 sibling, 2 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-16 20:29 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, emacs-devel, Richard Stallman, Dmitry Gutov

> Alright, I just think of policies.
>
> Imagine if free software repository would publish only software that
> wraps around proprietary software, would that be free? So it is matter
> of policy.

Incidentally, if Melpa agrees to your request to remove all packages
wrapping around proprietary software, it will be a matter of days
before such a repository appears.

And yes, it would be free, in my opinion. Because users are free to
use Emacs in whichever way they want, including in workflows involving
non-free software.

> For same reaso Debian GNU/Linux cannot be said to be free, at many
> pages they guide users to include non-free software, unspoken from
> Archlinux or other distributions.

This is, again, a matter of opinion.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 20:29                                                 ` Thibaut Verron
@ 2020-10-16 20:40                                                   ` Jean Louis
  2020-10-17  4:19                                                   ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 20:40 UTC (permalink / raw)
  To: Thibaut Verron
  Cc: Marcel Ventosa, emacs-devel, Richard Stallman, Dmitry Gutov

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-16 23:30]:
> > For same reaso Debian GNU/Linux cannot be said to be free, at many
> > pages they guide users to include non-free software, unspoken from
> > Archlinux or other distributions.
> 
> This is, again, a matter of opinion.

It may be "user repository" but it is still advertised through
Archlinux:
https://aur.archlinux.org/packages/?K=proprietary&SB=

It is hypocritical to say that one repository link or directory is
official and other one is not official, of both of them are
distributed from the same official domain "archlinux.org"

See here:
https://bbs.archlinux.org/viewtopic.php?pid=1924794#p1924794

> Arch does believe in free software -- we provide a free software operating system which doesn't depend on proprietary software to run. Any (well, most) Linux operating system could do that.
> We *also* believe people have the right to use proprietary software addons if they want to, and in some cases we make it exceedingly easy for them to opt in.

> All we care about is that we have written permission from the proprietary owners to do so, and we distribute these in /usr/share/licenses/ along with marking the package as possessing a "custom" license:
> https://github.com/archlinux/svntogit-c … ISSION.eml
> https://github.com/archlinux/svntogit-c … ibute.mbox

Now for Debian:

https://duckduckgo.com/?q=site%3Adebian.org+enable+non-free&t=ffab&ia=web

Quote from some of links:

> "Make sure to enable contrib and non-free in the /etc/apt/sources.list line"

> "In some cases the installer detects the need for non-free firmware
> and prompts the user to make the firmware available to the installer
> to complete the installation. This can happen, for example, with
> wireless network cards which often require non-free firmware to
> function"

> "First you have to enable the non-free repository in APT's
> sources.list file: see Section 6.1, "Filling in the sources.list File"
> for details about this file. Many firmware are proprietary and are
> thus located in this repository."

Debian directly instructs users to enable non-free repositories.

So that opinion of mine is quite factual.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-16 20:15                                             ` Jean Louis
@ 2020-10-16 20:59                                               ` Drew Adams
  2020-10-16 21:50                                                 ` Jean Louis
  2020-10-17  4:19                                                 ` Richard Stallman
  2020-10-17  4:19                                               ` Richard Stallman
  1 sibling, 2 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-16 20:59 UTC (permalink / raw)
  To: Jean Louis
  Cc: Marcel Ventosa, Dmitry Gutov, Richard Stallman, Thibaut Verron,
	emacs-devel

Maybe reread what I wrote.  I said essentially what
you're saying.  Perhaps we don't disagree at all;
dunno.

But I distinguished the fact that something that is
typically not a commodity (it's offered freely, not
sold) _can_ be sold, and so might in that instance
be said to be a commodity, is nevertheless not
generally a commodity.

GNU Emacs is not generally a commodity.  (It's always
a product.  Not every product is a commodity, even in
what is generally a "market" economy.)

If I paint my car red and green stripes it becomes a
red-and-green car.  But generally cars aren't red and
green.
___

"This division of a product into a useful thing and a value
 becomes practically important, only when exchange has acquired
 such an extension that useful articles are produced for the
 purpose of being exchanged, and their character as values has
 therefore to be taken into account, beforehand, during production."

Commodity production: Products are produced with
an eye to being sold.  Selling and sales value
are taken into account during production - they
are part of the character of the product, as
commodity.  This is _production for exchange_.

GNU Emacs is, in general, not that.

The notes you write to yourself (in Org mode or
whatever) are useful to you, and they weren't
written with an eye to being sold.  If someone
sells those notes, say 100 years from now, they
_could_ be considered a commodity as a result
of that exchange transaction.  But that would
be useless hair-splitting.  The notes weren't
written with an eye to being sold (presumably).
That wasn't the purpose for which they were
produced.

https://web.stanford.edu/~davies/Symbsys100-Spring0708/Marx-Commodity-Fetishism.pdf



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 20:03                                               ` Jean Louis
  2020-10-16 20:29                                                 ` Thibaut Verron
@ 2020-10-16 21:10                                                 ` Dmitry Gutov
  2020-10-16 22:02                                                   ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 21:10 UTC (permalink / raw)
  To: Jean Louis; +Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

On 16.10.2020 23:03, Jean Louis wrote:
> * Dmitry Gutov <dgutov@yandex.ru> [2020-10-16 22:37]:
>>> devastating for a repository that is supposed to push free software,
>>> in other words, repository is hypocritical.
>>
>> No, it's supposed to _publish_ free software.
> 
> Alright, I just think of policies.

As do I.

> Imagine if free software repository would publish only software that
> wraps around proprietary software, would that be free? So it is matter
> of policy.

If it had a policy to only publish wrappers for proprietary software, it 
would be a "repository for wrappers of proprietary software".

But a repository which has a policy to only publish free software, is a 
repository for free software.

> For same reaso Debian GNU/Linux cannot be said to be free, at many
> pages they guide users to include non-free software, unspoken from
> Archlinux or other distributions.

I don't think that's how it works. If the software is free, we call it free.

>>> Would it be only hypocritical without influencing users, fine, but it
>>> does influence thousands of users and is promoting the download number
>>> of software that guides users to non-free software, so that is how it
>>> becomes not ethical.
>>
>> Some time ago I read an essay about infighting in the political left
>> community. How a lot of members choose to find and attack progressively
>> personal character faults in their fellow activists, instead of working
>> together and presenting a united front against the capitalist oppressors.
>>
>> You can draw an easy parallel to the software community and the struggle vs
>> proprietary software.
> 
> That question is best answered here:
> https://github.com/melpa/melpa/issues/7185

Good example of infighting. Not an answer.

It would be a lot more polite to include your actual name in the account 
description, by the way. Calling yourself "GNU Support" looks like an 
overreach.

> So that is request to remove those packages and to make a policy not
> to include such, that is best way to raise the issue and see if we are
> truly together in free software promotion.

"No true Scotsman"

>> But it doesn't work as well if the survey is biased from the outset.
> 
> But survey is "biased" (opinionated) from beginning, it was not published on
> emacs-devel initially, it was published on Reddit initially and I am

That doesn't necessarily make it biased. That argument is weak.

> sure there are reasons for initiator for the survey, those reasons may
> be that whay you call biased, I call it opinions, but not necessarily
> unjust opinions (biased).

Removing a known popular option from the answers makes a survey biased.

> It is better to say opinionated.

Are we reinventing English words now?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 20:59                                               ` Drew Adams
@ 2020-10-16 21:50                                                 ` Jean Louis
  2020-10-17  4:19                                                 ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 21:50 UTC (permalink / raw)
  To: Drew Adams
  Cc: Marcel Ventosa, Dmitry Gutov, Richard Stallman, Thibaut Verron,
	emacs-devel

* Drew Adams <drew.adams@oracle.com> [2020-10-17 00:02]:
> GNU Emacs is not generally a commodity.  (It's always
> a product.  Not every product is a commodity, even in
> what is generally a "market" economy.)

> Commodity production: Products are produced with an eye to being
> sold.  Selling and sales value are taken into account during
> production - they are part of the character of the product, as
> commodity.  This is _production for exchange_.

Not necessarily, products can be natural, produced by nature,
collected and sold, it can be still a product and commodity. It need
not have a vision to be sold. Example are minerals, example are
natural products collected by people and sold, let us say forest
mushrooms, it is product and commodity.

GNU Emacs was sold by GNU and is (probably) sold today by various
Emacs promoters, I guess with books or DVD or similar. If it is sold
or not currently does not make it less of a commodity, it could be
sold, just as GNU/Linux full OSes can be sold, as nobody forbids it.

It is exchangeable for money.

Software as a community product and community commodity is
exchangeable too, we can see that because it is free software, it
moves people to create more free software, share and help others. That
is the exchange that Emacs is creating itself.

If you consider commodity only that what is exchanged for dollars,
consider that before paper currencies there was maybe gold or shelves,
or something else, like goats maybe, so at that time you could
exchange GNU Emacs for a GNU Goat for example, and it would be just
fine commodity without currency.

> The notes you write to yourself (in Org mode or whatever) are useful
> to you, and they weren't written with an eye to being sold.

In particular on my side, I write instruction manuals that I do sell
to my clients. Yet I get your point, but see above, products need not
have in their creation the purpose to be sold, even though Emacs was
sold by GNU project and FSF in past, maybe not today, but it was sold
on CDs as source software or bundled with GNU software together, and
is sold today by various individuals and companies, sometimes on
CD/DVD with the book or instructions, more often in commercial
GNU/Linux distributions, it need not be in English language, it can be
Japanese language or other countries. GNU/Linux with GNU Emacs is sold
here in Uganda, that is what I can say that I have seen practically,
you come and you can buy it on DVD all together. So it is part of OS
and can be sold with the OS.

You probably want to say that it is not common for you to find GNU
Emacs being sold, you do not consider it commodity.

I am giving you few examples that you see it is indirectly sold,
sometimes directly on DVD with books about Emacs, and as part of
GNU/Linux distributions, probably other distributions as well. It is
probably bundled with many BSD-based OSes as well which are sold as
DVD, like shoplinuxonline.com

It may not be common to you, as you download it, yet there are people
who cannot and who need DVD, and they will buy it.

The last big exchange that Emacs is creating is donations to Free
Software Foundation and supporting GNU infrastructure and its
management.

There is nothing wrong calling it a product or commodity.

Surely I understand your viewpoint, it is not a common for Emacs to be
sold, but it is sold, I gave you few references.

It is special commodity of its own kind.

Note that there are countries without good Internet access, Internet
may be expensive, where DVDs are quite popular in those countries,
where software is sold on DVD and not accessible online. It is cheaper
to purchase DVD with software then download it in those places.

Free software movement have already made OS sellers like Red Hat and
so many others to change into different direction, it also introduced
it to Microsoft and other proprietary companies, but that all does not
make it less of a product, as it is product of human effort, so it is
exchangeable, if not for money then for donations, goodwill,
contributions to the code, it is exchange of effort, so free software
is currency within the community of free software.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-16 18:09                               ` Dmitry Gutov
@ 2020-10-16 22:00                                 ` Qiantan Hong
  2020-10-16 22:08                                   ` Dmitry Gutov
  2020-10-17  4:18                                   ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Qiantan Hong @ 2020-10-16 22:00 UTC (permalink / raw)
  To: Dmitry Gutov
  Cc: Marcel Ventosa, thibaut.verron@gmail.com, rms@gnu.org, Jean Louis,
	emacs-devel

[-- Attachment #1: Type: text/plain, Size: 208 bytes --]

As a package writer, my main concern is that
it seems that the package submission process
require proprietary software (particularly non-free
JavaScript by m$ Github).

Do Melpa people provide any workaround?

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 1858 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 21:10                                                 ` Dmitry Gutov
@ 2020-10-16 22:02                                                   ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-16 22:02 UTC (permalink / raw)
  To: Dmitry Gutov
  Cc: Marcel Ventosa, Richard Stallman, Thibaut Verron, emacs-devel

* Dmitry Gutov <dgutov@yandex.ru> [2020-10-17 00:10]:
> If it had a policy to only publish wrappers for proprietary software, it
> would be a "repository for wrappers of proprietary software".
> 
> But a repository which has a policy to only publish free software, is a
> repository for free software.
> 
> > For same reaso Debian GNU/Linux cannot be said to be free, at many
> > pages they guide users to include non-free software, unspoken from
> > Archlinux or other distributions.
> 
> I don't think that's how it works. If the software is free, we call
> it free.

Maybe I have expressed myself wrongly.

It is not a free software repository if it publishes non-free
software, it is mixture of the two.

So MELPA is also mixture of software that is truly free software and
that other group of software which has the only purpose to interact
with non-free software, more or less promotional tool in free software
community to capture some users for proprietary software, or pathetic
way to promote proprietary software.

> > That question is best answered here:
> > https://github.com/melpa/melpa/issues/7185
> 
> Good example of infighting. Not an answer.

Question about MELPA will be answered there. It is best answered
there, we will see if MELPA authors do like idea or maybe like
Archlinux do not mind if some packages are steering users to access
proprietary software.

> It would be a lot more polite to include your actual name in the account
> description, by the way. Calling yourself "GNU Support" looks like an
> overreach.

I could not register the really intended domain support.gnu, so it is
other way around.

> > sure there are reasons for initiator for the survey, those reasons may
> > be that whay you call biased, I call it opinions, but not necessarily
> > unjust opinions (biased).
> 
> Removing a known popular option from the answers makes a survey biased.
> 
> > It is better to say opinionated.
> 
> Are we reinventing English words now?

Maybe you are native English speaker, I am not. So I am consulting
dictionaries for fine differences, like Wordnut.

biased

* Overview of verb bias

The verb bias has 2 senses (no senses from tagged texts)
1. bias -- (influence in an unfair way; "you are biasing my choice by telling me yours")
2. bias, predetermine -- (cause to be biased)

while opinionated:

* Overview of adj opinionated

The adj opinionated has 1 sense (first 1 from tagged texts)
1. (1) opinionated, opinionative, self-opinionated -- (obstinate in
your opinions)

* Overview of verb obstinate

The verb obstinate has 1 sense (no senses from tagged texts)
1. obstinate -- (persist stubbornly; "he obstinates himself against all rational arguments")


GNU project is obstinated stubbornly not to promote proprietary
software and cannot endorse software repositories that do so.

It is not biased because the stubborn opinion is not equal to being
influenced in unfair way, quite opposite it is being influenced in
just way.

Free software is good because it helps the user to control its own
computing.

That package that is made for Emacs can be issued under GNU GPL, yet
with the only reason to circumvent the purpose of GPL so that
proprietary software makers can control such user, then such software
repository is not ethical and questions about such repository are not
relevant for GNU Emacs development, as it is already known that MELPA
is not endorsed for the discussed reasons.

In fact, how much we have written here, instead why you did not write
to MELPA on that issue and ask them to remove those few packages?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-16 22:00                                 ` Qiantan Hong
@ 2020-10-16 22:08                                   ` Dmitry Gutov
  2020-10-17  4:18                                   ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-16 22:08 UTC (permalink / raw)
  To: Qiantan Hong
  Cc: Marcel Ventosa, thibaut.verron@gmail.com, rms@gnu.org, Jean Louis,
	emacs-devel

On 17.10.2020 01:00, Qiantan Hong wrote:
> As a package writer, my main concern is that
> it seems that the package submission process
> require proprietary software (particularly non-free
> JavaScript by m$ Github).
> 
> Do Melpa people provide any workaround?

You can ask someone else to do that for you. Email one of the MELPA 
maintainers, for example.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-16 16:33                             ` MELPA issues - " Jean Louis
  2020-10-16 18:09                               ` Dmitry Gutov
@ 2020-10-17  2:59                               ` Marcel Ventosa
  2020-10-18  4:12                                 ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-17  2:59 UTC (permalink / raw)
  To: Jean Louis; +Cc: Richard Stallman, thibaut.verron, emacs-devel

Thank you for your explanation Jean Louis.

On Fri, 16 Oct 2020 19:33:45 +0300
Jean Louis <bugs@gnu.support> wrote:

> * Marcel Ventosa <mve1@runbox.com> [2020-10-16 09:03]:
> > On Thu, 15 Oct 2020 23:59:07 -0400
> > Richard Stallman <rms@gnu.org> wrote:
> >   
> > > I hope that only a minority of Emacs users know about MELPA, and
> > > I'd rather not inform the rest about it.  But if something is
> > > going to inform them anyway, it is better to do it with a
> > > denunciation.  
> > 
> > 
> > I've been using Emacs (and MELPA) for the best part of a decade and
> > knew nothing about this! I'm concerned to use only free software and
> > actively avoid proprietary software, so this is a bit of a shock.
> > 
> > Is there anywhere I can read more about this issue?  
> 
> I have not checked all the software on MELPA, but due to Github
> policies that free (of charge)repositories should have only free (as
> in liberty)software licenses, I am assuming that probably none of
> those software is non-free. But there can be MELPA software that is
> vague because maybe maintainers have not put the proper license, which
> is often the case.
> 
> The software provided by MELPA may lead users to non-free software or
> may control non-free software or be made exclusively for usage of free
> software.
> 
> Example that I have found is ChatWork package, it works with ChatWork
> chat software, for which I only assume it is proprietary, I have not
> checked it very good, it seemed to be so from verification of their
> website.
> 
> Corporations can very easily sponsor somebody to provide software for
> Emacs to provide features that control or interact with their
> proprietary software.
> 
> It is also method of advertising.
> 
> Then there is software to access various websites, let us say software
> that provides quotes from specific website, it could be funny quote or
> smart one, but maybe the purpose is simply advertising. Finally,
> fetching something from other website I consider dangerous, package
> itself need not be, but other packages following, could be easily
> dangerous.
> 
> More danger from MELPA comes from the fact that MELPA is not verifying
> the packages, not that I know, I have read they said they are not
> doing it.
> 
> There is plethora of insecurities on MELPA. It is far from harmless.
> 
> So far I understood, the packages arriving to GNU ELPA are assigned
> with copyright to FSF, I am also assuming as user that such packages
> are somehow reviewed by developers, not just one developer, and that
> they are placed into ELPA as duplicate or copy from the upstream. I
> may be wrong in all that assumption, but I think that GNU ELPA
> packages are verified for freedom and mostly for security and safety
> of users. We are speaking of loading true programming language code
> and executing such on users' computers.
> 
> It is not equivalent to Javascript, it is far more dangerous than
> Javascript which tend to execute in safe environment, which tends to
> execute in such way as not to abuse users' computers and data, yet
> people have found ways to crack browsers and to crack and enter into
> users' file systems, there are many ways how Javascript can be
> malicious.
> 
> The more packages there are that are not verified, but simple offered
> for download through MELPA, the more and more insecurities are coming
> in future.
> 
> MELPA is allowing Google to track users by using Google Analytics on
> their website, that speaks already about the webmaster's lack of
> skills in managing the website. There are so many free software
> programs for web statistics, and there is no need for third party
> tracking.
> 
> Now, the real insecurity comes from program that are sourced from
> Github. If there are 4000+ packages, there can be 1000+ authors, maybe
> even 2000+ authors.
> 
> Each of those authors represent insecurity to computing, as their
> packages are not verified each time they are pulled, they are blindly
> trusted.
> 
> The blind trust to MELPA packages is what is making it highly insecure
> for computer users.
> 
> It requires just 1 author for their accounts to be cracked and for
> malicious code to be inserted, thousands of computer users can be
> affected that way.
> 
> Finally, author can go nut himself, and can become psychotic, there
> are programmers who became so, they can introduce malicious code
> themselves, or can do it by claiming it was somebody else.
> 
> Packages that I think do not belong in free software repository for
> reason they are using proprietary information or wrapping proprietary
> software, or use known spying networks:
> 
> babel - that uses non-free Babelfish translations (if I am mistaken
> tell me)
> 
> chatwork - that uses non-free ChatWork proprietary chat software
> 
> bing-dict - that uses Microsoft Bing proprietary dictionary
> 
> calfw-gcal - to edit Google calendar
> 
> Obviously I came to letter C, I could browse more and find more
> troublesome packages.
> 
> Yet major insecurity is number of packages where they are not verified
> by human to be safe and blind offering and blind acceptance by users
> thinking they are safe.
> 
> Jean
> 
> 
> 
> 




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-16 22:00                                 ` Qiantan Hong
  2020-10-16 22:08                                   ` Dmitry Gutov
@ 2020-10-17  4:18                                   ` Richard Stallman
  2020-10-17  4:59                                     ` chad
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-17  4:18 UTC (permalink / raw)
  To: Qiantan Hong; +Cc: mve1, emacs-devel, bugs, thibaut.verron, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > As a package writer, my main concern is that
  > it seems that the package submission process
  > require proprietary software (particularly non-free
  > JavaScript by m$ Github).

What I would do, in that situation, is not submit my package to Melpa.

Meanwhile, this aspect of Melpa is an additional reason not to do
anything to lead people to use Melpa.

I hope the developers of Melpa will fix this.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 20:59                                               ` Drew Adams
  2020-10-16 21:50                                                 ` Jean Louis
@ 2020-10-17  4:19                                                 ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-17  4:19 UTC (permalink / raw)
  To: Drew Adams; +Cc: mve1, emacs-devel, thibaut.verron, bugs, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

It is not, strictly speaking, false to think about Emacs in ordinary
economic terms.  But it is not very illuminating to do so, since for the
most part what we do is not driven by economic motives.

That discussion is not pertinent to developing Emacs;
would you please take it off this list?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 20:29                                                 ` Thibaut Verron
  2020-10-16 20:40                                                   ` Jean Louis
@ 2020-10-17  4:19                                                   ` Richard Stallman
  2020-10-17  5:02                                                     ` Thibaut Verron
                                                                       ` (2 more replies)
  1 sibling, 3 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-17  4:19 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, dgutov, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Imagine if free software repository would publish only software that
  > > wraps around proprietary software, would that be free? So it is matter
  > > of policy.

  > Incidentally, if Melpa agrees to your request to remove all packages
  > wrapping around proprietary software, it will be a matter of days
  > before such a repository appears.

To move all the recommendations of nonfree software
OUT of Melpa, and into some other obscure new repository,
would be a great step forward!  It would eliminate one
of the reasons why currently we must not inform people about Melpa.

If Melpa then were to eliminates the other reason, reported here
today, that it requires use of nonfree software to contribute
packages, and commits to stay on this path, that could make it
possible for us to recommend Melpa!  That would be a big
change for the better.

  > And yes, it would be free, in my opinion. Because users are free to
  > use Emacs in whichever way they want, including in workflows involving
  > non-free software.

Indeed they are, but you've changed to a different question.


  > > For same reaso Debian GNU/Linux cannot be said to be free, at many
  > > pages they guide users to include non-free software, unspoken from
  > > Archlinux or other distributions.

  > This is, again, a matter of opinion.

You're entitled to your opinion, but this list is for discussing what
to do in the GNU Project.  In the GNU Project, this question is a
matter of stated policy.

In https://gnu.org/distros/free-system-distribution-guidelines.html,
our criteria say this is not acceptable.  That is why we classify
Debian as nonfree in https://gnu.org/distros/common-distros.html.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 20:15                                             ` Jean Louis
  2020-10-16 20:59                                               ` Drew Adams
@ 2020-10-17  4:19                                               ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-17  4:19 UTC (permalink / raw)
  To: Jean Louis; +Cc: mve1, emacs-devel, thibaut.verron, drew.adams, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > No, not really.  A commodity is something that's
  > > produced for sale.

  > Emacs have been sold and can be sold today, thus it is commodity by
  > definition.

Would people please take this discussion off the list emacs-devel?

This list is for discussing practical questions about what to do in
Emacs development.  That discussion of semantics doesn't contribute,
it is a tangent about semantics.

Having disputes like this on the list makes the list unpleasant,
so please move it.

https://gnu.org/philosophy/kind-communication.html urges people to
resist the temptation to discuss tangets.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 14:58                                             ` Thibaut Verron
  2020-10-16 15:51                                               ` Alfred M. Szmidt
@ 2020-10-17  4:20                                               ` Richard Stallman
  2020-10-17  4:50                                                 ` Thibaut Verron
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-17  4:20 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, dgutov, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > We could turn this argument around and ask why the developers who
  > > maintain MELPA don't remove `2-3' packages that promote non-free
  > > software.

  > I sincerely hope it doesn't happen. Those packages might rely on
  > non-free software, but they are still packages that some users find
  > valuable or even vital, and that they would want to find somewhere
  > else if not available on Melpa. Removing them from Melpa would only
  > move the "problem".

I think you have picked up your values (your basis of judging what is
good or bad) from what most people think, and that you took for granted
we have the same values.  But we don't.

The goal of the GNU Project is not simply "to help users."  It is to
help users _escape from nonfree software_ (des logiciels pas libres), and
ultimately to build a world where all software is free.  Nonfree
software is an injustice -- nonfree software subjugates users.
Our goal is to _eradicate it_.

See https://gnu.org/philosophy/free-software-even-more-important.html
and fsf.org/tedx for explanation of these ideas.

Suppose that a user finds some nonfree software because a Melpa
package refers to it.  Suppose the user considers that nonfree
software very useful.  What should we say about that?

You, thinking based on your values, seem to consider that a good
thing.  You draw the conclusion that it would be unfortunate if Melpa
deleted the Lisp package which refers to that nonfree program.

We, based on the values we have followed since the 1980s say that it
is bad that someone is using a nonfree program, that we wish the
nonfree program did not exist, and that we hope someone will liberate
its users soon by developing a free replacement for it.  We would
be very glad if Melpa deleted that Lisp package.

If user A says, "I really like nonfree program X," my guess is that
you would say, "I am glad you like it."  If A had found out about X
from you, you might feel proud to have "helped".

We would say, "How sad, one step backwards away from freedom."  If A
had found out about X from us, we would say, "Oops!  An own-goal!
What did we do wrong, and how can we make sure we don't do it again?"

We tend to expect that people joining in GNU Project discussion lists
are familiar with the basic ideas and values of the GNU Project.  But
this is not always the case.  It would be good if we could recognize
this sooner and educate people about the basic ideas of the GNU
Project sooner.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  8:25                                   ` Marcel Ventosa
  2020-10-16 12:17                                     ` Dmitry Gutov
  2020-10-16 17:29                                     ` Jean Louis
@ 2020-10-17  4:22                                     ` Richard Stallman
  2020-10-17  4:31                                       ` Qiantan Hong
  2 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-17  4:22 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: bugs, thibaut.verron, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Perhaps. Transitional solutions go both ways though. A cursory glance at
  > Reddit's Emacs group is enough to notice not only ignorance of the
  > philosophy behind GNU, but quite recurrent mockery of what it stands
  > for.

Here is an ironic conflict.  It would be good for someone to explain
the GNU pilosophy there so that they understand that we have reasons
for what we do.  But I can't ask you to run nonfree software to
post on Reddit.

Is there any API that someone could use to make a free program
that can post on Reddit?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  7:05                           ` Thibaut Verron
  2020-10-16 13:23                             ` Philip K.
  2020-10-16 18:46                             ` Jean Louis
@ 2020-10-17  4:22                             ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-17  4:22 UTC (permalink / raw)
  To: thibaut.verron; +Cc: bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I believe that it is too late for such hopes, and that a majority of
  > Emacs users know about Melpa and/or uses it.

You may be right, but it is hard to tell.  We don't know what fraction
of Emacs users are even aware that there is such a thing as
"packages".

The survey that is now being done will not tell us, because it will be
publicized in certain forums so it will reflect the subset of users
that use those forums -- not a representative sample of all users.  I
woudl expoect that there is another population of users which has no
contact with those forums or startup kits.

So you might be right, but we don't know if that is actually so.

It makes a difference.  If we KNEW that almost all users of Emacs did
know about Melpa, that would change our policy towards it.  But it
would be an own-goal to assume, erroneously that they already know and
as a result end up being the ones to tell them.

Can you change emacswiki to state the two things that are bad
about Melpa?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:22                                     ` Richard Stallman
@ 2020-10-17  4:31                                       ` Qiantan Hong
  2020-10-19 10:12                                         ` Robert Pluim
  0 siblings, 1 reply; 838+ messages in thread
From: Qiantan Hong @ 2020-10-17  4:31 UTC (permalink / raw)
  To: rms@gnu.org
  Cc: Marcel Ventosa, thibaut.verron@gmail.com, Jean Louis, emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 730 bytes --]

> 
> Here is an ironic conflict.  It would be good for someone to explain
> the GNU pilosophy there so that they understand that we have reasons
> for what we do.  But I can't ask you to run nonfree software to
> post on Reddit.
> 
> Is there any API that someone could use to make a free program
> that can post on Reddit?
> 
> -- 
> Dr Richard Stallman
> Chief GNUisance of the GNU Project (https://gnu.org)
> Founder, Free Software Foundation (https://fsf.org)
> Internet Hall-of-Famer (https://internethalloffame.org)

It seems that https://i.reddit.com/ <https://i.reddit.com/> works pretty well
with LibreJS enabled. I assume it’s intended to
be a JavaScript free version. Browsing and posting both works.

[-- Attachment #1.2: Type: text/html, Size: 1369 bytes --]

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 1858 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:20                                               ` Richard Stallman
@ 2020-10-17  4:50                                                 ` Thibaut Verron
  2020-10-17  5:44                                                   ` Jean Louis
  2020-10-17  9:42                                                   ` Yuri Khan
  0 siblings, 2 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-17  4:50 UTC (permalink / raw)
  To: Richard Stallman; +Cc: mve1, Dmitry Gutov, Jean Louis, emacs-devel

Le sam. 17 oct. 2020 à 06:21, Richard Stallman <rms@gnu.org> a écrit :
>
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > > We could turn this argument around and ask why the developers who
>   > > maintain MELPA don't remove `2-3' packages that promote non-free
>   > > software.
>
>   > I sincerely hope it doesn't happen. Those packages might rely on
>   > non-free software, but they are still packages that some users find
>   > valuable or even vital, and that they would want to find somewhere
>   > else if not available on Melpa. Removing them from Melpa would only
>   > move the "problem".
>
> I think you have picked up your values (your basis of judging what is
> good or bad) from what most people think, and that you took for granted
> we have the same values.  But we don't.

> The goal of the GNU Project is not simply "to help users."  It is to
> help users _escape from nonfree software_ (des logiciels pas libres), and
> ultimately to build a world where all software is free.

I gave my reasons above. It's not just about "helping users", it's
about helping them move more of their activities to the free world.
Those packages (helm-lastpass, lastpass) are helping users who already
use lastpass at the moment do exactly that.

> Nonfree
> software is an injustice -- nonfree software subjugates users.
> Our goal is to _eradicate it_.

Again, the same question: by arranging for links to such software to
be removed everywhere? Or by offering free alternatives?

Incidentally, I see a lot of effort so far discussing how evil
helm-lastpass and lastpass are, and how to get them moved to obscure
parts of the internet. What I don't see is efforts discussing free
alternatives.

As far as I know the only free competitor for lastpass is bitwarden,
why is nobody talking about developing an emacs interface to bitwarden
and educating lastpass users about it? Isn't _that_ what the GNU
project is about, rather than making it as hard as possible to find
the software we don't like?


> You, thinking based on your values, seem to consider that a good
> thing.  You draw the conclusion that it would be unfortunate if Melpa
> deleted the Lisp package which refers to that nonfree program.
>
> We, based on the values we have followed since the 1980s say that it
> is bad that someone is using a nonfree program, that we wish the
> nonfree program did not exist, and that we hope someone will liberate
> its users soon by developing a free replacement for it.  We would
> be very glad if Melpa deleted that Lisp package.

Me too I guess, once and not before the free replacement exists. As
long as it doesn't, it means that the aforementioned users will be
trapped in the non-free ecosystem because they can't use their
password manager in Emacs (or IceCat). How is that helping the cause
of free software?

> We tend to expect that people joining in GNU Project discussion lists
> are familiar with the basic ideas and values of the GNU Project.  But
> this is not always the case.  It would be good if we could recognize
> this sooner and educate people about the basic ideas of the GNU
> Project sooner.

I am familiar with the ideas and values of the GNU Project, and to a
large extent I agree with them. My points of disagreement lie in
implementation details and priorities.

Framing those disagreements as a lack of education is demeaning.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-17  4:18                                   ` Richard Stallman
@ 2020-10-17  4:59                                     ` chad
  2020-10-17  5:05                                       ` Qiantan Hong
  2020-10-17  5:06                                       ` Thibaut Verron
  0 siblings, 2 replies; 838+ messages in thread
From: chad @ 2020-10-17  4:59 UTC (permalink / raw)
  To: Richard Stallman
  Cc: Qiantan Hong, bugs, thibaut.verron, mve1, EMACS development team,
	Dmitry Gutov

[-- Attachment #1: Type: text/plain, Size: 1193 bytes --]

On Fri, Oct 16, 2020 at 9:20 PM Richard Stallman <rms@gnu.org> wrote:

>   > As a package writer, my main concern is that
>   > it seems that the package submission process
>   > require proprietary software (particularly non-free
>   > JavaScript by m$ Github).
>
> What I would do, in that situation, is not submit my package to Melpa.
>
> Meanwhile, this aspect of Melpa is an additional reason not to do
> anything to lead people to use Melpa.
>

This seems to be based on the incorrect assumption that package authors
must use GitHub to use MELPA. According to the MELPA docs:

 MELPA supports git <http://git-scm.com/>, github <https://github.com/>,
> gitlab <https://gitlab.com/>, and hg <https://www.mercurial-scm.org/> (Mercurial)
> [...]
> :url specifies the URL of the version control repository.
> *required for the git, and hg fetchers. [...]*:repo specifies the github
> or gitlab repository and is of the form user/repo-name. *required for
> the github and gitlab fetchers*.


Digging in a bit further, MELPA used to also support EmacsWiki, which it
deprecated for security concerns, and Bazaar, CVS, Darcs, Fossil and
Subversion, which it deprecated due to lack of use.

~Chad

[-- Attachment #2: Type: text/html, Size: 8159 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:19                                                   ` Richard Stallman
@ 2020-10-17  5:02                                                     ` Thibaut Verron
  2020-10-17 13:13                                                       ` Stefan Monnier
  2020-10-17  5:07                                                     ` Jean Louis
  2020-10-17 12:34                                                     ` Andy Moreton
  2 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-17  5:02 UTC (permalink / raw)
  To: Richard Stallman; +Cc: mve1, Dmitry Gutov, Jean Louis, emacs-devel

Le sam. 17 oct. 2020 à 06:19, Richard Stallman <rms@gnu.org> a écrit :
>
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > > Imagine if free software repository would publish only software that
>   > > wraps around proprietary software, would that be free? So it is matter
>   > > of policy.
>
>   > Incidentally, if Melpa agrees to your request to remove all packages
>   > wrapping around proprietary software, it will be a matter of days
>   > before such a repository appears.
>
> To move all the recommendations of nonfree software
> OUT of Melpa, and into some other obscure new repository,
> would be a great step forward!  It would eliminate one
> of the reasons why currently we must not inform people about Melpa.

It would not be obscure for very long, because most of the Emacs blogs
would not refrain from advertising it.

Moving the free packages to a GNU-managed non-GNU Elpa is imo a better
way to achieve such separation between free and non-free community
packages.

>
>   > And yes, it would be free, in my opinion. Because users are free to
>   > use Emacs in whichever way they want, including in workflows involving
>   > non-free software.
>
> Indeed they are, but you've changed to a different question.
>

I don't think I did. Making it as hard as possible for users to find
packages necessary for their workflow is acting against that freedom,
in my opinion.

>
>   > > For same reaso Debian GNU/Linux cannot be said to be free, at many
>   > > pages they guide users to include non-free software, unspoken from
>   > > Archlinux or other distributions.
>
>   > This is, again, a matter of opinion.
>
> You're entitled to your opinion, but this list is for discussing what
> to do in the GNU Project.  In the GNU Project, this question is a
> matter of stated policy.
>
> In https://gnu.org/distros/free-system-distribution-guidelines.html,
> our criteria say this is not acceptable.  That is why we classify
> Debian as nonfree in https://gnu.org/distros/common-distros.html.

As well as, apparently, all other major GNU/Linux distributions. I
wonder how many users would know about the GNU project if not for
those non-free distributions.

And there seems to have been no problem in publishing that list on
gnu.org, even though it names a number of non-free options. Why can't
the same be done with Melpa ?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-17  4:59                                     ` chad
@ 2020-10-17  5:05                                       ` Qiantan Hong
  2020-10-17  5:06                                       ` Thibaut Verron
  1 sibling, 0 replies; 838+ messages in thread
From: Qiantan Hong @ 2020-10-17  5:05 UTC (permalink / raw)
  To: chad
  Cc: Jean Louis, rms@gnu.org, thibaut.verron@gmail.com, Marcel Ventosa,
	EMACS development team, Dmitry Gutov


[-- Attachment #1.1: Type: text/plain, Size: 1510 bytes --]

However, I do need to use GitHub to open a Pull Request to add
the receipt. 

As someone pointed out, one workaround might be just email the MELPA
maintainers. I’ve never tried that myself.

> On Oct 17, 2020, at 12:59 AM, chad <yandros@gmail.com> wrote:
> 
> On Fri, Oct 16, 2020 at 9:20 PM Richard Stallman <rms@gnu.org <mailto:rms@gnu.org>> wrote:
>   > As a package writer, my main concern is that
>   > it seems that the package submission process
>   > require proprietary software (particularly non-free
>   > JavaScript by m$ Github).
> 
> What I would do, in that situation, is not submit my package to Melpa.
> 
> Meanwhile, this aspect of Melpa is an additional reason not to do
> anything to lead people to use Melpa.
> 
> This seems to be based on the incorrect assumption that package authors must use GitHub to use MELPA. According to the MELPA docs:
> 
>  MELPA supports git <http://git-scm.com/>, github <https://github.com/>, gitlab <https://gitlab.com/>, and hg <https://www.mercurial-scm.org/> (Mercurial) [...]
> :url specifies the URL of the version control repository. required for the git, and hg fetchers. [...]
> :repo specifies the github or gitlab repository and is of the form user/repo-name. required for the github and gitlab fetchers.
>  
> Digging in a bit further, MELPA used to also support EmacsWiki, which it deprecated for security concerns, and Bazaar, CVS, Darcs, Fossil and Subversion, which it deprecated due to lack of use.
> 
> ~Chad


[-- Attachment #1.2: Type: text/html, Size: 9616 bytes --]

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 1858 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-17  4:59                                     ` chad
  2020-10-17  5:05                                       ` Qiantan Hong
@ 2020-10-17  5:06                                       ` Thibaut Verron
  1 sibling, 0 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-17  5:06 UTC (permalink / raw)
  To: chad
  Cc: Qiantan Hong, Richard Stallman, Jean Louis, mve1,
	EMACS development team, Dmitry Gutov

Le sam. 17 oct. 2020 à 06:59, chad <yandros@gmail.com> a écrit :
>
> On Fri, Oct 16, 2020 at 9:20 PM Richard Stallman <rms@gnu.org> wrote:
>>
>>   > As a package writer, my main concern is that
>>   > it seems that the package submission process
>>   > require proprietary software (particularly non-free
>>   > JavaScript by m$ Github).
>>
>> What I would do, in that situation, is not submit my package to Melpa.
>>
>> Meanwhile, this aspect of Melpa is an additional reason not to do
>> anything to lead people to use Melpa.
>
>
> This seems to be based on the incorrect assumption that package authors must use GitHub to use MELPA. According to the MELPA docs:

But can a user submit a new package without filing a pull request
against Melpa's github repository?

This requires using github to create an account, create the fork and
file the pull request.

There is a github cli program which might allow do the latter two, but
creating the account will still require github's javascript.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:19                                                   ` Richard Stallman
  2020-10-17  5:02                                                     ` Thibaut Verron
@ 2020-10-17  5:07                                                     ` Jean Louis
  2020-10-17 12:34                                                     ` Andy Moreton
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-17  5:07 UTC (permalink / raw)
  To: Richard Stallman; +Cc: mve1, dgutov, thibaut.verron, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-17 07:19]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > > Imagine if free software repository would publish only software that
>   > > wraps around proprietary software, would that be free? So it is matter
>   > > of policy.
> 
>   > Incidentally, if Melpa agrees to your request to remove all packages
>   > wrapping around proprietary software, it will be a matter of days
>   > before such a repository appears.
> 
> To move all the recommendations of nonfree software
> OUT of Melpa, and into some other obscure new repository,
> would be a great step forward!  It would eliminate one
> of the reasons why currently we must not inform people about Melpa.

Author said yesterday or was it today, they are not interested to
impose a policy to remove questionable packages, issue is closed,
there is no discussion about that at MELPA.

Issue was:

To remove packages that guide users to non-free software or wrap
around proprietary software #7185

Answer by purcell maintainer was:

The MELPA maintainers already take some care to host only Emacs Lisp
packages with GPL or GPL-compatible licences. We are not aware of any
packages which are in legal violation of this compatibility, including
the packages you mention.

Beyond that, we respectfully decline to institute a policy as
proposed, and wish you all the best.

> If Melpa then were to eliminates the other reason, reported here
> today, that it requires use of nonfree software to contribute
> packages, and commits to stay on this path, that could make it
> possible for us to recommend Melpa!  That would be a big
> change for the better.

I don't think so, the answer is clear, they will allow GPLG or
GPL-compatible licenses without looking into purpose of the package,
such open policy allows inclusion of new packages that are meant only
to use, control proprietary software, or insecure remote websites, or
similar.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:50                                                 ` Thibaut Verron
@ 2020-10-17  5:44                                                   ` Jean Louis
  2020-10-17  6:42                                                     ` Thibaut Verron
  2020-10-17  9:42                                                   ` Yuri Khan
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-17  5:44 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: mve1, Dmitry Gutov, Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-17 07:50]:
> I gave my reasons above. It's not just about "helping users", it's
> about helping them move more of their activities to the free world.
> Those packages (helm-lastpass, lastpass) are helping users who already
> use lastpass at the moment do exactly that.
> 
> > Nonfree
> > software is an injustice -- nonfree software subjugates users.
> > Our goal is to _eradicate it_.
> 
> Again, the same question: by arranging for links to such software to
> be removed everywhere? Or by offering free alternatives?
> 
> Incidentally, I see a lot of effort so far discussing how evil
> helm-lastpass and lastpass are, and how to get them moved to obscure
> parts of the internet. What I don't see is efforts discussing free
> alternatives.

There are many password managers in any GNU/Linux system, including, I
am sure, and there are cross platform free software password managers
such as keepass, then there are packages that can manage passwords
with Emacs only, those may not be well integrated, then both KDE/Gnome
have their password managers, each browser has it password managers.

Especially when we are talking about subject of password management,
advising GNU Emacs users to keep their passwords online in a cloud,
managed by proprietary software is very wrong.

Thus there is no alternative to free software.

From Wikipedia:
https://en.wikipedia.org/wiki/LastPass

https://en.wikipedia.org/wiki/LastPass#2011_security_incident
https://en.wikipedia.org/wiki/LastPass#2015_security_breach
https://en.wikipedia.org/wiki/LastPass#2016_security_incidents
https://en.wikipedia.org/wiki/LastPass#2017_security_incidents
https://en.wikipedia.org/wiki/LastPass#2019_security_incidents

Those are only publicly announced security incidents. How many there
are not announced?

In that sense, knowing the background of the insecurities at the
company producing proprietary software, the package lastpass for Emacs
and helm-lastpass is only helping that company subjugates users to
keep their passwords online and sooner or later abuse Emacs users.

My system of keeping passwords is the file .passwords which is stored
on encrypted partition. It is appendable only file by using chattr +a,
and Emacs asks me for host name, username, email, etc. and it
generates password which is appeneded to a file. Other simple function
is grepping and finding list of passwords. It would be disaster to
keep my 4362 passwords online, unsaid of keeping it in some cloud with a
company known for security incidents.

At MELPA bug tracking, or Github issue tracker, the issue is closed,
there was no question if the package "lastpass" is driving users to
insecurities, issue was simply closed, without possibility to publish
this exact information.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  5:44                                                   ` Jean Louis
@ 2020-10-17  6:42                                                     ` Thibaut Verron
  2020-10-17  7:52                                                       ` Jean Louis
                                                                         ` (3 more replies)
  0 siblings, 4 replies; 838+ messages in thread
From: Thibaut Verron @ 2020-10-17  6:42 UTC (permalink / raw)
  To: Jean Louis; +Cc: mve1, Dmitry Gutov, Richard Stallman, emacs-devel

Le sam. 17 oct. 2020 à 07:44, Jean Louis <bugs@gnu.support> a écrit :
>
> * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-17 07:50]:
> > I gave my reasons above. It's not just about "helping users", it's
> > about helping them move more of their activities to the free world.
> > Those packages (helm-lastpass, lastpass) are helping users who already
> > use lastpass at the moment do exactly that.
> >
> > > Nonfree
> > > software is an injustice -- nonfree software subjugates users.
> > > Our goal is to _eradicate it_.
> >
> > Again, the same question: by arranging for links to such software to
> > be removed everywhere? Or by offering free alternatives?
> >
> > Incidentally, I see a lot of effort so far discussing how evil
> > helm-lastpass and lastpass are, and how to get them moved to obscure
> > parts of the internet. What I don't see is efforts discussing free
> > alternatives.
>
> There are many password managers in any GNU/Linux system, including, I
> am sure, and there are cross platform free software password managers
> such as keepass, then there are packages that can manage passwords
> with Emacs only, those may not be well integrated, then both KDE/Gnome
> have their password managers, each browser has it password managers.

Can you use Keepass with Emacs? Can you use Keepass on a phone? Can
you use it on a computer without root access?

> both KDE/Gnome have their password managers

Can you use them with Emacs? Can you use them on a phone?

> each browser has it password managers.

I don't know what Edge does, and Chrome and Chromium use Google
services for their password manager.

Firefox offers Lockwise and Opera also has its in-house method, which
at least work on phones (afaik). But then they require storage in the
cloud in the same way as Lastpass. And can you use them with Emacs?

I mentioned it before, but as far as I know, the only free software
offering for a service similar to Lastpass is Bitwarden: free software
for both the client and the server with the possibility to self-host,
same features as Lastpass (including measuring the overall safety of
your passwords, which I don't think those other password managers do)
and same compatibility list.

Focusing efforts towards evaluating the freedom (freeness?) of
Bitwarden, and if applicable, extending the support for Bitwarden to
the level of that of emacs-lastpass would make it a lot easier to
convince users to abandon that bit of non-free software.

>
> Especially when we are talking about subject of password management,
> advising GNU Emacs users to keep their passwords online in a cloud,
> managed by proprietary software is very wrong.
>
> (...)
>
> From Wikipedia:
> https://en.wikipedia.org/wiki/LastPass
>
> https://en.wikipedia.org/wiki/LastPass#2011_security_incident
> https://en.wikipedia.org/wiki/LastPass#2015_security_breach
> https://en.wikipedia.org/wiki/LastPass#2016_security_incidents
> https://en.wikipedia.org/wiki/LastPass#2017_security_incidents
> https://en.wikipedia.org/wiki/LastPass#2019_security_incidents
>
> Those are only publicly announced security incidents. How many there
> are not announced?
>
> In that sense, knowing the background of the insecurities at the
> company producing proprietary software, the package lastpass for Emacs
> and helm-lastpass is only helping that company subjugates users to
> keep their passwords online and sooner or later abuse Emacs users.
>
> (...)
>
> At MELPA bug tracking, or Github issue tracker, the issue is closed,
> there was no question if the package "lastpass" is driving users to
> insecurities, issue was simply closed, without possibility to publish
> this exact information.

Yes yes, but that's still about the availability of and the problems
behind lastpass and the emacs packages. My question is about
alternatives.

Or, what would you tell users who currently use lastpass and
emacs-lastpass, after you tell them they should stop using lastpass?

Surely you don't want to convince them to use an inferior product just
for purity of software?

I would keep the issue of security incidents separate. Security flaws
are regularly found in both free and non-free software. Lastpass makes
it a policy to announce such breaches.

And 5 incidents in 9 years does not make Lastpass "known for security
incidents", not any more than OpenSSL would be known for security
incidents (even though in the same period, 6 flaws were found and
patched in OpenSSL).

> My system of keeping passwords is the file .passwords which is stored
> on encrypted partition. It is appendable only file by using chattr +a,
> and Emacs asks me for host name, username, email, etc. and it
> generates password which is appeneded to a file. Other simple function
> is grepping and finding list of passwords.

Do you use it across devices? On devices where you don't have root
access? On phones?

> It would be disaster to keep my 4362 passwords online

Assuming that sufficiently strong encryption is used, why exactly?

> Especially when we are talking about subject of password management,
> advising GNU Emacs users to keep their passwords online in a cloud,
> managed by proprietary software is very wrong.
>
> Thus there is no alternative to free software.

I don't see what it has to do with the question, but it is factually
wrong. There are plenty of alternatives to free software.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  6:42                                                     ` Thibaut Verron
@ 2020-10-17  7:52                                                       ` Jean Louis
  2020-10-18  4:16                                                       ` Richard Stallman
                                                                         ` (2 subsequent siblings)
  3 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-17  7:52 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-17 09:42]:
> Can you use Keepass with Emacs? Can you use Keepass on a phone? Can
> you use it on a computer without root access?
> 
> > both KDE/Gnome have their password managers
> 
> Can you use them with Emacs? Can you use them on a phone?

Password by definition is a secret word or phrase known only to
restricted group or individual, I do not share opinion that passwords
should be placed with unknown group of people like lastpass, neither
at all held in any type of remote cloud.

In case of Keepass as free software, yes, it does work on many
operating systems, probably more than the proprietary lastpass, and it
seems that there is keepass-mode, at least to copy passwords to Emacs,
I did not reseach command line.

Overall it does not matter, those questions are not relevant, as for
GNU project, proprietary software or supporting proprietary software
by making Emacs packages that support such or interact with such, are
simply no go, as such are controlling the user, and do not give
freedom of computing to user.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work
  2020-07-30  4:01 bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work Brett Randall
       [not found] ` <handler.42611.B.159608273314264.ack@debbugs.gnu.org>
@ 2020-10-17  8:41 ` Lars Ingebrigtsen
  2020-10-27 10:36   ` brett.randall
  1 sibling, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-17  8:41 UTC (permalink / raw)
  To: Brett Randall; +Cc: 42611

Brett Randall <brett.randall@gmail.com> writes:

> Actions that triggered the bug:
>
> M-x edit-abbrevs
>
> Enter abbrevs in fundamental or global abbreviations at bottom of the list, e.g.:
>
> "dfn" 0 "definition"
>
> C-c C-c
>
> Buffer appears committed (modified flag disappears). Close buffer, test the abbrev
> in "abbrev-mode" minor mode and nothing happens. M-x edit-abbrevs again. The
> definition I entered is no longer there. This is in the same session. Emacs was not
> closed/reopened. The definitions are not applying/temporarily saving.

I'm unable to reproduce this bug either in Emacs 26.3 or on the trunk.
`C-c C-c' in the *Abbrevs* buffer updates the abbreviation for me.

Are you able to reproduce this bug starting from "emacs -Q"?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:50                                                 ` Thibaut Verron
  2020-10-17  5:44                                                   ` Jean Louis
@ 2020-10-17  9:42                                                   ` Yuri Khan
  1 sibling, 0 replies; 838+ messages in thread
From: Yuri Khan @ 2020-10-17  9:42 UTC (permalink / raw)
  To: thibaut.verron
  Cc: mve1, emacs-devel, Richard Stallman, Jean Louis, Dmitry Gutov

On Sat, 17 Oct 2020 at 07:51, Thibaut Verron <thibaut.verron@gmail.com> wrote:

> Incidentally, I see a lot of effort so far discussing how evil
> helm-lastpass and lastpass are, and how to get them moved to obscure
> parts of the internet. What I don't see is efforts discussing free
> alternatives.

+1!

> As far as I know the only free competitor for lastpass is bitwarden,
> why is nobody talking about developing an emacs interface to bitwarden
> and educating lastpass users about it?

Have another one: https://www.passwordstore.org/

It is a convention for storing each password in a separate encrypted
text file and a shell script wrapper around GPG and optionally Git
implementing that convention.

The store directory just happens to be easily browsable in Emacs
without any additional interface packages — as you visit an encrypted
file, Emacs asks for the decryption key passphrase and displays a
buffer with decrypted password and any additional metadata associated
with it. (I did not check what happens if you modify and save that
buffer; whether it gets encrypted with all the keys it was originally
encrypted with.)

And it comes with a script that imports passwords from LastPass format.


(I now looked at Bitwarden and it looks like its server component,
while itself being Free, requires Microsoft SQL Server which is
free-to-use but not Free; and without the server component the user is
locked into using someone else’s server instance. So, ideologically,
Bitwarden is not much better than LastPass.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16 19:08                                             ` Dmitry Gutov
  2020-10-16 19:52                                               ` Jean Louis
  2020-10-16 20:17                                               ` Alfred M. Szmidt
@ 2020-10-17 11:40                                               ` Marcel Ventosa
  2020-10-17 19:51                                                 ` Dmitry Gutov
  2 siblings, 1 reply; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-17 11:40 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Thibaut Verron, Richard Stallman, Jean Louis, emacs-devel

On Fri, 16 Oct 2020 22:08:01 +0300
Dmitry Gutov <dgutov@yandex.ru> wrote:

> >> You can't be effective at affecting change anyway, if you don't
> >> know what's going on outside.  
> > 
> > Indeed. As I recall, RMS suggested open questions instead of
> > multiple choice questions that "shape their behavior". With open
> > questions, there is no need to mention MELPA at all in fact. With
> > open questions, the insights that could be derived would be much
> > more interesting.  
> 
> So we won't suggest ELPA as an option either? What about the users
> who don't know the difference? MELPA is also an ELPA, after all (as
> in "Emacs Lisp Package Archive").

Is it a survey then or is it an opportunity to "educate/advertise?"

> > I
> > would think it should be guided, for the most part, by what the people
> > putting their time into it want to create, within the principles of the
> > philosophy of the project and its goals.  

> It's not a painting or a novel. It's a software project, with certain 
> expectations of practicality.

Are you claiming Emacs is not practical?

> > If they are not, Emacs makes it quite simple to implement changes for
> > personal "improvements". I have written functions that serve me
> > personally and change the behavior of Emacs to suit my needs. There are
> > limits to what I can do, which could be pushed if I dedicated a greater
> > effort to do so. How is that unfair?  

> You're veering the discussion off to the side for some reason.

I'm explaining how easy it is to modify Emacs to suit particular needs,
and listing the possibilities that already exist for doing so.

> But if we're talking of "unfair", releasing Emacs under GPL, enabling 
> such excellent extensibility that multiple communities spring up over 
> years, ones brimming with creativity and people dedicating years of 
> their spare time to the extensions, and then badmouthing them from afar 
> as though they violated some existing contract (social or legal), *that* 
> is unfair.

It is GNU policy not to promote or encourage proprietary software. To
the extent that any community does so, GNU must not promote or encourage
that community. You mentioned it's a matter of 2 or 3 packages that
recommend proprietary software, so the current impasse should be very
easy to fix. I fail to see what injustice has been perpetrated on the
MELPA maintainers here, or how they have been badmouthed.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:19                                                   ` Richard Stallman
  2020-10-17  5:02                                                     ` Thibaut Verron
  2020-10-17  5:07                                                     ` Jean Louis
@ 2020-10-17 12:34                                                     ` Andy Moreton
  2020-10-17 15:56                                                       ` Alfred M. Szmidt
  2 siblings, 1 reply; 838+ messages in thread
From: Andy Moreton @ 2020-10-17 12:34 UTC (permalink / raw)
  To: emacs-devel

On Sat 17 Oct 2020, Richard Stallman wrote:
> You're entitled to your opinion, but this list is for discussing what
> to do in the GNU Project.  In the GNU Project, this question is a
> matter of stated policy.

No. This list is for discussion of emacs development. GNU policy is
related but largely off topic.

Please use a more appropriate advocacy list for policy discussion.

    AndyM




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  5:02                                                     ` Thibaut Verron
@ 2020-10-17 13:13                                                       ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-10-17 13:13 UTC (permalink / raw)
  To: Thibaut Verron
  Cc: mve1, emacs-devel, Richard Stallman, Jean Louis, Dmitry Gutov

>> To move all the recommendations of nonfree software
>> OUT of Melpa, and into some other obscure new repository,
>> would be a great step forward!  It would eliminate one
>> of the reasons why currently we must not inform people about Melpa.
> It would not be obscure for very long, because most of the Emacs blogs
> would not refrain from advertising it.

AFAIK they make up a very small fraction of the MELPA archive, both in
terms of number of packages and in terms of popularity of those packages.

Of course, those people who want those packages would still find a way
to get to them, but that's OK, we're not in the business of disallowing
people from shackling themselves to proprietary software.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 12:34                                                     ` Andy Moreton
@ 2020-10-17 15:56                                                       ` Alfred M. Szmidt
  2020-10-17 16:13                                                         ` Eli Zaretskii
  0 siblings, 1 reply; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-17 15:56 UTC (permalink / raw)
  To: Andy Moreton; +Cc: emacs-devel


   On Sat 17 Oct 2020, Richard Stallman wrote:
   > You're entitled to your opinion, but this list is for discussing what
   > to do in the GNU Project.  In the GNU Project, this question is a
   > matter of stated policy.

   No. This list is for discussion of emacs development. GNU policy is
   related but largely off topic.

When it comes to clarifying misconceptioons, or trying to clearing up
policies that are relevant for the GNU project or a GNU project, then
it is certainly on-topic.  This list is after all part of the GNU
project, and as such it follows the policies of the GNU project.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 15:56                                                       ` Alfred M. Szmidt
@ 2020-10-17 16:13                                                         ` Eli Zaretskii
  2020-10-17 21:38                                                           ` Alfred M. Szmidt
  2020-10-18  4:13                                                           ` Richard Stallman
  0 siblings, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2020-10-17 16:13 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: andrewjmoreton, emacs-devel

> From: ams@gnu.org (Alfred M. Szmidt)
> Date: Sat, 17 Oct 2020 11:56:26 -0400
> Cc: emacs-devel@gnu.org
> 
>    On Sat 17 Oct 2020, Richard Stallman wrote:
>    > You're entitled to your opinion, but this list is for discussing what
>    > to do in the GNU Project.  In the GNU Project, this question is a
>    > matter of stated policy.
> 
>    No. This list is for discussion of emacs development. GNU policy is
>    related but largely off topic.
> 
> When it comes to clarifying misconceptioons, or trying to clearing up
> policies that are relevant for the GNU project or a GNU project, then
> it is certainly on-topic.  This list is after all part of the GNU
> project, and as such it follows the policies of the GNU project.

Be it as it may, the signal-to-noise ratio on this list is lately very
low, which is a pity, and IME a clear sign that too many discussions
are only very marginally on-topic, at best.

Since these discussions never lead to any useful or even practical
results, I wish people could stop trying convince one another on such
"on-topic" subjects.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 11:40                                               ` Marcel Ventosa
@ 2020-10-17 19:51                                                 ` Dmitry Gutov
  2020-10-17 21:38                                                   ` Alfred M. Szmidt
  2020-10-18  2:58                                                   ` Marcel Ventosa
  0 siblings, 2 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-17 19:51 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Thibaut Verron, Richard Stallman, Jean Louis, emacs-devel

On 17.10.2020 14:40, Marcel Ventosa wrote:

>> So we won't suggest ELPA as an option either? What about the users
>> who don't know the difference? MELPA is also an ELPA, after all (as
>> in "Emacs Lisp Package Archive").
> 
> Is it a survey then or is it an opportunity to "educate/advertise?"

Somebody else already explained that a poll where only one of the 
options is written and others are free-form will be biased anyway.

>>> I
>>> would think it should be guided, for the most part, by what the people
>>> putting their time into it want to create, within the principles of the
>>> philosophy of the project and its goals.
> 
>> It's not a painting or a novel. It's a software project, with certain
>> expectations of practicality.
> 
> Are you claiming Emacs is not practical?

It's less practical than it could be.

And you seem to be claiming it doesn't need to.

>>> If they are not, Emacs makes it quite simple to implement changes for
>>> personal "improvements". I have written functions that serve me
>>> personally and change the behavior of Emacs to suit my needs. There are
>>> limits to what I can do, which could be pushed if I dedicated a greater
>>> effort to do so. How is that unfair?
> 
>> You're veering the discussion off to the side for some reason.
> 
> I'm explaining how easy it is to modify Emacs to suit particular needs,
> and listing the possibilities that already exist for doing so.

Why are you explaining that to an Emacs developer?

>> But if we're talking of "unfair", releasing Emacs under GPL, enabling
>> such excellent extensibility that multiple communities spring up over
>> years, ones brimming with creativity and people dedicating years of
>> their spare time to the extensions, and then badmouthing them from afar
>> as though they violated some existing contract (social or legal), *that*
>> is unfair.
> 
> It is GNU policy not to promote or encourage proprietary software.

Those are not objective words, but a matter of opinion, to say the least.

> To
> the extent that any community does so, GNU must not promote or encourage
> that community.

You are saying that, by mentioning MELPA is the poll, GNU would promote 
MELPA. Right?

Are you promoting proprietary software by saying the phrase "proprietary 
software", over and over, on this mailing list? And even giving examples 
sometimes.

> I fail to see what injustice has been perpetrated on the
> MELPA maintainers here, or how they have been badmouthed.

Saying "MELPA promotes proprietary software" is like saying that GNU 
project promotes, I don't know... late-stage capitalism. Just by the 
virtue of being mostly developed in a capitalist country, and by being 
useful to many organizations participating in capitalist economies with 
high degree of inequality.

Or that it promotes proprietary software by providing support for some 
of it.

Let's disregard its mission, and all virtues and accomplishments, shall we?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 16:13                                                         ` Eli Zaretskii
@ 2020-10-17 21:38                                                           ` Alfred M. Szmidt
  2020-10-18  2:40                                                             ` Eli Zaretskii
  2020-10-18  4:13                                                           ` Richard Stallman
  1 sibling, 1 reply; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-17 21:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: andrewjmoreton, emacs-devel

   >    > You're entitled to your opinion, but this list is for discussing what
   >    > to do in the GNU Project.  In the GNU Project, this question is a
   >    > matter of stated policy.
   > 
   >    No. This list is for discussion of emacs development. GNU policy is
   >    related but largely off topic.
   > 
   > When it comes to clarifying misconceptioons, or trying to clearing up
   > policies that are relevant for the GNU project or a GNU project, then
   > it is certainly on-topic.  This list is after all part of the GNU
   > project, and as such it follows the policies of the GNU project.

   Be it as it may, the signal-to-noise ratio on this list is lately very
   low, which is a pity, and IME a clear sign that too many discussions
   are only very marginally on-topic, at best.

That is true, but there are better ways to steer discussions to more
Emacs related topics than to claim that GNU policies are off-topic for
a GNU project.  In this particular case, Richard was fully on-topic
and worth noting..

   Since these discussions never lead to any useful or even practical
   results, I wish people could stop trying convince one another on such
   "on-topic" subjects.

I am not sure what discussion you are refering to, the policies for
GNU are written down and are quite practical.  There is little to
discuss about them as well.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 19:51                                                 ` Dmitry Gutov
@ 2020-10-17 21:38                                                   ` Alfred M. Szmidt
  2020-10-18  2:58                                                   ` Marcel Ventosa
  1 sibling, 0 replies; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-17 21:38 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: mve1, thibaut.verron, rms, bugs, emacs-devel

   > It is GNU policy not to promote or encourage proprietary software.

   Those are not objective words, but a matter of opinion, to say the least.

Most things in life are opinions, but those are the opinions of the
GNU project, Emacs, and this list.

   > To
   > the extent that any community does so, GNU must not promote or encourage
   > that community.

   You are saying that, by mentioning MELPA is the poll, GNU would promote 
   MELPA. Right?

Reading the GNU Coding Standards (see (standards) References) would be
a good start to understanding what the policies are; the short answer
is yes.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 21:38                                                           ` Alfred M. Szmidt
@ 2020-10-18  2:40                                                             ` Eli Zaretskii
  0 siblings, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2020-10-18  2:40 UTC (permalink / raw)
  To: Alfred M. Szmidt; +Cc: andrewjmoreton, emacs-devel

> From: ams@gnu.org (Alfred M. Szmidt)
> CC: andrewjmoreton@gmail.com, emacs-devel@gnu.org
> Date: Sat, 17 Oct 2020 17:38:54 -0400
> 
>    Since these discussions never lead to any useful or even practical
>    results, I wish people could stop trying convince one another on such
>    "on-topic" subjects.
> 
> I am not sure what discussion you are refering to, the policies for
> GNU are written down and are quite practical.  There is little to
> discuss about them as well.

Exactly.  So why waste everyone''s time by discussing them?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 19:51                                                 ` Dmitry Gutov
  2020-10-17 21:38                                                   ` Alfred M. Szmidt
@ 2020-10-18  2:58                                                   ` Marcel Ventosa
  1 sibling, 0 replies; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-18  2:58 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: Thibaut Verron, Richard Stallman, Jean Louis, emacs-devel

The original discussion involved the following:

- Richard suggested a survey with open questions (There is no need to
  mention any repository in an open question). 

- MELPA contains packages that promote proprietary software.

- If MELPA *had* to be mentioned in the survey, Richard suggested
  mentioning it with a disclaimer to abide by GNU policy and warn
  unsuspecting survey takers. 

With respect, I don't see the point of discussing off-topic tangents or
responding to apagogical arguments. 

P.S. For the record, I never provided examples of proprietary software.

On Sat, 17 Oct 2020 22:51:54 +0300
Dmitry Gutov <dgutov@yandex.ru> wrote:

> On 17.10.2020 14:40, Marcel Ventosa wrote:
> 
> >> So we won't suggest ELPA as an option either? What about the users
> >> who don't know the difference? MELPA is also an ELPA, after all (as
> >> in "Emacs Lisp Package Archive").  
> > 
> > Is it a survey then or is it an opportunity to "educate/advertise?"
> >  
> 
> Somebody else already explained that a poll where only one of the 
> options is written and others are free-form will be biased anyway.
> 
> >>> I
> >>> would think it should be guided, for the most part, by what the
> >>> people putting their time into it want to create, within the
> >>> principles of the philosophy of the project and its goals.  
> >   
> >> It's not a painting or a novel. It's a software project, with
> >> certain expectations of practicality.  
> > 
> > Are you claiming Emacs is not practical?  
> 
> It's less practical than it could be.
> 
> And you seem to be claiming it doesn't need to.
> 
> >>> If they are not, Emacs makes it quite simple to implement changes
> >>> for personal "improvements". I have written functions that serve
> >>> me personally and change the behavior of Emacs to suit my needs.
> >>> There are limits to what I can do, which could be pushed if I
> >>> dedicated a greater effort to do so. How is that unfair?  
> >   
> >> You're veering the discussion off to the side for some reason.  
> > 
> > I'm explaining how easy it is to modify Emacs to suit particular
> > needs, and listing the possibilities that already exist for doing
> > so.  
> 
> Why are you explaining that to an Emacs developer?
> 
> >> But if we're talking of "unfair", releasing Emacs under GPL,
> >> enabling such excellent extensibility that multiple communities
> >> spring up over years, ones brimming with creativity and people
> >> dedicating years of their spare time to the extensions, and then
> >> badmouthing them from afar as though they violated some existing
> >> contract (social or legal), *that* is unfair.  
> > 
> > It is GNU policy not to promote or encourage proprietary software.  
> 
> Those are not objective words, but a matter of opinion, to say the
> least.
> 
> > To
> > the extent that any community does so, GNU must not promote or
> > encourage that community.  
> 
> You are saying that, by mentioning MELPA is the poll, GNU would
> promote MELPA. Right?
> 
> Are you promoting proprietary software by saying the phrase
> "proprietary software", over and over, on this mailing list? And even
> giving examples sometimes.
> 
> > I fail to see what injustice has been perpetrated on the
> > MELPA maintainers here, or how they have been badmouthed.  
> 
> Saying "MELPA promotes proprietary software" is like saying that GNU 
> project promotes, I don't know... late-stage capitalism. Just by the 
> virtue of being mostly developed in a capitalist country, and by
> being useful to many organizations participating in capitalist
> economies with high degree of inequality.
> 
> Or that it promotes proprietary software by providing support for
> some of it.
> 
> Let's disregard its mission, and all virtues and accomplishments,
> shall we?




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  6:52                             ` Thibaut Verron
  2020-10-16  7:24                               ` Marcel Ventosa
  2020-10-16 17:04                               ` Jean Louis
@ 2020-10-18  4:09                               ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-18  4:09 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > As I understand it, Melpa packages cannot *be* or *install* non-free
  > software. But some will not work without such software, which can in
  > theory encourage users to install it.

Yes, that's exactly the issue.  Listing a program for possible use can
lead people to use it.  If using that program requires running some
nonfree program, the listing can lead people to run that nonfree
program.

  > ELPA means Emacs Lisp Package Archive, so both Melpa and GNU Elpa are ELPA's.
  > I think that commonly referring to GNU Elpa as simply Elpa (which I am
  > also guilty of) is a bigger source of confusion than Melpa and GNU
  > Elpa sharing the same suffix.

I agree.  I sent another message about that issue.

I think that the basic mistake was implementing support in GNU Emacs
for other package archives.  It may have seemed like the general thing
to do, at the time; but it led to a bad situation.  If I had thought
more about this, maybe I would have realized it beforehand.

  > GNU Elpa and the future Non-GNU Elpa are (will be) activated by
  > default as package archives, Melpa is not.
  > The hope is that once 99% of the packages by the community are
  > available in an archive activated by default, users will not rush to
  > install Melpa in the same proportions as today.

Yes, that's the aim.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-16  6:02                           ` Marcel Ventosa
  2020-10-16  6:52                             ` Thibaut Verron
  2020-10-16 16:33                             ` MELPA issues - " Jean Louis
@ 2020-10-18  4:10                             ` Richard Stallman
  2020-10-18  7:51                               ` Marcel Ventosa
                                                 ` (2 more replies)
  2 siblings, 3 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-18  4:10 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: bugs, thibaut.verron, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > In fact, I would go the extra mile and say Emacs should expressly warn
  > users over the dangers of installing proprietary software from
  > unofficial repositories

That could be a good idea.  What would be good occasions on which to warn?

Perhaps in list-packages when it sees a non-GNU repo, or when it sees MELPA?

Perhaps in describe-package and packageinstall, when the package comes
from a non-GNU repo, or specifically from MELPA?

Any other ideas?

                            (by the way, I always just assumed MELPA was
  > somehow official and related to ELPA, because its name is so similar to
  > ELPA).

Yes, this is a source of confusion.

Perhaps we should renamme GNU ELPA to a name that will avoid this confusion.
Maybe GNU EP (GNU Emacs Packages)?

EP is not meaningful to those who don't know what it means.  But
neither is ELPA.  People understand it only if they have been told.
So EP is no worse than ELPA.

WDYT?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-17  2:59                               ` Marcel Ventosa
@ 2020-10-18  4:12                                 ` Richard Stallman
  2020-10-18  5:16                                   ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-18  4:12 UTC (permalink / raw)
  To: bugs; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > babel - that uses non-free Babelfish translations (if I am mistaken
  > > tell me)
  > > 
  > > calfw-gcal - to edit Google calendar

When you say that those things are non-free, what precisely does that
mean?  It might be a misunderstanding, because a service is neither
free nor proprietary.

Do these packages run any nonfree software or use some nonfree
collection of data?  Or are you referring to the fact that they send
commands to a service?

See https://www.gnu.org/philosophy/network-services-arent-free-or-nonfree.html.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17 16:13                                                         ` Eli Zaretskii
  2020-10-17 21:38                                                           ` Alfred M. Szmidt
@ 2020-10-18  4:13                                                           ` Richard Stallman
  2020-10-18 15:20                                                             ` Alfred M. Szmidt
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-18  4:13 UTC (permalink / raw)
  To: Eli Zaretskii, ams; +Cc: andrewjmoreton, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Since these discussions never lead to any useful or even practical
  > results, I wish people could stop trying convince one another on such
  > "on-topic" subjects.

People shouldn't bring up abstract questions here which are not
relevant to Emacs development decisions.  Please, everyone, don't
discuss such topics here.

But often nontechnical questions of our values and goals come up
precisely because they are pertinent to the paqctical decision at
hand.  Then these questions are on-topic for the list.  But they are
not questions of personal opinion if the GNU Project has a position on
them.

When people state assertions which conflict with GNU Project policies
or principles, we need to present an authoritative response.  I will
do that eventually, but I am typically more than a day behind.  Alfred
knows our policies and principles, and he often gets there long before
me.  That is useful.

But often his messages don't state that they are authoritative.  So
people may think he is just stating a personal opinion, and argue.

Alfred, when you state GNU Project policies and principles, perhaps
you should say explicitly that "This is the GNU Project's position?"
Also, could you refer to published statements of same?  That could
make your statements more effective.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  6:42                                                     ` Thibaut Verron
  2020-10-17  7:52                                                       ` Jean Louis
@ 2020-10-18  4:16                                                       ` Richard Stallman
  2020-10-18  5:49                                                         ` Jean Louis
  2020-10-18  4:16                                                       ` Richard Stallman
  2020-10-18  4:16                                                       ` Richard Stallman
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-18  4:16 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, bugs, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

1. Looking for free password managers on GNU/Linux makes sense,
and perhaps developing another would be useful.

However, neither of these possibly useful activities
directly affects the ethical issue of leading users to use lastpass.

2. If and when the free password managers are miles above lastpass, it
could happen that no one has a rational use for lastpass except due to
habit.

If and when that happens, perhaps people could modify the Lisp package
for using lastpass so that it clearly informs users, that lastpass is
not worth even trying and they should instead try the free password
managers X, Y, Z.

3. Once that change is, perhaps that Lisp package would be so unlikely
to lead anyone to use lastpass that we would have no reason to worry
about informing users about its existence.  In particular, it would
not be a flaw in MELPA that MELPA contains it.

4. However, each of the other programs in MELPA that depends on a
nonfree program would be a separate issue.

5. If someday MELPA contains no programs that might lead users
to use a nonfree program, another one might be added at any time.
As long as the MELPA maintainers say it is ok to add such packages,
we have to suppose that more such packages may be added.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  6:42                                                     ` Thibaut Verron
  2020-10-17  7:52                                                       ` Jean Louis
  2020-10-18  4:16                                                       ` Richard Stallman
@ 2020-10-18  4:16                                                       ` Richard Stallman
  2020-10-18  5:52                                                         ` Jean Louis
  2020-10-18  4:16                                                       ` Richard Stallman
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-18  4:16 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, bugs, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I mentioned it before, but as far as I know, the only free software
  > offering for a service similar to Lastpass is Bitwarden: free software


Are there any that run locally, just a program with no service involved?

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  6:42                                                     ` Thibaut Verron
                                                                         ` (2 preceding siblings ...)
  2020-10-18  4:16                                                       ` Richard Stallman
@ 2020-10-18  4:16                                                       ` Richard Stallman
  2020-10-18  8:36                                                         ` Thibaut Verron
  3 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-18  4:16 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, emacs-devel, bugs, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > Surely you don't want to convince them to use an inferior product just
  > for purity of software?

Are you defining "superior" and "inferior" based on practical
considerations only?  Most people think that way; business and the
media inculcate that way of thinking.

However, the GNU Project follows the values of the free software
movement, which hold that most important characteristic of a program
is whether it respects the user's freedom or tramples it.  If you
value your freedom strongly, you will consider any free program better
than any nonfree program.

Based on these values, switching to a free program is always a step
up.

The people who use lastpass are probably not supporters of the free
software movement.  Probably they think that lastpass is better than
no program at all.  They might thing that lastpass is superior to some
free programs.

If we want to persuade them of something, we need to argue based on
premises they agree with.  We may need to make arguments that can
persuade even a person who thinks that a nonfree program is a good
thing.

But we must be careful not to endorse the idea that a nonfree program
is a good thing.
-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: MELPA issues - Re: Proposal for an Emacs User Survey
  2020-10-18  4:12                                 ` Richard Stallman
@ 2020-10-18  5:16                                   ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-18  5:16 UTC (permalink / raw)
  To: Richard Stallman; +Cc: bugs, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-18 07:12]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > > babel - that uses non-free Babelfish translations (if I am mistaken
>   > > tell me)
>   > > 
>   > > calfw-gcal - to edit Google calendar
> 
> When you say that those things are non-free, what precisely does that
> mean?  It might be a misunderstanding, because a service is neither
> free nor proprietary.

Service is neither free nor proprietary. That is right.

It is my opinion that it does not give freedom to user:

- the package "babel" is accessing non-free dictionary, their terms
  are that one shall not replicate, sell or reporduce content in any
  way. This warning may not be given to user by the package, and
  practically, I am using free dictionaries, which information I can
  embed, including sell as index or glossary. When using babel
  package, I would as user assume that information is free and would
  maybe incorporate it in other works, finally I am using Emacs which
  is meant for text editing.

  Using Wiktionary on the other hand gives me those freedoms.

- for package calfw-gcal, it may allow me to access Google Calendar
  services. It also implies that me as user must register Google
  account, meaning I must submit to being tracked by Google, I have
  access non-free Javascript. Those actions that are necessary before
  I can use the package calfw-gcal. 

> Do these packages run any nonfree software or use some nonfree
> collection of data?

For Babelfish, I doubt that package maintainer complained legally to
their terms, for Google calendar package is clear that one has to
register Google account by using non-free Javascript in order to use
the package.

> Or are you referring to the fact that they send commands to a
> service?

No.

I refer to practical facts above.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  4:16                                                       ` Richard Stallman
@ 2020-10-18  5:49                                                         ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-18  5:49 UTC (permalink / raw)
  To: Richard Stallman; +Cc: mve1, dgutov, thibaut.verron, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-18 07:17]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
> 1. Looking for free password managers on GNU/Linux makes sense,
> and perhaps developing another would be useful.

There are many password managers as free software including those that
work on various operating system and mobile devices.

There is GNU password manager:
https://www.gnu.org/software/gnu-pw-mgr/

There are GUI password managers in Gnome and KDE, there is
closs-platform keepass and many others:

pass - lightweight directory-based password manager
passwordsafe - Simple & Secure Password Management
qtpass - GUI for password manager pass
gnome-pass-search-provider - GNOME Shell search provider for the pass
password manager
impass - Simple and secure password management and retrieval system
ylva - command line password manager

What the proprietary software lastpass do, they provide online cloud
service for people to store passwords so that they are accessible from
various devices. Maybe 60 million people use that software.

As I am not of opinion that passwords should be stored online, I will
not say that such software is necessary. Other people will argue it is
necessary.

Additionally there are password management packages for Emacs out
there that do not use proprietary software.

There is Syncthing free software package that can synchronize files
across devices, it could also synchronize passwords, it would not be
well integrated.

> 2. If and when the free password managers are miles above lastpass, it
> could happen that no one has a rational use for lastpass except due to
> habit.

There is no rational use to store passwords at centralized server by
using proprietary software, as one cannot know exactly how they
encrypt those passwords, neither is management of their server and
breahes of security transparent.

What can make sense in free software world is cross platform password
manager that users can host on their own server while knowing what
type of encryption is used there.

> If and when that happens, perhaps people could modify the Lisp package
> for using lastpass so that it clearly informs users, that lastpass is
> not worth even trying and they should instead try the free password
> managers X, Y, Z.

That is good idea, MELPA can be replicated and some packages could be
automated to be made unusable with such warning.

> 3. Once that change is, perhaps that Lisp package would be so unlikely
> to lead anyone to use lastpass that we would have no reason to worry
> about informing users about its existence.  In particular, it would
> not be a flaw in MELPA that MELPA contains it.

It would not be flaw if package author would agree with you. The fact
that package author made the package shows that there is opinion
difference, so it cannot work that way. It can only work by third
party that is not MELPA, to duplicate MELPA and offer it in safe way
to users.

> 5. If someday MELPA contains no programs that might lead users
> to use a nonfree program, another one might be added at any time.
> As long as the MELPA maintainers say it is ok to add such packages,
> we have to suppose that more such packages may be added.

That is right, exactly that is the problem, they consider if software
package is GNU GPL, that it is enough regardless if package is
subjugating user.

What I consider larger problem at hand is that MELPA is developed on
Github, Emacs package contributors have to use none free Javascript to
become developers and they all bind themselves to centralized
development system held by Microsoft.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  4:16                                                       ` Richard Stallman
@ 2020-10-18  5:52                                                         ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-18  5:52 UTC (permalink / raw)
  To: Richard Stallman; +Cc: mve1, dgutov, thibaut.verron, emacs-devel

* Richard Stallman <rms@gnu.org> [2020-10-18 07:19]:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > I mentioned it before, but as far as I know, the only free software
>   > offering for a service similar to Lastpass is Bitwarden: free software
> 
> 
> Are there any that run locally, just a program with no service
> involved?

There are several on any GNU/Linux distribution.

Majority of them will not place passwords on cloud that data can be
exchanged.

Free software keepass is cross-platform, it already has free software
package for Android/Replicant system and can read data from computer
to other device and vice versa probably, I did not try it.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  4:10                             ` Richard Stallman
@ 2020-10-18  7:51                               ` Marcel Ventosa
  2020-10-18  9:29                                 ` Dmitry Gutov
  2020-10-18  9:36                                 ` Jean Louis
  2020-10-18  8:57                               ` Thibaut Verron
  2020-10-18 15:57                               ` Philip K.
  2 siblings, 2 replies; 838+ messages in thread
From: Marcel Ventosa @ 2020-10-18  7:51 UTC (permalink / raw)
  To: Richard Stallman; +Cc: bugs, thibaut.verron, emacs-devel

On Sun, 18 Oct 2020 00:10:02 -0400
Richard Stallman <rms@gnu.org> wrote:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>   > In fact, I would go the extra mile and say Emacs should expressly
>   > warn users over the dangers of installing proprietary software
>   > from unofficial repositories  
> 
> That could be a good idea.  What would be good occasions on which to
> warn?
> 
> Perhaps in list-packages when it sees a non-GNU repo, or when it sees
> MELPA?

Any non-GNU repo that has not made an express commitment to uphold free
sofware values?

> Perhaps in describe-package and packageinstall, when the package comes
> from a non-GNU repo, or specifically from MELPA?
> 
> Any other ideas?

How about something similar to Parabola's `your-freedom' package
approach? It doesn't necessarily have to prevent installation of nonfree
programs like `your-freedom' does, but could present a warning where the
user must expressly agree to run the nonfree package the first time it's
loaded (something similar to the `load-theme' warning).

I'm not sure what the technical difficulties implementing this would be.
It would also require an interested party and an ongoing discussion to
keep an up to date list of such packages. If it amounts to 2-3 packages
as I was told, it might be a very simple task.

This would have the added advantage that individual packages that are
not distributed through repositories could be added as they are
discovered, and that the responsibility for warning users about the
dangers of nonfree programs rests with GNU itself.

Who would have the final say for individual candidate packages? In the
case of Parabola, I know there have been long discussions about whether
certain components of certain programs (such as web browser engines) are
unfree. I find these discussions to be a feature rather than an
inconvenience though.

>   > (by the way, I always just assumed MELPA was
>   > somehow official and related to ELPA, because its name is so
>   > similar to ELPA).  
> 
> Yes, this is a source of confusion.
> 
> Perhaps we should renamme GNU ELPA to a name that will avoid this
> confusion. Maybe GNU EP (GNU Emacs Packages)?
> 
> EP is not meaningful to those who don't know what it means.  But
> neither is ELPA.  People understand it only if they have been told.
> So EP is no worse than ELPA.
> 
> WDYT?

This solution would have saved me from the name related confusion.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  4:16                                                       ` Richard Stallman
@ 2020-10-18  8:36                                                         ` Thibaut Verron
  2020-10-20  5:10                                                           ` Richard Stallman
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-18  8:36 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Marcel Ventosa, emacs-devel, Jean Louis, Dmitry Gutov

>   > Surely you don't want to convince them to use an inferior product just
>   > for purity of software?
>
> Are you defining "superior" and "inferior" based on practical
> considerations only?  Most people think that way; business and the
> media inculcate that way of thinking.
>
> However, the GNU Project follows the values of the free software
> movement, which hold that most important characteristic of a program
> is whether it respects the user's freedom or tramples it.  If you
> value your freedom strongly, you will consider any free program better
> than any nonfree program.
>
> Based on these values, switching to a free program is always a step
> up.
>
> The people who use lastpass are probably not supporters of the free
> software movement.  Probably they think that lastpass is better than
> no program at all.  They might thing that lastpass is superior to some
> free programs.
>
> If we want to persuade them of something, we need to argue based on
> premises they agree with.  We may need to make arguments that can
> persuade even a person who thinks that a nonfree program is a good
> thing.

I agree with all of that. But I'm an idealist: I think if the software
is free and has as many or more functionalities (e.g. MS office vs
Libreoffice, Sublime Text vs Emacs), the argument should convince
everybody, no matter how much they care about freedom.

As an aside, English is obviously not my native language, but in
French, there is a subtle difference being persuade (persuader) and
convince (convaincre): the latter appeals to reason and facts, the
former to emotions. I don't know if the same difference exists in
English, but if it does, I think that what we want is to convince
people to use free software.

> But we must be careful not to endorse the idea that a nonfree program
> is a good thing.

I don't think that I said that.

But a feature available in a non-free program can be a good feature
which we might want to add to free programs (assuming that it is
possible without compromising on freedom, of course).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  4:10                             ` Richard Stallman
  2020-10-18  7:51                               ` Marcel Ventosa
@ 2020-10-18  8:57                               ` Thibaut Verron
  2020-10-19  3:44                                 ` Richard Stallman
  2020-10-18 15:57                               ` Philip K.
  2 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-18  8:57 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Marcel Ventosa, Jean Louis, emacs-devel

Le dim. 18 oct. 2020 à 06:10, Richard Stallman <rms@gnu.org> a écrit :
>   > In fact, I would go the extra mile and say Emacs should expressly warn
>   > users over the dangers of installing proprietary software from
>   > unofficial repositories
>
> That could be a good idea.  What would be good occasions on which to warn?
>
> Perhaps in list-packages when it sees a non-GNU repo, or when it sees MELPA?

With the subtlety that non-GNU Elpa would not be a non-GNU repo?

> Perhaps in describe-package and packageinstall, when the package comes
> from a non-GNU repo, or specifically from MELPA?

Not all users use package.el, some still use git (either manually or
through a package manager).

If such a warning becomes implemented, would that automatically make
package managers which do not (or cannot) display the warning as
dangerous as Melpa is currently?

---

Fwiw I still believe that information about Melpa on the webpage
should be available, with appropriate warnings.

When researching options, I found this webpage:
https://www.gnu.org/software/gnuzilla/addons.html
about IceCat extensions.

It does give the URL for the Mozilla store, with a warning that some
extensions may not be compatible with the goals of the GNU project,
and then it gives a list of vetted extensions.

Those add-ons are vetted for their licence and their free character.
Only the latter would be necessary for Melpa.

A problem with that list is that a lot of those extensions might have
since disappeared from the Mozilla store, but that is not something
that happens frequently with Melpa, especially when it comes to
extremely popular packages.

(Another problem, obviously, is that this page is obsolete, but as I
understand it that's due to technical changes in Firefox, not to the
page being incompatible with GNU policy.)

So, would a similar approach be viable for Melpa in the Emacs manual
and/or webpage?

The work of vetting packages would not be wasted, since the same list
could be immediately reused to populate non-GNU Elpa.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  7:51                               ` Marcel Ventosa
@ 2020-10-18  9:29                                 ` Dmitry Gutov
  2020-10-18  9:36                                 ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-18  9:29 UTC (permalink / raw)
  To: Marcel Ventosa, Richard Stallman; +Cc: thibaut.verron, bugs, emacs-devel

On 18.10.2020 10:51, Marcel Ventosa wrote:
> How about something similar to Parabola's `your-freedom' package
> approach? It doesn't necessarily have to prevent installation of nonfree
> programs like `your-freedom' does, but could present a warning where the
> user must expressly agree to run the nonfree package the first time it's
> loaded (something similar to the `load-theme' warning).

You could propose something like that to MELPA guys, if that would lead 
to MELPA being endorsed.

Could be an acceptable middle ground.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  7:51                               ` Marcel Ventosa
  2020-10-18  9:29                                 ` Dmitry Gutov
@ 2020-10-18  9:36                                 ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-18  9:36 UTC (permalink / raw)
  To: Marcel Ventosa; +Cc: Richard Stallman, thibaut.verron, emacs-devel

* Marcel Ventosa <mve1@runbox.com> [2020-10-18 10:51]:
> How about something similar to Parabola's `your-freedom' package
> approach? It doesn't necessarily have to prevent installation of nonfree
> programs like `your-freedom' does, but could present a warning where the
> user must expressly agree to run the nonfree package the first time it's
> loaded (something similar to the `load-theme' warning).

That is good idea to make package for GNU ELPA that will recognize
those packages using proprietary software and warn users about freedom
issues.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  4:13                                                           ` Richard Stallman
@ 2020-10-18 15:20                                                             ` Alfred M. Szmidt
  0 siblings, 0 replies; 838+ messages in thread
From: Alfred M. Szmidt @ 2020-10-18 15:20 UTC (permalink / raw)
  To: rms; +Cc: eliz, andrewjmoreton, emacs-devel

   Alfred, when you state GNU Project policies and principles, perhaps
   you should say explicitly that "This is the GNU Project's position?"
   Also, could you refer to published statements of same?  That could
   make your statements more effective.

Those are good points, I'll try to keep them in mind -- I'm just
slightly lazy at times.  Thank you.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  4:10                             ` Richard Stallman
  2020-10-18  7:51                               ` Marcel Ventosa
  2020-10-18  8:57                               ` Thibaut Verron
@ 2020-10-18 15:57                               ` Philip K.
  2020-10-19  3:48                                 ` Richard Stallman
  2 siblings, 1 reply; 838+ messages in thread
From: Philip K. @ 2020-10-18 15:57 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Marcel Ventosa, thibaut.verron, bugs, emacs-devel

Richard Stallman <rms@gnu.org> writes:

> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
>
>   > In fact, I would go the extra mile and say Emacs should expressly warn
>   > users over the dangers of installing proprietary software from
>   > unofficial repositories
>
> That could be a good idea.  What would be good occasions on which to warn?
>
> Perhaps in list-packages when it sees a non-GNU repo, or when it sees MELPA?
>
> Perhaps in describe-package and packageinstall, when the package comes
> from a non-GNU repo, or specifically from MELPA?
>
> Any other ideas?

This is a weaker suggestion: Maybe packages could have a tag to signal
that they are related to proprietary software, that could be then
displayed both via list-packages and describe-package? I'm fairly sure
that MELPA would encourage or even require people to add this tag.
Most software on MELPA is "ok", and people (like me) choose to use it
because is offers more packages than ELPA.

>                             (by the way, I always just assumed MELPA was
>   > somehow official and related to ELPA, because its name is so similar to
>   > ELPA).
>
> Yes, this is a source of confusion.
>
> Perhaps we should renamme GNU ELPA to a name that will avoid this confusion.
> Maybe GNU EP (GNU Emacs Packages)?
>
> EP is not meaningful to those who don't know what it means.  But
> neither is ELPA.  People understand it only if they have been told.
> So EP is no worse than ELPA.
>
> WDYT?

There shouldn't be any reason for ELPA to rename itself, it should be
clear that MELPA is not official, as it is not pre-configured.

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  8:57                               ` Thibaut Verron
@ 2020-10-19  3:44                                 ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-19  3:44 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Perhaps in list-packages when it sees a non-GNU repo, or when it sees MELPA?

  > With the subtlety that non-GNU Elpa would not be a non-GNU repo?

Sorry that my words were confusing, but no, there would not be a
warning about Non-GNU ELPA.  We would make sure all the packages in
that repo would be ok to recommend, and indeed we would recommend it.


  > It does give the URL for the Mozilla store, with a warning that some
  > extensions may not be compatible with the goals of the GNU project,
  > and then it gives a list of vetted extensions.

As you've noticed, that issue and the MELPA issue are instances
of the same general class of situations.  They are affected by
the same factors.

However, the details are different, and what is right for one
is not necessarily right for the other.

The node References discusses these factors.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18 15:57                               ` Philip K.
@ 2020-10-19  3:48                                 ` Richard Stallman
  2020-10-19 11:36                                   ` Dmitry Gutov
  0 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-19  3:48 UTC (permalink / raw)
  To: Philip K.; +Cc: mve1, bugs, thibaut.verron, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > This is a weaker suggestion: Maybe packages could have a tag to signal
  > that they are related to proprietary software, that could be then
  > displayed both via list-packages and describe-package?

This approach depends on any number of people that we don't know
to include a special marker whenever they release packages that lead
the user to nonfree software.  Since these people eapparently
don't agree with our basic ideas about such packages, I don't think
we could count on them to do that.

  > > EP is not meaningful to those who don't know what it means.  But
  > > neither is ELPA.  People understand it only if they have been told.
  > > So EP is no worse than ELPA.
  > >
  > > WDYT?

  > There shouldn't be any reason for ELPA to rename itself, it should be
  > clear that MELPA is not official, as it is not pre-configured.

I have a feeling we are miscommunicating somehow here.  The point of
the renaming is simply to avoid a natural confusion in the minds of
people.


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-17  4:31                                       ` Qiantan Hong
@ 2020-10-19 10:12                                         ` Robert Pluim
  2020-10-19 16:15                                           ` Qiantan Hong
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Pluim @ 2020-10-19 10:12 UTC (permalink / raw)
  To: Qiantan Hong
  Cc: Marcel Ventosa, Jean Louis, rms@gnu.org, thibaut.verron@gmail.com,
	emacs-devel

>>>>> On Sat, 17 Oct 2020 04:31:09 +0000, Qiantan Hong <qhong@mit.edu> said:

    Qiantan> It seems that https://i.reddit.com/ <https://i.reddit.com/> works pretty well
    Qiantan> with LibreJS enabled. I assume it’s intended to
    Qiantan> be a JavaScript free version. Browsing and posting both works.

Does that site also work for registering an account on reddit with
LibreJS enabled?

Robert
-- 



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19  3:48                                 ` Richard Stallman
@ 2020-10-19 11:36                                   ` Dmitry Gutov
  2020-10-19 12:43                                     ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
                                                       ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-19 11:36 UTC (permalink / raw)
  To: rms, Philip K.; +Cc: mve1, thibaut.verron, bugs, emacs-devel

On 19.10.2020 06:48, Richard Stallman wrote:
> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]
> 
>    > This is a weaker suggestion: Maybe packages could have a tag to signal
>    > that they are related to proprietary software, that could be then
>    > displayed both via list-packages and describe-package?
> 
> This approach depends on any number of people that we don't know
> to include a special marker whenever they release packages that lead
> the user to nonfree software.  Since these people eapparently
> don't agree with our basic ideas about such packages, I don't think
> we could count on them to do that.

MELPA to a large part consists of a database of "recipes", one for each 
package that it builds and distributes. This tag can be put inside 
recipes, and thus be controlled by MELPA maintainers, and not by the 
packages authors themselves.

If we provide some well-defined criteria for such tags, and pick a 
neutral-enough name, I don't see why the MELPA maintainers (who are 
quite reasonable people IME) wouldn't go for it.

Question is, would you agree to add MELPA to the default list of package 
archives if they do?

We'll also have to discuss how the user interface would look when 
dealing with those tags.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 11:36                                   ` Dmitry Gutov
@ 2020-10-19 12:43                                     ` Jean Louis
  2020-10-19 15:55                                       ` Stefan Kangas
  2020-10-19 18:28                                       ` Vasilij Schneidermann
  2020-10-19 15:46                                     ` Proposal for an Emacs User Survey Drew Adams
  2020-10-20  5:14                                     ` Richard Stallman
  2 siblings, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-19 12:43 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: mve1, Philip K., rms, thibaut.verron, emacs-devel

This is related to MELPA subject and future Emacs repositories.

PROPRIETARY JAVASCRIPT ON MICROSOFT GITHUB ISSUE:
=================================================

I just guess that Github.com cannot be used with LibreJS, as I have
tried it, LibreJS report problems, this means all developers and
contributors to MELPA are automatically subjugated by Microsoft
Github, which is and was not the point of Emacs as free software part
of free operating system.

Additionally Github.com does not support many browsers, they publicly
say so, which in turn means that many users of free software browsers
from free software distributions are unable to access Github.com,
users of Github are supposed to use Firefox or Chrome or Microsoft
Browsers, while I am using Icecat and Iceweaseal-UXP from Hyperbola
GNU/Linux-libre -- so my experience with Github.com is narrowed, I
cannot access large parts of the website.

Developers using MELPA are misguided by Microsoft Github, and MELPA is
only following the popularity trend. Thus developers or old and new
contributors for reasons of getting included in MELPA are forced to
use non-free Javascript and browsers that are mostly not available on
free software distributions.

MELPA is telling users on its website that it is extensible, but
please "contribute your recipes via github, and we'll build the
packages", they are tageting Github, and thus lead Emacs users to use
non-free Javascript on Github. This is contradictory to purposes why
free software systems have been created.

There is https://savannah.nongnu.org then there is Trisquel hosting,
they would easily add Emacs packages without problem
https://devel.trisquel.info/users/sign_in then there are other
non-free Javascript and friendly free software hosting providers.

Could you maybe ask MELPA to switch to some free software hosting
sites for code, that way website would be accessible without using
proprietary Javascript.

That would be right direction to go for MELPA. 

It is good if we make incentive to those people who contribute to
MELPA to switch their hosting from Microsoft Github with proprietary
Javascript and their policies to some of free software hosting
providers, but what is really best is that MELPA switches to free
software hosting code providers.

AVOIDING EMACS PACKAGES WRAPPING PROPRIETARY SOFTWARE:
======================================================

This is other issue, it could be solved (as already somebody
mentioned) with one package to be developed in GNU ELPA, named similar
to "freedom-check" or even better as a built-in package that would
warn Emacs users about usage of non-free software or any other freedom
issues, it could ask user to disable those packages discovered on
system that are wrapping non-free software.

The package "freedom-check" would be for Emacs what is LibreJS on
browsers and what is "your-freedom" on Hyperbola GNU/Linux-libre and
other free software distributions.

It could disable or remove the packages that were installed to wrap
proprietary software. Additionally, it could disable repositories that
do not care about users' freedom and would tell users why is it so.

It would be good direction if such package is developed and then
beside being distributed on GNU ELPA, also injected in MELPA, as it
would be innovative package in users' interest, thus fully complying
with MELPA principles.

Let us not forget that inclusion of packages wrapping proprietary
software represents large security risk as well, not only that it
subjugates users or bring about a moral dillema.

OTHER SECURITY ISSUES ON MELPA:
===============================

For me largest security problem on MELPA is that Github.com is run by
Microsoft, we have no idea what principles they share beyond
commercial principles, and the more Emacs packages are hosted on
Microsoft Github, the more probability is there for mischievous
conduct or security breaches.

Same can be said for hosting providers that value free sofware,
security breaches are possible, but then we would know that people
maintaining the server do care of users enough, to prevent mischievous
conduct.

A package can be thus accepted in MELPA and become approved, then
later continuously updated, meaning without any control or
supervision, and then automatically offered to users. Backdoor can be
injected into users' Emacs and run on their computers. If I am wrong
on how MELPA works, you may tell me, that is what I understood from
their website.

SO FAR I KNOW there is no system of signing packages and verification
of such. I have verified MELPA git, and I cannot find that they are
using GnuPG or gpg or other system that packages were really made by
the author they claim to be made. This may be true at GNU ELPA too, I
did not verify it, but I know at that GNU ELPA is not automatically
built and offered to users blindly without verification (I at least
believe they are verified).

1. Github.com may not even know if somebody cracks some developer's
   account and changes few packages to misbehave, if they would be
   alerted, they would not maybe act in the best interest of the free
   software project, they would act in their own best interest.

2. MELPA managers do approve only GNU GPL or GPL compatible software
   to be included, they do not however continually verify or control
   the software, in fact they pull it by using recipes and build it
   automatically and offer automatically to users. Users in turn
   accept blindly packages, even though there is no mechanism to make
   sure that package was made by the author that was approved by
   MELPA. Let us say MELPA could maintain the list of public keys of
   authors, and then accept only packages that are signed by those
   same authors, before having them built, this would increase
   security this security issue, but not solve it, if packages are not
   verified by human.

3. Other issue is that users cannot trust MELPA only, as packages
   should be distributable from MELPA to other repositories, so each
   single package should be verifiable by user as well.

It is written in the Emacs manual: 41.4 Creating and Maintaining
Package Archives, that:

   Maintaining a public package archive entails a degree of
responsibility.  When Emacs users install packages from your archive,
those packages can cause Emacs to run arbitrary code with the
permissions of the installing user.  (This is true for Emacs code in
general, not just for packages.)  So you should ensure that your archive
is well-maintained and keep the hosting system secure.

   One way to increase the security of your packages is to “sign” them
using a cryptographic key.  If you have generated a private/public gpg
key pair, you can use gpg to sign the package like this:

     gpg -ba -o FILE.sig FILE

But it is not implemented into Emacs to verify packages being signed,
so my proposal is that Emacs get obligatory verification of a package
if such package is arriving from any repository and to warn user if
package was not signed. This would give initiative to MELPA to start
thinking about security issues.

That is one of reasons why Hyperbola GNU/Linux-libre and other
GNU/Linux distributions package some major Emacs packages, as that way
the package maintainers verify the package before it is included in
the free software distribution.

In the same manner Emacs should have a built-in package installation
procedure (that can be circumvented by users' configuration) to verify
all packages being installed by default.

Jean




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-19 11:36                                   ` Dmitry Gutov
  2020-10-19 12:43                                     ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
@ 2020-10-19 15:46                                     ` Drew Adams
  2020-10-19 16:42                                       ` Jean Louis
  2020-10-19 16:42                                       ` Thibaut Verron
  2020-10-20  5:14                                     ` Richard Stallman
  2 siblings, 2 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-19 15:46 UTC (permalink / raw)
  To: Dmitry Gutov, rms, Philip K.; +Cc: mve1, bugs, thibaut.verron, emacs-devel

> MELPA to a large part consists of a database of "recipes", one for each
> package that it builds and distributes. This tag can be put inside
> recipes, and thus be controlled by MELPA maintainers, and not by the
> packages authors themselves.
> 
> If we provide some well-defined criteria for such tags, and pick a
> neutral-enough name, I don't see why the MELPA maintainers (who are
> quite reasonable people IME) wouldn't go for it.

Just a minor comment/question about this, which
I think would be the first time such a thing
would be happening:

Do we really want to set a precedent that
someone other than the code author fiddles with
their code, adding comments or whatever?

Sure, the maintainers of a repo are, in a way,
administrators.  But should such administrators
be changing source code?  Adding other code or
whatever, to administer, label, treat, etc. the
code is, at least conceptually, different from
changing the source code itself.

No, adding a field/tag in a comment is not a big
deal.  And yes, GPL code is open to modification.

Still, is this a good door to open?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 12:43                                     ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
@ 2020-10-19 15:55                                       ` Stefan Kangas
  2020-10-19 16:38                                         ` Jean Louis
  2020-10-19 18:28                                       ` Vasilij Schneidermann
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-10-19 15:55 UTC (permalink / raw)
  To: Jean Louis, Dmitry Gutov
  Cc: mve1, Philip K., rms, thibaut.verron, emacs-devel

Jean Louis <bugs@gnu.support> writes:

>    One way to increase the security of your packages is to “sign” them
> using a cryptographic key.  If you have generated a private/public gpg
> key pair, you can use gpg to sign the package like this:
>
>      gpg -ba -o FILE.sig FILE
>
> But it is not implemented into Emacs to verify packages being signed,
> so my proposal is that Emacs get obligatory verification of a package
> if such package is arriving from any repository and to warn user if
> package was not signed. This would give initiative to MELPA to start
> thinking about security issues.
>
> That is one of reasons why Hyperbola GNU/Linux-libre and other
> GNU/Linux distributions package some major Emacs packages, as that way
> the package maintainers verify the package before it is included in
> the free software distribution.
>
> In the same manner Emacs should have a built-in package installation
> procedure (that can be circumvented by users' configuration) to verify
> all packages being installed by default.

We have signing of packages on the package archive side that is verified
by default when it exists.  See `package-check-signature'.  (If I'm not
mistaken, GNU ELPA signs packages but MELPA doesn't.  Please correct me
if I'm wrong.)

Note that package signatures still leaves us open to replay attacks.
See Bug#19479 and the branch scratch/package-security for an attempt to
improve the situation.

I think it would be useful if package archives could implement a
requirement for signed commits before building a new package.  This
could be optional or mandatory, and would buy us an additional layer of
protection against compromised developer credentials.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 10:12                                         ` Robert Pluim
@ 2020-10-19 16:15                                           ` Qiantan Hong
  2020-10-20 13:45                                             ` Dmitry Gutov
  0 siblings, 1 reply; 838+ messages in thread
From: Qiantan Hong @ 2020-10-19 16:15 UTC (permalink / raw)
  To: Robert Pluim
  Cc: Marcel Ventosa, Jean Louis, rms@gnu.org, thibaut.verron@gmail.com,
	emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 736 bytes --]

The funny icon on the top right doesn’t work,
But try
https://www.reddit.com/register.compact <https://www.reddit.com/register.compact>
and
https://www.reddit.com/login.compact <https://www.reddit.com/login.compact>

> On Oct 19, 2020, at 6:12 AM, Robert Pluim <rpluim@gmail.com> wrote:
> 
>>>>>> On Sat, 17 Oct 2020 04:31:09 +0000, Qiantan Hong <qhong@mit.edu> said:
> 
>    Qiantan> It seems that https://i.reddit.com/ <https://i.reddit.com/> works pretty well
>    Qiantan> with LibreJS enabled. I assume it’s intended to
>    Qiantan> be a JavaScript free version. Browsing and posting both works.
> 
> Does that site also work for registering an account on reddit with
> LibreJS enabled?
> 
> Robert
> -- 


[-- Attachment #1.2: Type: text/html, Size: 1820 bytes --]

[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 1858 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-08 15:30 Proposal for an Emacs User Survey Adrien Brochard
                   ` (2 preceding siblings ...)
  2020-10-09  3:35 ` Richard Stallman
@ 2020-10-19 16:20 ` Philip K.
  2020-10-19 19:44   ` Dmitry Gutov
  2020-10-20  5:19   ` Richard Stallman
  3 siblings, 2 replies; 838+ messages in thread
From: Philip K. @ 2020-10-19 16:20 UTC (permalink / raw)
  To: emacs-devel


I can't seem to find anyone here mentioning it, but it seems the survey
has been opened today:

    https://emacssurvey.org/

Sadly, it seems like they decided to use non-free JS for the web-form
variant :(

Adrien Brochard <abrochard@gmx.com> writes:

> Hi everyone,
>
> I posted on reddit.com/r/emacs yesterday a proposal to craft and
> distribute a survey for Emacs users to better grasp the diversity and
> various usages out there. I got some very good feedback but there could
> always be more.
>
> The main points that need to be worked out are:
> 1. the actual questions to be asked
> 2. the platform to collect responses
>
> Regarding the questions, I have a decent skeleton and a lot of suggestions.
>
> But the for the platform to collect responses, this is where it gets
> difficult. Something like a Google survey might the easiest/cheapest to
> make and distribute and will work on most devices, but it obviously has
> privacy concerns. On the other hand, doing something like self-hosting a
> no-JS form is very time consuming. I was also thinking of allowing
> responses via email for people who do not want to bother with a survey
> link and then manually reconcile responses.
>
> Links to the posts with the tentative questions:
> -
> https://www.reddit.com/r/emacs/comments/j6x7ad/proposal_for_an_emacs_user_survey/
> -
> https://www.reddit.com/r/emacs/comments/b2fh4y/help_reviewprovide_feedback_on_state_of_emacs/
>
> Thank you for reading!
> Best,
> Adrien
>
>

-- 
	Philip K.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 15:55                                       ` Stefan Kangas
@ 2020-10-19 16:38                                         ` Jean Louis
  2020-10-19 17:30                                           ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-19 16:38 UTC (permalink / raw)
  To: Stefan Kangas
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Dmitry Gutov

* Stefan Kangas <stefankangas@gmail.com> [2020-10-19 18:55]:
> We have signing of packages on the package archive side that is verified
> by default when it exists.  See `package-check-signature'.  (If I'm not
> mistaken, GNU ELPA signs packages but MELPA doesn't.  Please correct me
> if I'm wrong.)

Now I know about that. It was allow-unsigned as default, correct me if
mistaken. The more packages there are around, the more this becomes
potential problem, it is security hole, as warnings about potential
problems are too few.

Now when I turned it on, I cannot see or feel that some package was
verified, I tried installing from ELPA, but did not see any
difference, and cannot find any .sig files.

It would be good for user to get those verifications, as verification
should be doable personally.

Package signing is not ultimate security, it is just one level making
packages more secure.

> Note that package signatures still leaves us open to replay attacks.
> See Bug#19479 and the branch scratch/package-security for an attempt to
> improve the situation.

> I think it would be useful if package archives could implement a
> requirement for signed commits before building a new package.  This
> could be optional or mandatory, and would buy us an additional layer of
> protection against compromised developer credentials.

I have seen there apparently good recommendation for improvement of
package security.

But we do not have it.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 15:46                                     ` Proposal for an Emacs User Survey Drew Adams
@ 2020-10-19 16:42                                       ` Jean Louis
  2020-10-20  5:19                                         ` Richard Stallman
  2020-10-19 16:42                                       ` Thibaut Verron
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-19 16:42 UTC (permalink / raw)
  To: Drew Adams
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Dmitry Gutov

* Drew Adams <drew.adams@oracle.com> [2020-10-19 18:48]:
> > MELPA to a large part consists of a database of "recipes", one for each
> > package that it builds and distributes. This tag can be put inside
> > recipes, and thus be controlled by MELPA maintainers, and not by the
> > packages authors themselves.
> > 
> > If we provide some well-defined criteria for such tags, and pick a
> > neutral-enough name, I don't see why the MELPA maintainers (who are
> > quite reasonable people IME) wouldn't go for it.
> 
> Just a minor comment/question about this, which
> I think would be the first time such a thing
> would be happening:
> 
> Do we really want to set a precedent that
> someone other than the code author fiddles with
> their code, adding comments or whatever?
> 
> Sure, the maintainers of a repo are, in a way,
> administrators.  But should such administrators
> be changing source code?  Adding other code or
> whatever, to administer, label, treat, etc. the
> code is, at least conceptually, different from
> changing the source code itself.
> 
> No, adding a field/tag in a comment is not a big
> deal.  And yes, GPL code is open to modification.
> 
> Still, is this a good door to open?

That is similar to how many GNU/Linux software packages are
maintained, often they are modified before such enter distribution for
final users.

I do not care if package is original, not original, forked or not
forked, modified, what I care is which group of people is making it
trusted and by which principles.

If nobody is making package verifications by looking into it, then
such package is not trusted to me, with or without PGP signature, it
does not matter any more.

That is why some GNU/Linux distributions have so many maintainers,
each is responsible for some packages, there is no warranty, but there
is some implied moral obligation at least. Some OS like OpenBSD have
better security policies, they verify the code for security, not just
package and wrap it for delivery.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 15:46                                     ` Proposal for an Emacs User Survey Drew Adams
  2020-10-19 16:42                                       ` Jean Louis
@ 2020-10-19 16:42                                       ` Thibaut Verron
  2020-10-19 16:53                                         ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-19 16:42 UTC (permalink / raw)
  To: Drew Adams
  Cc: Philip K., Richard Stallman, Jean Louis, Marcel Ventosa,
	emacs-devel, Dmitry Gutov

Le lun. 19 oct. 2020 à 17:48, Drew Adams <drew.adams@oracle.com> a écrit :
>
> > MELPA to a large part consists of a database of "recipes", one for each
> > package that it builds and distributes. This tag can be put inside
> > recipes, and thus be controlled by MELPA maintainers, and not by the
> > packages authors themselves.
> >
> > If we provide some well-defined criteria for such tags, and pick a
> > neutral-enough name, I don't see why the MELPA maintainers (who are
> > quite reasonable people IME) wouldn't go for it.
>
> Just a minor comment/question about this, which
> I think would be the first time such a thing
> would be happening:
>
> Do we really want to set a precedent that
> someone other than the code author fiddles with
> their code, adding comments or whatever?
>
> Sure, the maintainers of a repo are, in a way,
> administrators.  But should such administrators
> be changing source code?  Adding other code or
> whatever, to administer, label, treat, etc. the
> code is, at least conceptually, different from
> changing the source code itself.
>
> No, adding a field/tag in a comment is not a big
> deal.  And yes, GPL code is open to modification.
>
> Still, is this a good door to open?

I'm not sure to understand the question. The recipes are stored in the
Melpa repository, so the maintainers of the repo are really the
maintainers of the source code (the recipes).

The recipes are written by the authors of the package, by forking and
filing a request to merge into the Melpa repository.

So if the administrators of Melpa agree to it, they are entirely in
their prerogative to alter the recipes provided by the users in their
code (list of recipes). It's not really different from adding a
comment to clarify a bug fix by an external contributor after the code
is merged.

They would not be modifying the code of the packages themselves, of course.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: Proposal for an Emacs User Survey
  2020-10-19 16:42                                       ` Thibaut Verron
@ 2020-10-19 16:53                                         ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-10-19 16:53 UTC (permalink / raw)
  To: thibaut.verron
  Cc: Philip K., Richard Stallman, Jean Louis, Marcel Ventosa,
	emacs-devel, Dmitry Gutov

> They would not be modifying the code of the packages themselves, of course.

I see.  I thought that was the case.
I didn't realize the "tag" would be in the recipe,
not in the submitted source code.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 16:38                                         ` Jean Louis
@ 2020-10-19 17:30                                           ` Stefan Monnier
  2020-10-19 17:47                                             ` Jean Louis
  2020-10-19 18:53                                             ` Stefan Kangas
  0 siblings, 2 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-10-19 17:30 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

> verified, I tried installing from ELPA, but did not see any

Side note: "ELPA" is the name of the protocol/infrastructure.
So now I don't know if you installed from Mermelada, GNU ELPA, MELPA, or
yet some other ELPA archive.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 17:30                                           ` Stefan Monnier
@ 2020-10-19 17:47                                             ` Jean Louis
  2020-10-19 18:02                                               ` Stefan Monnier
  2020-10-19 18:53                                             ` Stefan Kangas
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-19 17:47 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

* Stefan Monnier <monnier@iro.umontreal.ca> [2020-10-19 20:31]:
> > verified, I tried installing from ELPA, but did not see any
> 
> Side note: "ELPA" is the name of the protocol/infrastructure.
> So now I don't know if you installed from Mermelada, GNU ELPA, MELPA, or
> yet some other ELPA archive.

Alright I understood it so from info document.

When enabled, that variable we spoke about that should be T to verify
packages, it is I assume general for any package archive. So I have
tried installing some from ELPA and did not see any difference.

By the way, Marmelade is not eatable any more.

There are just few well known, ELPA, Org and MELPA.

It would be good that package authors start publishing their own
repositories to decentralize and ensure better of security. I would
trust some authors more if I am getting their packages from their
domain, signed by their keys.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 17:47                                             ` Jean Louis
@ 2020-10-19 18:02                                               ` Stefan Monnier
  2020-10-19 19:04                                                 ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-10-19 18:02 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

> tried installing some from ELPA and did not see any difference.

What difference did you expect to see?

> There are just few well known, ELPA, Org and MELPA.

Again, there is no ELPA archive named "ELPA".
Please try and avoid spreading the confusion between ELPA and GNU ELPA.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 12:43                                     ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
  2020-10-19 15:55                                       ` Stefan Kangas
@ 2020-10-19 18:28                                       ` Vasilij Schneidermann
  2020-10-19 19:00                                         ` ELPA security (was: Proposal to include obligatory PGP verification of packages from any repository) Stefan Monnier
                                                           ` (2 more replies)
  1 sibling, 3 replies; 838+ messages in thread
From: Vasilij Schneidermann @ 2020-10-19 18:28 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Dmitry Gutov

[-- Attachment #1: Type: text/plain, Size: 15712 bytes --]

As someone working in information security, I feel compelled to reply to
this in detail as your email contains several claims I am not
comfortable with being taken at face value.

> I just guess that Github.com cannot be used with LibreJS, as I have
> tried it, LibreJS report problems, this means all developers and
> contributors to MELPA are automatically subjugated by Microsoft
> Github, which is and was not the point of Emacs as free software part
> of free operating system.

There is a difference between trying (enabling LibreJS and looking at
how many scripts it blocked) and trying (enabling LibreJS and actually
using the website while paying attention to how functional it is).  Out
of curiosity I've attempted the latter as it's a more meaningful test,
using the latest version of Firefox Developer Edition on Arch:

- Repositories can be created
- Issues can be created
- Forks can be created
- Pull requests can be created, with the limitation that the merge
  preview is broken.  This doesn't matter though as it's up to MELPA
  maintainers to review the pull request.
- Account creation is broken.  I can fill out the first screen
  (username, email address, password), then get stuck on the second
  screen as it relies on an external CAPTCHA service.  I suspect I can
  complete the process by temporarily allowing the JS script and
  continue contributing to repositories, but haven't verified that
  part.

My verdict so far: Github almost passes the test.  If one does have an
account already (from what I've seen you do), there is no excuse for you
to not contribute.  If one doesn't, they'll have to ponder whether
whitelisting the CAPTCHA is worth it.

> Additionally Github.com does not support many browsers, they publicly
> say so, which in turn means that many users of free software browsers
> from free software distributions are unable to access Github.com,
> users of Github are supposed to use Firefox or Chrome or Microsoft
> Browsers, while I am using Icecat and Iceweaseal-UXP from Hyperbola
> GNU/Linux-libre -- so my experience with Github.com is narrowed, I
> cannot access large parts of the website.

From a security perspective it's a bad idea to use any browser outside
of the main stream as only the largest browser vendors manage keeping up
to speed with security issues.  While one can use a browser based on
them, there will be issues.  As a side point, Debian settled its
trademark dispute with Mozilla and no longer offers rebranded versions
of Firefox.  Therefore Debian users will not face browser
incompatibility problems and avoid such security issues.

Something else worth trying is hub [1].  It seems to allow performing
the expected contribution workflow from the command line.

> Developers using MELPA are misguided by Microsoft Github, and MELPA is
> only following the popularity trend. Thus developers or old and new
> contributors for reasons of getting included in MELPA are forced to
> use non-free Javascript and browsers that are mostly not available on
> free software distributions.
> 
> MELPA is telling users on its website that it is extensible, but
> please "contribute your recipes via github, and we'll build the
> packages", they are tageting Github, and thus lead Emacs users to use
> non-free Javascript on Github. This is contradictory to purposes why
> free software systems have been created.

This is a regrettable aspect of MELPA (although I disagree with non-free
JavaScript or security being a problem), I don't have expectations for
it to change as MELPA's philosophy revolves around the central principle
of going with the most convenient mode of operation for developers to
publish their packages:

- Use Github, the most popular gratis Git hosting service
- Use Github's contribution workflow (forking and "pull requests")
- Automatically fetch packages from developers (as opposed to having
  them submit/upload new versions)
- Automatically rebuild packages after each detected commit
- Remove support for unpopular alternative workflows to reduce
  maintenance effort (Emacswiki, Bazaar, CVS, Darcs, Fossil, Subversion)

One does not share a package on MELPA to further the goals of the free
software movement, one does so to reach as many Emacs users as possible
with relatively little effort (which excludes GNU ELPA, we'll have to
see whether the same holds true for non-GNU ELPA).

> There is https://savannah.nongnu.org then there is Trisquel hosting,
> they would easily add Emacs packages without problem
> https://devel.trisquel.info/users/sign_in then there are other
> non-free Javascript and friendly free software hosting providers.

Savannah does not strike me as an adequate alternative for people used
to Github.  For starters it requires approval of each project before
it's publicly visible.  I'll have to do a proper evaluation of it though
before I can comment further on this aspect.  Gitlab is the closest
equivalent, though not perfect either.  For minimalism and integration
of an email-centric workflow sourcehut looks ideal, once it leaves its
alpha status.

> Could you maybe ask MELPA to switch to some free software hosting
> sites for code, that way website would be accessible without using
> proprietary Javascript.
> 
> That would be right direction to go for MELPA. 
> 
> It is good if we make incentive to those people who contribute to
> MELPA to switch their hosting from Microsoft Github with proprietary
> Javascript and their policies to some of free software hosting
> providers, but what is really best is that MELPA switches to free
> software hosting code providers.

As elaborated above, it is unlikely to happen.  Adherence to GNU
principles for non-GNU projects is not a priority.  See also the MELPA
maintainers' response to a thread you've created [2].

> This is other issue, it could be solved (as already somebody
> mentioned) with one package to be developed in GNU ELPA, named similar
> to "freedom-check" or even better as a built-in package that would
> warn Emacs users about usage of non-free software or any other freedom
> issues, it could ask user to disable those packages discovered on
> system that are wrapping non-free software.
> 
> The package "freedom-check" would be for Emacs what is LibreJS on
> browsers and what is "your-freedom" on Hyperbola GNU/Linux-libre and
> other free software distributions.
> 
> It could disable or remove the packages that were installed to wrap
> proprietary software. Additionally, it could disable repositories that
> do not care about users' freedom and would tell users why is it so.
> 
> It would be good direction if such package is developed and then
> beside being distributed on GNU ELPA, also injected in MELPA, as it
> would be innovative package in users' interest, thus fully complying
> with MELPA principles.

This is an interesting idea, though it will require continuous updates
for best effect.  Even if it doesn't prove to be effective in practice,
having a detailed list of what exactly is a problem to one's freedoms
would be a useful side effect for users caring about this.

> For me largest security problem on MELPA is that Github.com is run by
> Microsoft, we have no idea what principles they share beyond
> commercial principles, and the more Emacs packages are hosted on
> Microsoft Github, the more probability is there for mischievous
> conduct or security breaches.
> 
> Same can be said for hosting providers that value free sofware,
> security breaches are possible, but then we would know that people
> maintaining the server do care of users enough, to prevent mischievous
> conduct.

This argument does not follow.  A code forge can have security issues,
no matter whether its code can be freely audited or the political
alignment of its owners.  Merely being concerned about free software
doesn't mean that security issues will be investigated and acted upon,
neither does ownership by an entity pursuing different goals mean it
will neglect security issues.

I've briefly looked into Savannah's source code and found enough
evidence of it not being securely designed and requiring an in-depth
source code review.  While talking to a security-related contact person
I've been told that there was indeed a little-known security breach long
time ago.  Linus' law [3] seems a more appropriate hypothesis to explain
this behavior, depending on the visibility and amount of people actively
looking into a code forge, there will be more publicized security
incidents and attempts to improve overall security of the project.
Freedom and political alignment of the project are at best tangentially
related.

> A package can be thus accepted in MELPA and become approved, then
> later continuously updated, meaning without any control or
> supervision, and then automatically offered to users. Backdoor can be
> injected into users' Emacs and run on their computers. If I am wrong
> on how MELPA works, you may tell me, that is what I understood from
> their website.

That is indeed correct, there is no further quality assurance after the
initial submission.  It takes a significant amount of time for that
submission to be verified due to the few reviewers and given the sheer
amount of packages (4750 packages at the time of writing), I do not see
this working out with their current team.  For comparison, Arch has
"Trusted Users" responsible for their official packages, with anywhere
between 5 and 90 packages assigned to each of them.  Rest assured that
they don't perform security audits, only basic quality assurance as
packages are updated and bugs trickle in.  Having the kind of work force
a GNU/Linux distribution has is a luxury, not something to take for
granted.

That aside, how does this quality assurance look like for GNU ELPA?  Is
it users subscribing to a commit mailing list and looking out for
anything suspect?  Fewer releases overall?  A basic level of vetting by
asking for copyright assignment?  I doubt that code is audited for every
release either and that security issues are instead dealt with in a
reactive instead of proactive manner (meaning, as soon as one is known
of, appropriate measures such as a security release are taken).  There
is a lot more work to be done here, such as defining a comprehensive
threat model to work with.  Another important aspect: Say that non-GNU
ELPA manages to catch up with MELPA in terms of package count, does the
existing review system still work?  Will new measures be necessary to
guarantee security (for example by designing packages in terms of a more
restrictive approach with permissions, sandboxing and whatnot)?  I
strongly suspect that they will be and merely mirroring MELPA packages
won't suffice.

> SO FAR I KNOW there is no system of signing packages and verification
> of such. I have verified MELPA git, and I cannot find that they are
> using GnuPG or gpg or other system that packages were really made by
> the author they claim to be made. This may be true at GNU ELPA too, I
> did not verify it, but I know at that GNU ELPA is not automatically
> built and offered to users blindly without verification (I at least
> believe they are verified).

As mentioned above, MELPA's principle of going with the most convenient
option makes this a non-starter.  Vetting package authors for their
identity, requiring a GPG key and signed releases is something I'd
rather expect for GNU ELPA than them.

> 1. Github.com may not even know if somebody cracks some developer's
>    account and changes few packages to misbehave, if they would be
>    alerted, they would not maybe act in the best interest of the free
>    software project, they would act in their own best interest.

Github offers 2FA to protect accounts and has a dedicated security team
reacting to incidents.  I don't see signs of either for Savannah.  The
only point in favor of Savannah is it being relatively unknown and
therefore of less interest to attackers, but I wouldn't rely on that as
my only level of defense.

That aside, it's not even necessary to hack an account to distribute
malicious software.  Popular package archives for other programming
languages have seen attacks such as typo squatting [4]creating
(uploading a package with a misleading name) and hostile maintainers [5]
(where a package is transfered to a new maintainer who then abuses the
trust created by the package by adding malicious code to it).  I have to
confess I've pondered creating a malicious package for demonstrating how
easy it would be to sneak something in without anyone noticing, but I'm
afraid it will only lead to more emails sowing Fear, Uncertainty and
Doubt.  Or people weaponizing the code, not sure is likelier.

> 2. MELPA managers do approve only GNU GPL or GPL compatible software
>    to be included, they do not however continually verify or control
>    the software, in fact they pull it by using recipes and build it
>    automatically and offer automatically to users. Users in turn
>    accept blindly packages, even though there is no mechanism to make
>    sure that package was made by the author that was approved by
>    MELPA. Let us say MELPA could maintain the list of public keys of
>    authors, and then accept only packages that are signed by those
>    same authors, before having them built, this would increase
>    security this security issue, but not solve it, if packages are not
>    verified by human.

For this to be effective, one needs to build upon trust.  I doubt the
average Emacs user has thought in depth what package developers to trust
and whether they should verify packages installed to come from them.
And again, with MELPA's philosophy being one of convenience, I don't see
that happening.

>    One way to increase the security of your packages is to “sign” them
> using a cryptographic key.  If you have generated a private/public gpg
> key pair, you can use gpg to sign the package like this:
> 
>      gpg -ba -o FILE.sig FILE
> 
> But it is not implemented into Emacs to verify packages being signed,
> so my proposal is that Emacs get obligatory verification of a package
> if such package is arriving from any repository and to warn user if
> package was not signed. This would give initiative to MELPA to start
> thinking about security issues.

Emacs does have basic verification already, but it is far from ideal.
The failure case is not handled well at all, users are not told what to
do when it fails verifying a package and are inclined to instead disable
the mechanism once and for all.  If an Emacs is too old to contain the
appropriate GPG keys, the keyring will be needed to be updated outside
of Emacs, a task that can fail for opaque reasons due to key servers
being unreachable.  There is initial work in form of the
gnu-elpa-keyring-update package distributed via GNU ELPA, but it suffers
from a bootstrapping problem and needs to be installed *before* the keys
become outdated.  Until this issue is solved, I cannot imagine making
this opt-out or even mandatory.  For comparison, Arch ships its own
package manager specific GPG keyring and updates it during each package
update operation.

[1]: https://github.com/github/hub
[2]: https://github.com/melpa/melpa/issues/7185
[3]: "Given enough eyeballs, all bugs are shallow."
[4]: https://incolumitas.com/2016/06/08/typosquatting-package-managers/
[5]: https://snyk.io/blog/a-post-mortem-of-the-malicious-event-stream-backdoor/

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 17:30                                           ` Stefan Monnier
  2020-10-19 17:47                                             ` Jean Louis
@ 2020-10-19 18:53                                             ` Stefan Kangas
  2020-10-19 18:57                                               ` Vasilij Schneidermann
  2020-10-19 19:20                                               ` Stefan Monnier
  1 sibling, 2 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-10-19 18:53 UTC (permalink / raw)
  To: Stefan Monnier, Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Dmitry Gutov

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

> Side note: "ELPA" is the name of the protocol/infrastructure.
> So now I don't know if you installed from Mermelada, GNU ELPA, MELPA, or
> yet some other ELPA archive.

Is Mermelada the Hispanic version of Marmalade?

PS. In other news, I get a 502 Bad Gateway error now when visiting
     https://marmalade-repo.org/



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 18:53                                             ` Stefan Kangas
@ 2020-10-19 18:57                                               ` Vasilij Schneidermann
  2020-10-19 19:20                                               ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: Vasilij Schneidermann @ 2020-10-19 18:57 UTC (permalink / raw)
  To: Stefan Kangas
  Cc: Philip K., Jean Louis, thibaut.verron, mve1, emacs-devel,
	Stefan Monnier, Dmitry Gutov, rms

[-- Attachment #1: Type: text/plain, Size: 298 bytes --]

> PS. In other news, I get a 502 Bad Gateway error now when visiting
>      https://marmalade-repo.org/

I've poked other people to poke Nic Ferrier who then promised on Twitter
to look into it soonish.  His website seems to be affected as well, so I
hope it's just a misconfiguration of the host.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* ELPA security (was: Proposal to include obligatory PGP verification of packages from any repository)
  2020-10-19 18:28                                       ` Vasilij Schneidermann
@ 2020-10-19 19:00                                         ` Stefan Monnier
  2020-10-19 19:50                                         ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
  2020-10-20  5:17                                         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-10-19 19:00 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Dmitry Gutov

> That aside, how does this quality assurance look like for GNU ELPA?
> Is it users subscribing to a commit mailing list and looking out for
> anything suspect?

Kind of, tho there's no such statement of intent.

There's a mailing-list where most(!) commits get sent, and some people
subscribe to it, but there's no reason to assume that they subscribe to
it specifically to review commits, let alone keeping an eye out for
quality or security issues.

I'm pretty sure several commits sent to the list aren't (re)viewed by
anyone at all.

I do subscribe to that mailing-list and perform a basic amount of
reviewing, but it's more geared towards catching mishaps and helping
contributors improve their code.  It wouldn't take much effort for an
attacker to make sure I don't look at his backdoor, I think.

> Fewer releases overall?

Definitely.

> I doubt that code is audited for every release either and that
> security issues are instead dealt with in a reactive instead of
> proactive manner (meaning, as soon as one is known of, appropriate
> measures such as a security release are taken).

Definitely.  The main source of "proactive" security is the fact that
the code is fully visible to anyone who wants to look, and the presumed
low benefits of introducing a backdoor in an ELisp package.

> Another important aspect: Say that non-GNU ELPA manages to catch up
> with MELPA in terms of package count, does the existing review system
> still work?

I think it'd largely end up similar to MELPA.

> Will new measures be necessary to guarantee security (for example by
> designing packages in terms of a more restrictive approach with
> permissions, sandboxing and whatnot)?  I strongly suspect that they
> will be and merely mirroring MELPA packages won't suffice.

The nature of ELisp makes sandboxing/permissions pretty difficult to
implement, so I think we'll just hope for the best, like MELPA does.

An alternative might be a system where we force/require some minimal
amount of code review before publishing a package, which may work if the
ELPA archive is popular enough that the annoyance of delayed releases
motivates people to contribute to the review effort rather than to
move to a more permissive archive.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 18:02                                               ` Stefan Monnier
@ 2020-10-19 19:04                                                 ` Jean Louis
  2020-10-19 20:17                                                   ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-19 19:04 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

* Stefan Monnier <monnier@iro.umontreal.ca> [2020-10-19 21:02]:
> > tried installing some from ELPA and did not see any difference.
> 
> What difference did you expect to see?

I really expected to see that it is verified, like some message,
feedback in the Message buffer, but it just goes very silent, thus
user has to rely that package vas checked.

The name of function package-check-signature gives me more impression
that if I am the one who is setting the variable, that I would be in
some kind of control to know that signature of the package is checked.

Without message I see nothing, so Emacs is checking, but user does not
know that package was checked for signature.

I would rather expect message shown, just as it is not shown for
unsigned packages.

> > There are just few well known, ELPA, Org and MELPA.
> 
> Again, there is no ELPA archive named "ELPA".
> Please try and avoid spreading the confusion between ELPA and GNU ELPA.

That is right, I understand, so instead of ELPA which is meant for
general protocol, is better to say GNU ELPA.

Regarding packages in GNU ELPA, can I now assume they are all signed?

Is there a policy that GNU ELPA packages should be signed? That policy
would be good to have.

What I expect is a method for user to easily verify and know by which
key was which package signed, such function should exist.

I also expect that such verification should be by default, but default
was to accept unsigned, which is security issue in Emacs. Today is
common from package managers to expect at least automatic verification
of signatures.

It would be better if Emacs is delivered with the variable:
package-check-signature to be by default at least T or ALL to verify
all signatures.

Right now default is to accept unsigned. I am very surprised.

What I would like to see is:

  If the package-check-signature variable is for all types from
  packages, those downloaded any how, or from file system, and for
  those from archives, that ne wvariable is implemented so that
  packages downloaded from various centralized archives shall be
  checked for signature by DEFAULT.

- new variable: package-from-archive-check-signature to be by default
  T to check signature, with the warning in the description of the
  variable. 

- current variable: package-check-signature, for this one, I still
  study if it is valid for any packages, I can see I could install
  package from file without being checked for signature. So that is
  not my expectation, it probably works only for packages from
  archive, but not for any packages. My expectation is when this
  variable is set that it verifies all packages that user is
  installing.

  If there is only intended use of this variable for archive packages,
  then it is fine, but then documentation should not just say: Non-nil
  means to check package signatures when installing, but it should
  refer to package installing from archives

  I am installing often packages from file system by using
  package-install-file

- in that case that variable does not affect other sources but
  archives, users shall be warned in documentation strings or info
  that installing packages is risky activity.

What I wish to say, which may not be liked by many, I would like that
variable ensures that packages delivered through any current or future
onlinen archives are by default verified to be signed. This would
increase general security for Emacs users.

This would make necessity for MELPA to secure the packages by signing
them, thus giving little more safety to users.

As the situation how we have it now, those users of MELPA who value
the number of 4700+ packages being offered are more and more exposed
to potential risks.

There will be other repositories, anybody can then duplicate the
packages, but they cannot change signatures, they would need to make
new signatures, at least there would be some trace which key signed
which package.

Is making archive packages checkable by default for signatures
difficult for some practical reasons other than forcing MELPA to offer
new security level?





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 18:53                                             ` Stefan Kangas
  2020-10-19 18:57                                               ` Vasilij Schneidermann
@ 2020-10-19 19:20                                               ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-10-19 19:20 UTC (permalink / raw)
  To: Stefan Kangas
  Cc: Philip K., Jean Louis, rms, thibaut.verron, mve1, emacs-devel,
	Dmitry Gutov

>> Side note: "ELPA" is the name of the protocol/infrastructure.
>> So now I don't know if you installed from Mermelada, GNU ELPA, MELPA, or
>> yet some other ELPA archive.
> Is Mermelada the Hispanic version of Marmalade?

Interesting mistake, indeed ;-)


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 16:20 ` Philip K.
@ 2020-10-19 19:44   ` Dmitry Gutov
  2020-10-20  5:19   ` Richard Stallman
  1 sibling, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-19 19:44 UTC (permalink / raw)
  To: Philip K., emacs-devel

On 19.10.2020 19:20, Philip K. wrote:
> I can't seem to find anyone here mentioning it, but it seems the survey
> has been opened today:
> 
>      https://emacssurvey.org/
> 
> Sadly, it seems like they decided to use non-free JS for the web-form
> variant:(

That's unfortunate.

Still, they included added the free-form option.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 18:28                                       ` Vasilij Schneidermann
  2020-10-19 19:00                                         ` ELPA security (was: Proposal to include obligatory PGP verification of packages from any repository) Stefan Monnier
@ 2020-10-19 19:50                                         ` Jean Louis
  2020-10-20  5:17                                         ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-19 19:50 UTC (permalink / raw)
  To: emacs-devel; +Cc: mve1, Philip K., rms, thibaut.verron, Dmitry Gutov

* Vasilij Schneidermann <mail@vasilij.de> [2020-10-19 21:29]:
> There is a difference between trying (enabling LibreJS and looking at
> how many scripts it blocked) and trying (enabling LibreJS and actually
> using the website while paying attention to how functional it is).  Out
> of curiosity I've attempted the latter as it's a more meaningful test,
> using the latest version of Firefox Developer Edition on Arch:

I am not using Arch for reason that they allow any kind of proprietary
software in GNU/Linux distribution, there are some freedom issues with
Firefox, so I am using IceCat derivative or Iceweasel-uxp and I could
not access activities.

Further, I am faced with the warning by Github that my browser is not
supported.

And I do know that with LibreJS enabled, many functions work, some
functions do not work. I did not test extensively.

> My verdict so far: Github almost passes the test.  If one does have an
> account already (from what I've seen you do), there is no excuse for you
> to not contribute.

I would also say if developers can use Github they can as well use
various libre online hosting systems.

> > Additionally Github.com does not support many browsers, they publicly
> > say so, which in turn means that many users of free software browsers
> > from free software distributions are unable to access Github.com,
> > users of Github are supposed to use Firefox or Chrome or Microsoft
> > Browsers, while I am using Icecat and Iceweaseal-UXP from Hyperbola
> > GNU/Linux-libre -- so my experience with Github.com is narrowed, I
> > cannot access large parts of the website.
> 
> From a security perspective it's a bad idea to use any browser outside
> of the main stream as only the largest browser vendors manage keeping up
> to speed with security issues. While one can use a browser based on
> them, there will be issues.  As a side point, Debian settled its
> trademark dispute with Mozilla and no longer offers rebranded versions
> of Firefox.  Therefore Debian users will not face browser
> incompatibility problems and avoid such security issues.

Since 2016, I am not using Debian GNU/Linux on our internal computers
for reason that they guide users to non-free firmware and help users
enable non-free repositories. I am using exclusively free software
operating systems, see: http://www.gnu.org/distros/free-distros.html

I am not sure for all of them, but I do not use what you use.

And I am not following the main stream, and I am behind bad networks,
my case is particular and personal, I am using eww, and even by using
eww I can find github.com link to clone repository, in that sense
github.com is usable, that still does not make their javascript free
software, and users of free software should not be guided to non-free
software, be it javascript.

Trisquel project, and Savannah, many others, like Gitlab, they also
offer free code hosting without proprietary software. It means all
those developers could switch.

> One does not share a package on MELPA to further the goals of the free
> software movement, one does so to reach as many Emacs users as possible
> with relatively little effort (which excludes GNU ELPA, we'll have to
> see whether the same holds true for non-GNU ELPA).

That is exactly what we are both talking about, thanks.

Packages from MELPA are not signed, can you maybe recommend from
security perspective that each author start signing their packages?

> > There is https://savannah.nongnu.org then there is Trisquel hosting,
> > they would easily add Emacs packages without problem
> > https://devel.trisquel.info/users/sign_in then there are other
> > non-free Javascript and friendly free software hosting providers.
> 
> Savannah does not strike me as an adequate alternative for people used
> to Github.  For starters it requires approval of each project before
> it's publicly visible.  I'll have to do a proper evaluation of it though
> before I can comment further on this aspect.  Gitlab is the closest
> equivalent, though not perfect either.  For minimalism and integration
> of an email-centric workflow sourcehut looks ideal, once it leaves its
> alpha status.

Maybe also the money is problem, as maintainers would by hosting
themselves, be paying themselves.

But price of freedom we all pay.

I make extensive travels to find proper computers that I can liberate
from Intel spying engine, and install libreboot, so the price I am
paying personally, so the price for hosting can be also somehow paid.

Various projects such as Trisquel would be welcoming new Emacs package
developers on their Gitlab instances.

> > For me largest security problem on MELPA is that Github.com is run by
> > Microsoft, we have no idea what principles they share beyond
> > commercial principles, and the more Emacs packages are hosted on
> > Microsoft Github, the more probability is there for mischievous
> > conduct or security breaches.
> > 
> > Same can be said for hosting providers that value free sofware,
> > security breaches are possible, but then we would know that people
> > maintaining the server do care of users enough, to prevent mischievous
> > conduct.
> 
> This argument does not follow.  A code forge can have security issues,
> no matter whether its code can be freely audited or the political
> alignment of its owners.  Merely being concerned about free software
> doesn't mean that security issues will be investigated and acted upon,
> neither does ownership by an entity pursuing different goals mean it
> will neglect security issues.

I am very practical, I am trusting OpenBSD various teams to make the
LibreSSL how it should be, I am trusting them with various security
issues like in OpenSSH, for reasons of their principles set long time
ago. So I am trusting various smaller communities such as those of
Guix, Trisquel, Hyperbola GNU/Linux-libre, for reason that they act
upon the notices related to freedom, security, you name it. For their
agility and responsiveness. I trust GNU packages and people behind it
for obviously good responsiveness in handling user issues or bugs.

I cannot trust Archlinux to handle issues of freedom because their
policy is such that they will include proprietary software if
proprietor is allowing them, and if they have such policy, then I
cannot trust them with security issues too.

You are right that all hostings or let us say digital backgrounds can
be compromised, but if proprietary background is compromised such as
Microsoft Github, for reasons of their business interests I cannot
trust them to be transparent, unless third party have found security
issue.

For free software communities, some of them I mentioned, I can trust
them based on my experience with them, to be very transparent with
security issues.

> > A package can be thus accepted in MELPA and become approved, then
> > later continuously updated, meaning without any control or
> > supervision, and then automatically offered to users. Backdoor can be
> > injected into users' Emacs and run on their computers. If I am wrong
> > on how MELPA works, you may tell me, that is what I understood from
> > their website.
> 
> That is indeed correct, there is no further quality assurance after the
> initial submission.  It takes a significant amount of time for that
> submission to be verified due to the few reviewers and given the sheer
> amount of packages (4750 packages at the time of writing), I do not see
> this working out with their current team.  For comparison, Arch has
> "Trusted Users" responsible for their official packages, with anywhere
> between 5 and 90 packages assigned to each of them.  Rest assured that
> they don't perform security audits, only basic quality assurance as
> packages are updated and bugs trickle in.  Having the kind of work force
> a GNU/Linux distribution has is a luxury, not something to take for
> granted.

What that setup of Archlinux does is that it decentralizes the package
delivery, so some of those maintainers will indeed look into code and
report issues when found, there is more care and automatically there
is more responsibility. I do not say how much, I just can think that
it is.

Security and freedom issues are mostly promptly handled in those FSF
endorsed distributions, those are significant differences originating
from various group attitudes or set of principles.

> That aside, how does this quality assurance look like for GNU ELPA?

I understand it fully and I wish more security in any kind of package
repository for GNU Emacs, as users are downloading blindly "packages"
many of them will find it funny, and most of time nothing bad will
happen until it happens.

> Is it users subscribing to a commit mailing list and looking out for
> anything suspect?  Fewer releases overall?  A basic level of vetting
> by asking for copyright assignment?  I doubt that code is audited
> for every release either and that security issues are instead dealt
> with in a reactive instead of proactive manner (meaning, as soon as
> one is known of, appropriate measures such as a security release are
> taken).  There is a lot more work to be done here, such as defining
> a comprehensive threat model to work with.  Another important
> aspect: Say that non-GNU ELPA manages to catch up with MELPA in
> terms of package count, does the existing review system still work?
> Will new measures be necessary to guarantee security (for example by
> designing packages in terms of a more restrictive approach with
> permissions, sandboxing and whatnot)?  I strongly suspect that they
> will be and merely mirroring MELPA packages won't suffice.

Thank you for thinkering about security. Resource scarcity is security
issue.

For GNU ELPA I know that principle is that packages are assigned with
copyright to FSF and by other principles which I am not authorized to
represent.

While it is great to have large choice, number of packages in an
archive is for sure not the principle for GNU ELPA.

For me personally, that count is not a feature, it is anti feature,
the more packages they are, the more I get concerned for reasons
explained by me, and reasons explained by you.

> > SO FAR I KNOW there is no system of signing packages and verification
> > of such. I have verified MELPA git, and I cannot find that they are
> > using GnuPG or gpg or other system that packages were really made by
> > the author they claim to be made. This may be true at GNU ELPA too, I
> > did not verify it, but I know at that GNU ELPA is not automatically
> > built and offered to users blindly without verification (I at least
> > believe they are verified).
> 
> As mentioned above, MELPA's principle of going with the most convenient
> option makes this a non-starter.  Vetting package authors for their
> identity, requiring a GPG key and signed releases is something I'd
> rather expect for GNU ELPA than them.

Turn on the option package-check-signature and start verifying.

> > 1. Github.com may not even know if somebody cracks some developer's
> >    account and changes few packages to misbehave, if they would be
> >    alerted, they would not maybe act in the best interest of the free
> >    software project, they would act in their own best interest.
> 
> Github offers 2FA to protect accounts and has a dedicated security team
> reacting to incidents.

See this example:
https://pberba.github.io/security/2020/05/28/lastpass-phishing/

You are right that neither free software repositories need be secure,
they have though different motivation and different level of
transparency as they do not work for their number of sales and good
image, they are more proud if they find their security incidents
themselves, speaking of OpenBSD principles of work.

> That aside, it's not even necessary to hack an account to distribute
> malicious software.  Popular package archives for other programming
> languages have seen attacks such as typo squatting [4]creating
> (uploading a package with a misleading name) and hostile maintainers [5]
> (where a package is transfered to a new maintainer who then abuses the
> trust created by the package by adding malicious code to it).  I have to
> confess I've pondered creating a malicious package for demonstrating how
> easy it would be to sneak something in without anyone noticing, but I'm
> afraid it will only lead to more emails sowing Fear, Uncertainty and
> Doubt.  Or people weaponizing the code, not sure is likelier.

You have got references, to me it is obvious. What I am surprised is
that I do not know of serious security incidents within Emacs
packages, that does not mean they are not about to come.

> Emacs does have basic verification already, but it is far from ideal.
> The failure case is not handled well at all, users are not told what to
> do when it fails verifying a package and are inclined to instead disable
> the mechanism once and for all.

Right.

> If an Emacs is too old to contain the appropriate GPG keys, the
> keyring will be needed to be updated outside of Emacs, a task that
> can fail for opaque reasons due to key servers being unreachable.
> There is initial work in form of the gnu-elpa-keyring-update package
> distributed via GNU ELPA, but it suffers from a bootstrapping
> problem and needs to be installed *before* the keys become outdated.
> Until this issue is solved, I cannot imagine making this opt-out or
> even mandatory.  For comparison, Arch ships its own package manager
> specific GPG keyring and updates it during each package update
> operation.

That is about that what I expect for Emacs as well!

Jean

P.S. Think about implementing OMEMO in Jabber.el, my offer stands




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 19:04                                                 ` Jean Louis
@ 2020-10-19 20:17                                                   ` Stefan Monnier
  2020-10-19 21:02                                                     ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-10-19 20:17 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

> I would rather expect message shown, just as it is not shown for
> unsigned packages.

`package.el` should emit a message when installing a package without any
signature, since that's the odd and undesirable case.  I find it
perfectly normal not to say anything when the signature check succeeded.

> Regarding packages in GNU ELPA, can I now assume they are all signed?

Of course.  It's been that way since Emacs-24.4, IIRC.

> Is there a policy that GNU ELPA packages should be signed?

Not sure what that would mean: *we* sign it, so there's no policy to
enforce.  At most there are bugs to fix if the sigs are missing
or incorrect.

> What I expect is a method for user to easily verify and know by which
> key was which package signed, such function should exist.

What does Debian do in this respect?

> I also expect that such verification should be by default, but default
> was to accept unsigned, which is security issue in Emacs.

2 reasons:
- the sig-checking code (i.e. PGP) might not be installed and we did
  not want to add it as a prerequisite.
- the signature system was introduced relatively shortly before it was
  deployed for Emacs-24.4, so we did not want to break it for the other
  ELPA archives.

Regarding the second point, AFAICT Melpa still doesn't sign its
packages, so its users presumably rely on `https` as their only line
of defense.  One of the main reasons might be that there is/was no easy
way to add other trusted keys to Emacs's keyring (tho the
`gnu-elpa-keyring-update` shows it can be done) so even if they signed
their packages their users would have to take some extra step to add
their key to the trusted keys.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 20:17                                                   ` Stefan Monnier
@ 2020-10-19 21:02                                                     ` Jean Louis
       [not found]                                                       ` <jwvft69evmy.fsf-monnier+emacs@gnu.org>
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-19 21:02 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

* Stefan Monnier <monnier@iro.umontreal.ca> [2020-10-19 23:23]:
> > I would rather expect message shown, just as it is not shown for
> > unsigned packages.
> 
> `package.el` should emit a message when installing a package without any
> signature, since that's the odd and undesirable case.  I find it
> perfectly normal not to say anything when the signature check succeeded.
> 
> > Regarding packages in GNU ELPA, can I now assume they are all signed?
> 
> Of course.  It's been that way since Emacs-24.4, IIRC.
> 
> > Is there a policy that GNU ELPA packages should be signed?
> 
> Not sure what that would mean: *we* sign it, so there's no policy to
> enforce.  At most there are bugs to fix if the sigs are missing
> or incorrect.

It would be good to implement the policy.

> > What I expect is a method for user to easily verify and know by which
> > key was which package signed, such function should exist.
> 
> What does Debian do in this respect?

There are ways to verify package authenticity, so it is automated and
there is way to verify it package by package, I am on Hyperbola
GNU/Linux-libre, derivative of Archlinux, there is way to use pacman
package manager to verify authenticity.

Vasilij pointed out how it should be done. Verifications in Debian or
Archlinux how I see it, happen in real time during installation and
that is by default.

> > I also expect that such verification should be by default, but default
> > was to accept unsigned, which is security issue in Emacs.
> 
> 2 reasons:
> - the sig-checking code (i.e. PGP) might not be installed and we did
>   not want to add it as a prerequisite.

You know it better, maybe gnutls can be used as it is how I see it,
part of GNU Emacs here, but may not be part on every OS, I do not
know. It has OpenPGP API:
https://www.gnutls.org/manual/html_node/OpenPGP-API.html

So instead of using external gpg program, maybe you as developers
could use gnutls library and that API to create signatures for
packages in case that PGP/GnuPG cannot work.

> - the signature system was introduced relatively shortly before it was
>   deployed for Emacs-24.4, so we did not want to break it for the other
>   ELPA archives.

I understand and I find it unfortunate, and still suggest that it
becomes enabled now, and not years there after.

> Regarding the second point, AFAICT Melpa still doesn't sign its
> packages, so its users presumably rely on `https` as their only line
> of defense.  One of the main reasons might be that there is/was no easy
> way to add other trusted keys to Emacs's keyring (tho the
> `gnu-elpa-keyring-update` shows it can be done) so even if they signed
> their packages their users would have to take some extra step to add
> their key to the trusted keys.

And that is in best interest of users.

I think that it sounds tedious, yet it is in best interest to users.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-18  8:36                                                         ` Thibaut Verron
@ 2020-10-20  5:10                                                           ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-20  5:10 UTC (permalink / raw)
  To: thibaut.verron; +Cc: mve1, dgutov, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > But a feature available in a non-free program can be a good feature
  > which we might want to add to free programs (assuming that it is
  > possible without compromising on freedom, of course).

The feature, in the abstract, might be good in the sense of
convenient, and we might well want to implement it.  However,
it is clearer to call it "convenient" rather than "good",
to delineate the contrast with the ethical meaning of "good".

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 11:36                                   ` Dmitry Gutov
  2020-10-19 12:43                                     ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
  2020-10-19 15:46                                     ` Proposal for an Emacs User Survey Drew Adams
@ 2020-10-20  5:14                                     ` Richard Stallman
  2020-10-20 10:47                                       ` Dmitry Gutov
  2 siblings, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-20  5:14 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: mve1, philipk, bugs, thibaut.verron, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > If we provide some well-defined criteria for such tags, and pick a 
  > neutral-enough name, I don't see why the MELPA maintainers (who are 
  > quite reasonable people IME) wouldn't go for it.

  > Question is, would you agree to add MELPA to the default list of package 
  > archives if they do?

I do not have confidence that this will be sufficient.
Melpa has caused other problems (discussed here some months ago).


-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-19 18:28                                       ` Vasilij Schneidermann
  2020-10-19 19:00                                         ` ELPA security (was: Proposal to include obligatory PGP verification of packages from any repository) Stefan Monnier
  2020-10-19 19:50                                         ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
@ 2020-10-20  5:17                                         ` Richard Stallman
  2020-10-20  5:52                                           ` Stefan Monnier
  2020-10-20 16:17                                           ` Vasilij Schneidermann
  2 siblings, 2 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-20  5:17 UTC (permalink / raw)
  To: Vasilij Schneidermann
  Cc: philipk, bugs, thibaut.verron, mve1, emacs-devel, dgutov

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

I have not tried to study each point in your message -- there were so
many -- but I noticed criticism of Savannah for not offering
two-factor authentication.

When I was asked to do this, I couldn't do it, because it depended on
carrying a protable listening and surveillance device (aka cellular
phone).  MIT had to make a special exception for me, turning that
requirement off, when it demanded that I access its administrative
systems.

Savannah must not do this if it requires the user to use nonfree
programs.

If people are interested in discussing this point, let's use
gnu-prog-discuss@gnu.org as it is off-topic here.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 16:42                                       ` Jean Louis
@ 2020-10-20  5:19                                         ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-20  5:19 UTC (permalink / raw)
  To: Jean Louis; +Cc: philipk, thibaut.verron, mve1, emacs-devel, dgutov, drew.adams

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > Sure, the maintainers of a repo are, in a way,
  > > administrators.  But should such administrators
  > > be changing source code?  Adding other code or
  > > whatever, to administer, label, treat, etc. the
  > > code is, at least conceptually, different from
  > > changing the source code itself.

  > That is similar to how many GNU/Linux software packages are
  > maintained, often they are modified before such enter distribution for
  > final users.

  > I do not care if package is original, not original, forked or not
  > forked, modified, what I care is which group of people is making it
  > trusted and by which principles.

That is my view also.  Free software means you're allowed to
distribute a modified version.  There is nothing wrong with making
changes.  The changes are good, or bad, based on what they say.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 16:20 ` Philip K.
  2020-10-19 19:44   ` Dmitry Gutov
@ 2020-10-20  5:19   ` Richard Stallman
  2020-10-20  8:22     ` Thibaut Verron
  1 sibling, 1 reply; 838+ messages in thread
From: Richard Stallman @ 2020-10-20  5:19 UTC (permalink / raw)
  To: Philip K.; +Cc: emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  >     https://emacssurvey.org/

  > Sadly, it seems like they decided to use non-free JS for the web-form
  > variant :(

This means that the results will be biased in two ways:

* In favor of people who use the forums he posted it in.

* Against people who won't run nonfree software.

The results may be of use anyway, but they will not describe a
represent sample of all Emacs users.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-20  5:17                                         ` Richard Stallman
@ 2020-10-20  5:52                                           ` Stefan Monnier
  2020-10-21  4:46                                             ` Richard Stallman
  2020-10-20 16:17                                           ` Vasilij Schneidermann
  1 sibling, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-10-20  5:52 UTC (permalink / raw)
  To: Richard Stallman
  Cc: philipk, bugs, thibaut.verron, mve1, emacs-devel, dgutov,
	Vasilij Schneidermann

> I have not tried to study each point in your message -- there were so
> many -- but I noticed criticism of Savannah for not offering
> two-factor authentication.
>
> When I was asked to do this, I couldn't do it, because it depended on
> carrying a protable listening and surveillance device (aka cellular
> phone).

I don't see why: the way Gitlab does 2FA relies either on TOTP or
on a secure-key (such as the somu), neither of which requires
any kind of network correction (cellular or other).

See https://en.wikipedia.org/wiki/FIDO2_Project
and https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
       [not found]                                                       ` <jwvft69evmy.fsf-monnier+emacs@gnu.org>
@ 2020-10-20  7:40                                                         ` Jean Louis
  2020-10-22 21:25                                                           ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-20  7:40 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

* Stefan Monnier <monnier@iro.umontreal.ca> [2020-10-20 00:53]:
> >> > Is there a policy that GNU ELPA packages should be signed?
> >> Not sure what that would mean: *we* sign it, so there's no policy to
> >> enforce.  At most there are bugs to fix if the sigs are missing
> >> or incorrect.
> > It would be good to implement the policy.
> 
> I don't know what that means (neither "the policy" nor "implement").

Rules of maintenance simply said:

- that every request to any ELPA goes over SSL connection, to totally
  disable non-SSL connections to archives. Many countries spy on their
  citizens, and in many of those countries citizens are using
  encryption features, even it could be illegal to use encryption. By
  using non-SSL connection or allowing such, possibility is there that
  user get in danger of life. This is one very real example, it will
  look unreal to many who are in normal countries. I have a friend in
  such country.

- that all packages are signed by default and that Emacs expects such
  by default

There is set of principles for Emacs Lisp packaging in the info
manual, those changes are only beneficial for future.

Read on this link that Vasilij have presented to me yesterday:
https://medium.com/hackernoon/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5

That does happen. Research the report on this site:
https://snyk.io/blog/javascript-frameworks-security-report-2019/

Compare insecurities on similar software package repositories with
other languages to Emacs, and implement policies to prevent
insecurities in future.

To implement means in this context to follow through, follow up,
follow out, carry out, implement, put through, go through -- pursue
to a conclusion or bring to a successful issue; (Wordnet) there may be
definitions in othe context. I speak of carrying out.

Policy means a plan of action adopted by an individual or social
group; "it was a policy of retribution"; "a politician keeps changing
his policies" (Wordnet) -- there may be other definitons in other
context, I speak of adopting plan of action for Emacs development.

> >> > What I expect is a method for user to easily verify and know by which
> >> > key was which package signed, such function should exist.
> >> What does Debian do in this respect?
> > There are ways to verify package authenticity,
> 
> How?  What does "package authenticity" mean?
> Do you get to see which key signed which package?

I skip this, I am sure you know it.

> > Vasilij pointed out how it should be done.  Verifications in Debian or
> > Archlinux how I see it, happen in real time during installation and
> > that is by default.
> 
> Right, just as we do with GNU ELPA, AFAICT.

It is not by default surprisingly to me. I had to turn on the option
to have packages verified for signatures.

> > So instead of using external gpg program, maybe you as developers
> > could use gnutls library and that API to create signatures for
> > packages in case that PGP/GnuPG cannot work.
> 
> The problem is not to create signatures (which we do on our own machines
> where we can easily make sure PGP is installed) but to verify them.

Maybe gnutls offers that API, I cannot know technically, I could see
the API is there. 

> >> - the signature system was introduced relatively shortly before it was
> >>   deployed for Emacs-24.4, so we did not want to break it for the other
> >>   ELPA archives.
> > I understand and I find it unfortunate, and still suggest that it
> > becomes enabled now, and not years there after.
> 
> The current default made sense then.  Maybe it should be changed
> now, indeed.

Thank you,

Think about the growing number of:

- users
- developers
- packages
- fascism and varieties of oppression in the world

Jean




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-20  5:19   ` Richard Stallman
@ 2020-10-20  8:22     ` Thibaut Verron
  2020-10-20  9:48       ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-20  8:22 UTC (permalink / raw)
  To: Richard Stallman; +Cc: Philip K., emacs-devel

> This means that the results will be biased in two ways:
>
> * In favor of people who use the forums he posted it in.

It has been (and can be) posted in many places, including presently emacs-devel.

> * Against people who won't run nonfree software.

The survey can be completed without running nonfree software, by
sending an e-mail.

> The results may be of use anyway, but they will not describe a
> represent sample of all Emacs users.

I agree, but that's because of difficulties inherent to polling, not
because of a bias that could have been easily avoided.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-20  8:22     ` Thibaut Verron
@ 2020-10-20  9:48       ` Jean Louis
  2020-10-20 11:03         ` Thibaut Verron
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-20  9:48 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Philip K., Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-20 11:23]:
> I agree, but that's because of difficulties inherent to polling, not
> because of a bias that could have been easily avoided.

It is not difficult, it is one simple stupid HTML, make it nice with
CSS, form can be accepted and saved in file for later processing.

Further there is free software for that, there are systems like
Wordpres, Drupal and other website revision software.

There is something like LimeSurvey for complexities:
https://community.limesurvey.org/downloads/

You can survey in pure bash shell:
https://blog.eduonix.com/shell-scripting/learn-cgi-scripting-using-bash-in-linux-shell-scripting/

I would do it in nothing else but Emacs to write the form, and to
accept the form over CGI. It would then be stored as encrypted Emacs
Lisp data in file, and later could be evaluated.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-20  5:14                                     ` Richard Stallman
@ 2020-10-20 10:47                                       ` Dmitry Gutov
  0 siblings, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-20 10:47 UTC (permalink / raw)
  To: rms; +Cc: mve1, philipk, bugs, thibaut.verron, emacs-devel

On 20.10.2020 08:14, Richard Stallman wrote:
>    > If we provide some well-defined criteria for such tags, and pick a
>    > neutral-enough name, I don't see why the MELPA maintainers (who are
>    > quite reasonable people IME) wouldn't go for it.
> 
>    > Question is, would you agree to add MELPA to the default list of package
>    > archives if they do?
> 
> I do not have confidence that this will be sufficient.
> Melpa has caused other problems (discussed here some months ago).

"Caused" or "has"?

If the issue of it being hosted on Github is a show-stopper then ok, 
we'll probably not have much progress here.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-20  9:48       ` Jean Louis
@ 2020-10-20 11:03         ` Thibaut Verron
  2020-10-20 11:38           ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Thibaut Verron @ 2020-10-20 11:03 UTC (permalink / raw)
  To: Jean Louis; +Cc: Philip K., Richard Stallman, emacs-devel

Le mar. 20 oct. 2020 à 11:48, Jean Louis <bugs@gnu.support> a écrit :
>
> * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-20 11:23]:
> > I agree, but that's because of difficulties inherent to polling, not
> > because of a bias that could have been easily avoided.
>
> It is not difficult, it is one simple stupid HTML, make it nice with
> CSS, form can be accepted and saved in file for later processing.

Yes, I thought I was clearly stating that the difficulties I was
referring to were not related to the form of the survey, where in my
opinion they did choose a reasonable path.

The difficulties are inherent to polling and concern reaching a
sufficiently large sample, weighing it for representativity, etc.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-20 11:03         ` Thibaut Verron
@ 2020-10-20 11:38           ` Jean Louis
  2020-10-26 17:43             ` Teemu Likonen
  2020-10-26 18:13             ` Ivan Yonchovski
  0 siblings, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-20 11:38 UTC (permalink / raw)
  To: Thibaut Verron; +Cc: Philip K., Richard Stallman, emacs-devel

* Thibaut Verron <thibaut.verron@gmail.com> [2020-10-20 14:04]:
> Le mar. 20 oct. 2020 ?? 11:48, Jean Louis <bugs@gnu.support> a ??crit :
> >
> > * Thibaut Verron <thibaut.verron@gmail.com> [2020-10-20 11:23]:
> > > I agree, but that's because of difficulties inherent to polling, not
> > > because of a bias that could have been easily avoided.
> >
> > It is not difficult, it is one simple stupid HTML, make it nice with
> > CSS, form can be accepted and saved in file for later processing.
> 
> Yes, I thought I was clearly stating that the difficulties I was
> referring to were not related to the form of the survey, where in my
> opinion they did choose a reasonable path.

20 years ago we were handling forms with Perl's form.cgi

For me is surprising that Emacs survey has to be done with third party
providers. If anybody would ask me, I would make it in simple HTML,
what I already proposed, and I could install the background CGI to
accept the form.

> The difficulties are inherent to polling and concern reaching a
> sufficiently large sample, weighing it for representativity, etc.

Both ways how the surve have been presented with the proprietary
Javascript and with the download of the Org file, are not user
friendly and cannot reach large sample. One also needs marketing
skills.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-19 16:15                                           ` Qiantan Hong
@ 2020-10-20 13:45                                             ` Dmitry Gutov
  0 siblings, 0 replies; 838+ messages in thread
From: Dmitry Gutov @ 2020-10-20 13:45 UTC (permalink / raw)
  To: Qiantan Hong, Robert Pluim
  Cc: Marcel Ventosa, thibaut.verron@gmail.com, rms@gnu.org, Jean Louis,
	emacs-devel

On 19.10.2020 19:15, Qiantan Hong wrote:
> The funny icon on the top right doesn’t work,
> But try
> https://www.reddit.com/register.compact
> and
> https://www.reddit.com/login.compact

Have you managed to register with it?

It seems to want me to use a captcha anyway (looking at the network 
console), but fails to show said captcha.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-20  5:17                                         ` Richard Stallman
  2020-10-20  5:52                                           ` Stefan Monnier
@ 2020-10-20 16:17                                           ` Vasilij Schneidermann
  1 sibling, 0 replies; 838+ messages in thread
From: Vasilij Schneidermann @ 2020-10-20 16:17 UTC (permalink / raw)
  To: Richard Stallman; +Cc: philipk, bugs, thibaut.verron, mve1, emacs-devel, dgutov

[-- Attachment #1: Type: text/plain, Size: 887 bytes --]

> I have not tried to study each point in your message -- there were so
> many -- but I noticed criticism of Savannah for not offering
> two-factor authentication.
> 
> When I was asked to do this, I couldn't do it, because it depended on
> carrying a protable listening and surveillance device (aka cellular
> phone).  MIT had to make a special exception for me, turning that
> requirement off, when it demanded that I access its administrative
> systems.
> 
> Savannah must not do this if it requires the user to use nonfree
> programs.

There are many ways of doing 2FA and normally it's opt-in.

> If people are interested in discussing this point, let's use
> gnu-prog-discuss@gnu.org as it is off-topic here.

Sure, please include me in your mail there as I'm not subscribed to that
mailing list.  I could probably help out with the security side of
Savannah.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-20  5:52                                           ` Stefan Monnier
@ 2020-10-21  4:46                                             ` Richard Stallman
  0 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-21  4:46 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: philipk, bugs, thibaut.verron, mve1, emacs-devel, dgutov, mail

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > > When I was asked to do this, I couldn't do it, because it depended on
  > > carrying a protable listening and surveillance device (aka cellular
  > > phone).

  > I don't see why:

Why MIT chose to offer the options it chose and no others?
I don't know.

Why I couldn't use them?
I couldn't use them because each required me to run nonfree software.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-20  7:40                                                         ` Jean Louis
@ 2020-10-22 21:25                                                           ` Stefan Monnier
  2020-10-23  9:17                                                             ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-10-22 21:25 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

>> >> > Is there a policy that GNU ELPA packages should be signed?
>> >> Not sure what that would mean: *we* sign it, so there's no policy to
>> >> enforce.  At most there are bugs to fix if the sigs are missing
>> >> or incorrect.
>> > It would be good to implement the policy.
>> I don't know what that means (neither "the policy" nor "implement").
> Rules of maintenance simply said:

So by "implement" you mean: write it in the doc that describes the ELPA protocol?

> - that every request to any ELPA goes over SSL connection, to totally
>   disable non-SSL connections to archives.  Many countries spy on their
>   citizens, and in many of those countries citizens are using
>   encryption features, even it could be illegal to use encryption.  By
>   using non-SSL connection or allowing such, possibility is there that
>   user get in danger of life.

The part I don't understand here is "or allowing such".  I see the
danger of using a non-encrypted connection but not the danger of
allowing such.

>> >> > What I expect is a method for user to easily verify and know by which
>> >> > key was which package signed, such function should exist.
>> >> What does Debian do in this respect?
>> > There are ways to verify package authenticity,
>> How?  What does "package authenticity" mean?
>> Do you get to see which key signed which package?
> I skip this, I am sure you know it.

No, I don't, that's why I asked.  More specifically, from where I sit,
I don't see much difference between the way Debian does it and the way
GNU ELPA does it.  And as a Debian user I don't know how to "easily
verify" nor "know by which key".

>> > Vasilij pointed out how it should be done.  Verifications in Debian or
>> > Archlinux how I see it, happen in real time during installation and
>> > that is by default.
>> Right, just as we do with GNU ELPA, AFAICT.
> It is not by default surprisingly to me.

It is by default in my book.

> I had to turn on the option to have packages verified for signatures.

I think those users who posted questions about signature verification
failures back when we changed to a new key are evidence to the contrary.

>> The problem is not to create signatures (which we do on our own machines
>> where we can easily make sure PGP is installed) but to verify them.
> Maybe gnutls offers that API, I cannot know technically, I could see
> the API is there.

Patch welcome (as long as it doesn't end up reimplementing part of GPG).


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-22 21:25                                                           ` Stefan Monnier
@ 2020-10-23  9:17                                                             ` Jean Louis
  2020-10-23 14:52                                                               ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-23  9:17 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

* Stefan Monnier <monnier@iro.umontreal.ca> [2020-10-23 00:25]:
> >> >> > Is there a policy that GNU ELPA packages should be signed?
> >> >> Not sure what that would mean: *we* sign it, so there's no policy to
> >> >> enforce.  At most there are bugs to fix if the sigs are missing
> >> >> or incorrect.
> >> > It would be good to implement the policy.
> >> I don't know what that means (neither "the policy" nor "implement").
> > Rules of maintenance simply said:
> 
> So by "implement" you mean: write it in the doc that describes the
> ELPA protocol?

Thank you.

I meant to make it as a rule to sign packages, and that is should be
default in Emacs to accept only sign packages, that increases level of
security rather than leaving it acceptable for users to get unsigned
packages. It is definitely now everything about security, yet it is
one level.

Conditionally, if such feature is accepted in Emacs, than in Packaging
section would be described that packages have to be signed, and not
only that it is one way to increase the security.

> > - that every request to any ELPA goes over SSL connection, to totally
> >   disable non-SSL connections to archives.  Many countries spy on their
> >   citizens, and in many of those countries citizens are using
> >   encryption features, even it could be illegal to use encryption.  By
> >   using non-SSL connection or allowing such, possibility is there that
> >   user get in danger of life.
> 
> The part I don't understand here is "or allowing such".  I see the
> danger of using a non-encrypted connection but not the danger of
> allowing such.

My purpose was to tell you that if Emacs developers allow non-SSL by
default that users are automatically put at certain risks and that is
better to ask for SSL by default.

Users who maybe do not have SSL, they can turn it off for themselves.

> >> >> > What I expect is a method for user to easily verify and know by which
> >> >> > key was which package signed, such function should exist.
> >> >> What does Debian do in this respect?
> >> > There are ways to verify package authenticity,
> >> How?  What does "package authenticity" mean?
> >> Do you get to see which key signed which package?
> > I skip this, I am sure you know it.
> 
> No, I don't, that's why I asked.  More specifically, from where I sit,
> I don't see much difference between the way Debian does it and the way
> GNU ELPA does it.  And as a Debian user I don't know how to "easily
> verify" nor "know by which key".

You are right, it is vague to say easy.By easily I meant that there is
option to verify the package.

Let us see this as reference to some model design:
https://debian-handbook.info/browse/stable/sect.package-authentication.html

> When a third-party package source is added to the sources.list file,
> APT needs to be told to trust the corresponding GPG authentication key

So GNU Emacs users should maybe trust blindly packages from ELPA, but
not all packages by default. To trust other packages they should be
able transparently to import PGP keys and be able to see the
fingerprints.

By seeing fingerprints, users can at least see the same fingerprint on
the website. For better verification it should be necessary to contact
developers and make sure that fingerprints are same and valid.

Packages are meant to be distributable as well, if they are signed,
signature should be also fetched, but that is probably not original
design of Emacs. In my opinion, it should be. Signatures should be
inside of the package directory,
~/emcas.d/elpa/package-0.0/file.el.gpg

As if packages are distributable, one user from club A could simply
distribute packages on CD/USB/SD-card to other, or could transfer by
network. The user receiving packages beyond GNU ELPA archive, even
those without Internet, but having the trusted keys, should be able to
verify that packages have been signed by trusted keys, by central
authority in this case Emacs ELPA and trusted people maintaining
such.

-- 
Jean Louis



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-23  9:17                                                             ` Jean Louis
@ 2020-10-23 14:52                                                               ` Stefan Monnier
  2020-10-23 16:59                                                                 ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-10-23 14:52 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

> I meant to make it as a rule to sign packages, and that is should be
> default in Emacs to accept only sign packages, that increases level of
> security rather than leaving it acceptable for users to get unsigned
> packages. It is definitely now everything about security, yet it is
> one level.

IOW, you're just restating in other words your request to change
`package-check-signature` to t?

> My purpose was to tell you that if Emacs developers allow non-SSL by
> default that users are automatically put at certain risks and that is
> better to ask for SSL by default.

And here you're suggesting that the default value of `package-archives`
should always use `https` regardless of the `gnutls-available-p`?

> So GNU Emacs users should maybe trust blindly packages from ELPA, but
> not all packages by default.  To trust other packages they should be
> able transparently to import GPG keys and be able to see the
> fingerprints.

IIUC I basically said the same earlier when I explained that maybe one
reason Melpa still doesn't sign its files is the lack of a clean/good
way for the user to add Melpa's keys to `package.el`s keyring.

Patches welcome in this area.

> Packages are meant to be distributable as well, if they are signed,
> signature should be also fetched, but that is probably not original
> design of Emacs. In my opinion, it should be. Signatures should be
> inside of the package directory,
> ~/emcas.d/elpa/package-0.0/file.el.gpg

This makes way too many assumptions to be worth discussing, IMO.
For the case of "single file ELPA package" (i.e. those files
distributed as a single .el file) maybe that can work without too much
trouble (tho there's still the issue of trusting the accompanying .elc
file), but for the more common packages distributed as tarballs, I think
this is completely impractical.

A saner approach might be to keep a "cache" of the packages in their
original (not-installed) form and make that available as a "local ELPA
archive" from which you can redistribute those packages to
other machines.  My impression is that this would be better served by
a separate package than by trying to add the feature directly to
`package.el`, especially since I suspect it would remain a fairly
unusual scenario.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-23 14:52                                                               ` Stefan Monnier
@ 2020-10-23 16:59                                                                 ` Jean Louis
  2020-10-23 18:25                                                                   ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-23 16:59 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

* Stefan Monnier <monnier@iro.umontreal.ca> [2020-10-23 17:52]:
> > I meant to make it as a rule to sign packages, and that is should be
> > default in Emacs to accept only sign packages, that increases level of
> > security rather than leaving it acceptable for users to get unsigned
> > packages. It is definitely now everything about security, yet it is
> > one level.
> 
> IOW, you're just restating in other words your request to change
> `package-check-signature` to t?

Yes.

> > My purpose was to tell you that if Emacs developers allow non-SSL by
> > default that users are automatically put at certain risks and that is
> > better to ask for SSL by default.
> 
> And here you're suggesting that the default value of `package-archives`
> should always use `https` regardless of the `gnutls-available-p`?

I understand from that statement that probably not every platform will
have gnutls or whatever other solution. Let me mention that in some
countries governments forbid usage of various networks and software,
also encryption software, in particular I have a friend in
Iran and I know what can happen to a person. And networks are spied
over. This means in particular that misunderstanding or usage of
encryption tools could lead to unjust arrests and broken
families. Loading some packages from Emacs could automatically trigger
spying governments to abuse their citizens.

Reference:
https://security.stackexchange.com/questions/10992/encryption-laws-in-iran

There are other similar cases easy to find on search engines.

Now if that cannot be made default, then every non-SSL connection
should give serious warning to a user and should even ask user if one
wants to connect or not, because it is non-SSL. Such warning should
give good reference that data is visible on network and prone to Big
Brother's eyes.

> > Packages are meant to be distributable as well, if they are signed,
> > signature should be also fetched, but that is probably not original
> > design of Emacs. In my opinion, it should be. Signatures should be
> > inside of the package directory,
> > ~/emcas.d/elpa/package-0.0/file.el.gpg
> 
> This makes way too many assumptions to be worth discussing, IMO.
> For the case of "single file ELPA package" (i.e. those files
> distributed as a single .el file) maybe that can work without too much
> trouble (tho there's still the issue of trusting the accompanying .elc
> file), but for the more common packages distributed as tarballs, I think
> this is completely impractical.

Maybe tar can be signed as such?

> A saner approach might be to keep a "cache" of the packages in their
> original (not-installed) form and make that available as a "local ELPA
> archive" from which you can redistribute those packages to
> other machines.

Yes. For me is no problem. I speak for wide user base. Ability for
each ELPA to download full set of packages and keep it as local ELPA
would be convenient for many users who do not have stable Internet.

-- 
Jean Louis



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-23 16:59                                                                 ` Jean Louis
@ 2020-10-23 18:25                                                                   ` Stefan Monnier
  2020-10-24  6:26                                                                     ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Monnier @ 2020-10-23 18:25 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

>> IOW, you're just restating in other words your request to change
>> `package-check-signature` to t?
> Yes.

I'm find with it, but it's not up to me and I think it will require more
code changes so that errors are reported in a way that's more friendly
to the user (e.g. so the users can figure out whether the problem is
with the signature, the lack of key, or the lack of GPG, for example).

I suggest you `M-x report-emacs-bug` with this specific request and
accompany it with a patch that improves the error handling.

>> > My purpose was to tell you that if Emacs developers allow non-SSL by
>> > default that users are automatically put at certain risks and that is
>> > better to ask for SSL by default.
>> And here you're suggesting that the default value of `package-archives`
>> should always use `https` regardless of the `gnutls-available-p`?
> I understand from that statement that probably not every platform will
> have gnutls or whatever other solution.

I believe it is available on all the platforms we support, but you can
build Emacs without support for it (and under Windows, IIUC, you can
build it with support for gnutls and later run it without libgnutls in
which case it'll behave pretty much as if it had been built without
support for gnutls).

> Let me mention that ...

Yes, you already said so, and I believe it's been common knowledge on
this mailing-list for a while.

>> This makes way too many assumptions to be worth discussing, IMO.
>> For the case of "single file ELPA package" (i.e. those files
>> distributed as a single .el file) maybe that can work without too much
>> trouble (tho there's still the issue of trusting the accompanying .elc
>> file), but for the more common packages distributed as tarballs, I think
>> this is completely impractical.
> Maybe tar can be signed as such?

It is.  But the installed files are not the tarball, and it's difficult
to reproduce the tarball from the installed files in order to check that
they still "match the signature".

>> A saner approach might be to keep a "cache" of the packages in their
>> original (not-installed) form and make that available as a "local ELPA
>> archive" from which you can redistribute those packages to
>> other machines.
> Yes.  For me is no problem.  I speak for wide user base.  Ability for
> each ELPA to download full set of packages and keep it as local ELPA
> would be convenient for many users who do not have stable Internet.

You can mirror GNU ELPA via rsync.


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-23 18:25                                                                   ` Stefan Monnier
@ 2020-10-24  6:26                                                                     ` Jean Louis
  2020-10-24 15:29                                                                       ` Stefan Monnier
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-10-24  6:26 UTC (permalink / raw)
  To: Stefan Monnier
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

* Stefan Monnier <monnier@iro.umontreal.ca> [2020-10-23 21:26]:
> You can mirror GNU ELPA via rsync.

Great. I cannot find instructions for that on website, do you have a
reference?

-- 
Jean Louis



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal to include obligatory PGP verification of packages from any repository
  2020-10-24  6:26                                                                     ` Jean Louis
@ 2020-10-24 15:29                                                                       ` Stefan Monnier
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-10-24 15:29 UTC (permalink / raw)
  To: Jean Louis
  Cc: Philip K., rms, thibaut.verron, mve1, emacs-devel, Stefan Kangas,
	Dmitry Gutov

>> You can mirror GNU ELPA via rsync.
> Great. I cannot find instructions for that on website, do you have a
> reference?

searching for "elpa rsync" lead me (after a few steps) to:

    https://lists.gnu.org/archive/html/emacs-devel/2016-07/msg00709.html


-- Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-20 11:38           ` Jean Louis
@ 2020-10-26 17:43             ` Teemu Likonen
  2020-10-26 19:36               ` Jean Louis
                                 ` (2 more replies)
  2020-10-26 18:13             ` Ivan Yonchovski
  1 sibling, 3 replies; 838+ messages in thread
From: Teemu Likonen @ 2020-10-26 17:43 UTC (permalink / raw)
  To: Jean Louis, Thibaut Verron; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 888 bytes --]

* 2020-10-20 14:38:07+03, Jean Louis wrote:

> For me is surprising that Emacs survey has to be done with third party
> providers. If anybody would ask me, I would make it in simple HTML,
> what I already proposed, and I could install the background CGI to
> accept the form.

> Both ways how the surve have been presented with the proprietary
> Javascript and with the download of the Org file, are not user
> friendly and cannot reach large sample. One also needs marketing
> skills.

I think we should appreciate the fact that the original poster (Adrien
Brochard) actually did something. He is really conducting a survey. He
is not just talking and designing a theoretically and ethically perfect
survey, as the rest of us.

https://emacssurvey.org/

-- 
/// Teemu Likonen - .-.. https://www.iki.fi/tlikonen/
// OpenPGP: 4E1055DC84E9DFF613D78557719D69D324539450

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 251 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-20 11:38           ` Jean Louis
  2020-10-26 17:43             ` Teemu Likonen
@ 2020-10-26 18:13             ` Ivan Yonchovski
  2020-10-26 20:21               ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Ivan Yonchovski @ 2020-10-26 18:13 UTC (permalink / raw)
  To: Jean Louis; +Cc: Philip K., Richard Stallman, Thibaut Verron, emacs-devel


Jean Louis writes:

> Both ways how the surve have been presented with the proprietary
> Javascript and with the download of the Org file, are not user
> friendly and cannot reach large sample. One also needs marketing
> skills.

What number of responders will be considered large enough sample?

Thanks,
Ivan



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-26 17:43             ` Teemu Likonen
@ 2020-10-26 19:36               ` Jean Louis
  2020-10-26 19:58               ` Jean Louis
  2020-10-27  3:44               ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-26 19:36 UTC (permalink / raw)
  To: Teemu Likonen; +Cc: Thibaut Verron, emacs-devel

* Teemu Likonen <tlikonen@iki.fi> [2020-10-26 20:44]:
> * 2020-10-20 14:38:07+03, Jean Louis wrote:
> 
> > For me is surprising that Emacs survey has to be done with third party
> > providers. If anybody would ask me, I would make it in simple HTML,
> > what I already proposed, and I could install the background CGI to
> > accept the form.
> 
> > Both ways how the surve have been presented with the proprietary
> > Javascript and with the download of the Org file, are not user
> > friendly and cannot reach large sample. One also needs marketing
> > skills.
> 
> I think we should appreciate the fact that the original poster (Adrien
> Brochard) actually did something. He is really conducting a survey. He
> is not just talking and designing a theoretically and ethically perfect
> survey, as the rest of us.
> 
> https://emacssurvey.org/

http://www.gnu.org/fun/jokes/users-lightbulb.html

-- 
Jean Louis



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-26 17:43             ` Teemu Likonen
  2020-10-26 19:36               ` Jean Louis
@ 2020-10-26 19:58               ` Jean Louis
  2020-10-27  3:44               ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-26 19:58 UTC (permalink / raw)
  To: Teemu Likonen; +Cc: Thibaut Verron, emacs-devel

* Teemu Likonen <tlikonen@iki.fi> [2020-10-26 20:44]:
> I think we should appreciate the fact that the original poster (Adrien
> Brochard) actually did something. He is really conducting a survey. He
> is not just talking and designing a theoretically and ethically perfect
> survey, as the rest of us.
> 
> https://emacssurvey.org/

The bug database
https://debbugs.gnu.org/cgi/pkgreport.cgi?which=pkg&data=emacs is like
a pinpointed poll on what people would like to have improved.

While the survey is interesting, it went into public with little good
preparation now driving users to . Impression is that there was impatience and rush to make
the survey or poll.

Comparing the Emacs bug system to the survey I see that bug system
actually works very well including this mailing list. The type of
discussions may seem talky though in background it is very productive
and Emacs gets speedily improved.

When doing such outreach it would be useful to reference to the bug
system and help-gnu-emacs@gnu.org mailing list where every user may
ask for general help on Emacs.

> He is really conducting a survey. He is not just talking and
> designing a theoretically and ethically perfect survey, as the rest
> of us.

The survey is not well planned and implemented technically. That is
beyond theoretical or ethical subjects. Survey gives two options for
user to fill it online and to fill the Org file, I did the last and
signed it with my GPG key.

Example is here:

- HOW WOULD YOU CHARACTERIZE YOUR USE OF EMACS?

- [X] Use it for work
- [X] I use it for serious "hobby" projects
- [X] I'm just tinkering
- [X] I use it for my studies
- [X] Other (please specify)
  - for browsing Internet
  - for database management
  - CRM or Customer Relationship Management
  - WRS or Website Revision System
  - for management of mailing lists and marketing

The online form offers only one option among those above options. And
so on for each section of the survey, there is option list instead of
a checklist.

To make a survey form like that is maybe 20 minutes to 60 minutes of
work and it would cost maybe $5 to $20 to hire somebody to do it, many
would do it for free and it would be technically readable and
accessible page without any non-free Javascript or third parties being
involved.

-- 
Jean Louis



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-26 18:13             ` Ivan Yonchovski
@ 2020-10-26 20:21               ` Jean Louis
  0 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-10-26 20:21 UTC (permalink / raw)
  To: Ivan Yonchovski; +Cc: Philip K., Richard Stallman, Thibaut Verron, emacs-devel

* Ivan Yonchovski <yyoncho@gmail.com> [2020-10-26 21:14]:
> 
> Jean Louis writes:
> 
> > Both ways how the surve have been presented with the proprietary
> > Javascript and with the download of the Org file, are not user
> > friendly and cannot reach large sample. One also needs marketing
> > skills.
> 
> What number of responders will be considered large enough sample?

That is not easy to determine. I would say that 1000 people would be
minimum in each case and it would never be enough, as that comes from
personal experience from work in two organizations, one was
specifically a survey company and other was conducting always surveys
for its own humanitarian purposes.

From:
https://www.cloudresearch.com/resources/guides/statistical-significance/determine-sample-size/

As you can see, even when a population is large, researchers can often
understand the entire group with about 1,000 respondents.

  Population Size  Sample Size Based on ±3%  Sample Size Based on ±5%  Sample Size Based on ±10%    
    Margin of Error  Margin of Error  Margin of Error    
  500  345  220  80    
  1,000  525  285  90    
  3,000  810  350  100    
  5,000  910  370  100    
  10,000  1,000  385  100    
  100,00+  1,100  400  100    
----- end of quote --------

Every survey should have its purpose, usually to improve the product
or service, in this case Emacs. Improvements are constantly made and
public opinion is looked upon.

To discuss issues with people is human, friendly and vibrant activity
and is way of taking opinions (bug reports, emails, opinions, package
contributions) and putting them in reality (patches, improvements,
ELPA...).

To ask people questions online without opportunity for feedback is
one-way, dead end type of a communication.

There are few questions that look like there is question about
accessibility yet we will see later what comes out of it. If website
is not made well accessible those questions may not be productive.

For solving usability issues, instead of 1000 people one could as well
follow feedback from 5 users, reference:
https://www.nngroup.com/articles/usability-101-introduction-to-usability/

Article refers to web, it may be applied on Emacs user interface.

Quote:

Usability is a quality attribute that assesses how easy user
interfaces are to use. The word "usability" also refers to methods for
improving ease-of-use during the design process.

Usability is defined by 5 quality components:

- Learnability: How easy is it for users to accomplish basic tasks the
  first time they encounter the design?

- Efficiency: Once users have learned the design, how quickly can they
  perform tasks?
  
- Memorability: When users return to the design after a period of not
  using it, how easily can they reestablish proficiency?
  
- Errors: How many errors do users make, how severe are these errors,
  and how easily can they recover from the errors?
  
- Satisfaction: How pleasant is it to use the design?


-- 
Jean Louis



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: Proposal for an Emacs User Survey
  2020-10-26 17:43             ` Teemu Likonen
  2020-10-26 19:36               ` Jean Louis
  2020-10-26 19:58               ` Jean Louis
@ 2020-10-27  3:44               ` Richard Stallman
  2 siblings, 0 replies; 838+ messages in thread
From: Richard Stallman @ 2020-10-27  3:44 UTC (permalink / raw)
  To: Teemu Likonen; +Cc: thibaut.verron, bugs, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I think we should appreciate the fact that the original poster (Adrien
  > Brochard) actually did something.

He did something, in a way that has good effects and bad ones.
He could have cooperated and done it in a way that
would have had the same good effects and not the bad effects,
but that's not what he chose.

My appreciation will therefore be limited.

-- 
Dr Richard Stallman
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work
  2020-10-17  8:41 ` Lars Ingebrigtsen
@ 2020-10-27 10:36   ` brett.randall
       [not found]     ` <(brett>
  2020-10-27 10:43     ` Lars Ingebrigtsen
  0 siblings, 2 replies; 838+ messages in thread
From: brett.randall @ 2020-10-27 10:36 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 42611

[-- Attachment #1: Type: text/plain, Size: 969 bytes --]



--- original message ---
On October 17, 2020, 7:41 PM GMT+11 larsi@gnus.org wrote:


Brett Randall <brett.randall@gmail.com> writes:

>> Actions that triggered the bug:
>>
>> M-x edit-abbrevs
>>
>> Enter abbrevs in fundamental or global abbreviations at bottom of the list, e.g.:
>>
>> "dfn" 0 "definition"
>>
>> C-c C-c
>>
>> Buffer appears committed (modified flag disappears). Close buffer, test the abbrev
>> in "abbrev-mode" minor mode and nothing happens. M-x edit-abbrevs again. The
>> definition I entered is no longer there. This is in the same session. Emacs was not
>> closed/reopened. The definitions are not applying/temporarily saving.

> I'm unable to reproduce this bug either in Emacs 26.3 or on the trunk.
> `C-c C-c' in the *Abbrevs* buffer updates the abbreviation for me.

> Are you able to reproduce this bug starting from "emacs -Q"?


Yes, the bug exists from there too.


Brett
--- end of original message ---

[-- Attachment #2: Type: text/html, Size: 1806 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work
  2020-10-27 10:36   ` brett.randall
       [not found]     ` <(brett>
@ 2020-10-27 10:43     ` Lars Ingebrigtsen
  2020-10-27 10:49       ` Brett Randall
  1 sibling, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-27 10:43 UTC (permalink / raw)
  To: brett.randall; +Cc: 42611

brett.randall@gmail.com writes:

>  I'm unable to reproduce this bug either in Emacs 26.3 or on the trunk.
>  `C-c C-c' in the *Abbrevs* buffer updates the abbreviation for me.
>
>  Are you able to reproduce this bug starting from "emacs -Q"?
>
>  Yes, the bug exists from there too.

Can you give a recipe for how to reproduce the bug, starting from
"emacs -Q"?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work
  2020-10-27 10:43     ` Lars Ingebrigtsen
@ 2020-10-27 10:49       ` Brett Randall
  2020-10-27 11:08         ` Lars Ingebrigtsen
  0 siblings, 1 reply; 838+ messages in thread
From: Brett Randall @ 2020-10-27 10:49 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 42611

[-- Attachment #1: Type: text/plain, Size: 888 bytes --]



Brett

--- original message ---
On October 27, 2020, 9:43 PM GMT+11 larsi@gnus.org wrote:


brett.randall@gmail.com writes:

>> I'm unable to reproduce this bug either in Emacs 26.3 or on the trunk.
>> `C-c C-c' in the *Abbrevs* buffer updates the abbreviation for me.
>>
>> Are you able to reproduce this bug starting from "emacs -Q"?
>>
>> Yes, the bug exists from there too.

> Can you give a recipe for how to reproduce the bug, starting from
> "emacs -Q"?


Yes:



emacs -Q

M-x edit-abbrevs

Scroll to last line - (global-abbrev-table)

Append: "dfn" 0 "definition"

C-c C-c (removes "modified" flag)

C-x k

M-x edit-abbrevs

Scroll down to last line - abbreviation is not there

C-x C-c (results in "Save abbrevs in ~/.emacs.d/abbrev_defs? (y or n) ")

"y" to above

Inspect .emacs.d/abbrev_defs - only contains one line:

;;-*-coding: utf-8;-*-
--- end of original message ---

[-- Attachment #2: Type: text/html, Size: 1980 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work
  2020-10-27 10:49       ` Brett Randall
@ 2020-10-27 11:08         ` Lars Ingebrigtsen
       [not found]           ` <(Lars>
  2020-10-27 11:19           ` bug#42611: (no subject) Lars Ingebrigtsen
  0 siblings, 2 replies; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-27 11:08 UTC (permalink / raw)
  To: Brett Randall; +Cc: 42611

Brett Randall <brett.randall@gmail.com> writes:

>  1 emacs -Q
>  2 M-x edit-abbrevs
>  3 Scroll to last line - (global-abbrev-table)
>  4 Append: "dfn" 0 "definition"
>  5 C-c C-c (removes "modified" flag)
>  6 C-x k
>  7 M-x edit-abbrevs
>  8 Scroll down to last line - abbreviation is not there

Thanks.

The format of that buffer is very specific, though.  The entries must be
on the format:

(global-abbrev-table)

"def"	       0    "definition"

with one blank line between the name of the section and the start of the
definitions; neither more nor less.  If you do it that way, does the
mode work for you?

In any case, I don't quite see why it's that strict about the format: It
should just grok all the lines between the sections, I think?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: (no subject)
  2020-10-27 11:08         ` Lars Ingebrigtsen
       [not found]           ` <(Lars>
@ 2020-10-27 11:19           ` Lars Ingebrigtsen
       [not found]             ` <877drbhq6c.fsf@gnus.org>
  1 sibling, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-27 11:19 UTC (permalink / raw)
  To: Brett Randall; +Cc: 42611

Lars Ingebrigtsen <larsi@gnus.org> writes:

> In any case, I don't quite see why it's that strict about the format: It
> should just grok all the lines between the sections, I think?

I've now altered the parser to just ignore blank lines in Emacs 28,
which should make the mode somewhat less brittle. 

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work
       [not found]               ` <handler.42611.C.160379757411378.notifdonectrl.0@debbugs.gnu.org>
@ 2020-10-27 22:22                 ` Brett Randall
  0 siblings, 0 replies; 838+ messages in thread
From: Brett Randall @ 2020-10-27 22:22 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 42611

[-- Attachment #1: Type: text/plain, Size: 1161 bytes --]

Thanks Lars, it works now that I understand the formatting requirement. Appreciate your help.

Brett

--- original message ---
On October 27, 2020, 10:08 PM GMT+11 larsi@gnus.org wrote:

Brett Randall <brett.randall@gmail.com> writes:


>> 1 emacs -Q

>> 2 M-x edit-abbrevs

>> 3 Scroll to last line - (global-abbrev-table)

>> 4 Append: "dfn" 0 "definition"

>> 5 C-c C-c (removes "modified" flag)

>> 6 C-x k

>> 7 M-x edit-abbrevs

>> 8 Scroll down to last line - abbreviation is not there


> Thanks.


> The format of that buffer is very specific, though. The entries must be

> on the format:


> (global-abbrev-table)


> "def" 0 "definition"


> with one blank line between the name of the section and the start of the

> definitions; neither more nor less. If you do it that way, does the

> mode work for you?


> In any case, I don't quite see why it's that strict about the format: It

> should just grok all the lines between the sections, I think?


> -- 

> (domestic pets only, the antidote for overdose, milk.)

> bloggy blog: http://lars.ingebrigtsen.no
--- end of original message ---

[-- Attachment #2: Type: text/html, Size: 2063 bytes --]

^ permalink raw reply	[flat|nested] 838+ messages in thread

* bounds-of-thing-at-point for paragraphs
@ 2020-11-01 16:08 Christopher Dimech
  2020-11-01 18:22 ` Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 16:08 UTC (permalink / raw)
  To: Help Gnu Emacs

Been trying to write a function to transpose two paragraphs but keep the cursor
at the same position.  How is it that bounds-of-thing-at-point does not take
paragraph as argument?


(defun Skip-Over-Paragraphs (arg)

   (let ((Prg-Bounds (bounds-of-thing-at-point 'paragraph)))

      ;; ----------------------------------------------------------------
      (when Wrd-Bounds
         (let*
            ( (Beg (point))
              (End (cdr Prg-Bounds))
              (Shift (- Beg End))
              ;; --------------------------------------------------------
              (Cursor-Psn
                 (save-excursion
                    (goto-char End)  ; [#A]
                    (if (condition-case err
                           (progn    ; bodyform
                              (transpose-paragraphs arg) ; [#B]
                              t
                           )
                           (message err) ; Handler when [#B] fails
                        )
                        ;; ----------------------------------------------
                        (+ (point) Shift)  ; Shift after executing [#B]
                        nil                ; [#B] failed
                        ;; ----------------------------------------------
                    )
                 )
              )
              ;; --------------------------------------------------------
            )
            (when Cursor-Psn (goto-char Cursor-Psn))
         )
      )
      ;;-----------------------------------------------------------------

   ) ; let bounds (start and end locations of word)

)




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 16:08 bounds-of-thing-at-point for paragraphs Christopher Dimech
@ 2020-11-01 18:22 ` Jean Louis
  2020-11-01 18:34   ` Christopher Dimech
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-11-01 18:22 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: Help Gnu Emacs

* Christopher Dimech <dimech@gmx.com> [2020-11-01 19:09]:
> Been trying to write a function to transpose two paragraphs but keep the cursor
> at the same position.  How is it that bounds-of-thing-at-point does not take
> paragraph as argument?

That is very nice.

I like ivy-mode from GNU ELPA, it is package for automatic completion
of many functions. There are many various completion packages.

It may help you faster explore which functions are available.

I was looking if such function already exists by doing {C-h f} and
then I get list of functions, I have tried typing "trans" and "para"
and I can find function `transpose-paragraphs'

You may spare your efforts by finding some probably already existing
functions.

If you wish to make your own function out of `transpose-paragraphs'
you may come with cursor on the function name, above here ^ and type
{C-h f} then you press TAB and enter into file `paragraphs.el' where
you can find how function is written.

Then you may copy the same function and name it
`my-transpose-paragraphs' and try modifying it as you wish. You could
as well modify original function to do what you wish and save it in
your configuration.

See below:

> (defun Skip-Over-Paragraphs (arg)

I understand that some programming languages have mixture of upper
case and lower case function names, in Lisp that is not so common. I
believe it is common in some versions of Lisp, not in Emacs
lisp.

As:

(setq A 1)
(setq a 2)

are not same so, so it is better writing all lower case letters.

>    (let ((Prg-Bounds (bounds-of-thing-at-point 'paragraph)))
> 
>       ;; ----------------------------------------------------------------
>       (when Wrd-Bounds
>          (let*
>             ( (Beg (point))
>               (End (cdr Prg-Bounds))
>               (Shift (- Beg End))

I understand you may need now for visibility or orientation some space
at ( (Beg)) yet by convention there is no such space. You better not
make new lines after let* to make it easier readable for people who
are familiar to different style. Lisp is great, you may write it
anyhow, but for readability there are some conventions.

You may mark the function and simply press TAB and it will indent it
for you.

Please see the Emacs Lisp manual as it is built into Emacs. There is
section "Tips" where you can read various conventions.

>               ;; --------------------------------------------------------
>               (Cursor-Psn
>                  (save-excursion
>                     (goto-char End)  ; [#A]
>                     (if (condition-case err
>                            (progn    ; bodyform
>                               (transpose-paragraphs arg) ; [#B]
>                               t
>                            )

Normally ending parenthesis you put straight after t.

I suggest you use Options -> Highlight matching parenthesis to help
you see where you are.

-- 
There are 50 messages yet in my incoming mailbox.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 18:22 ` Jean Louis
@ 2020-11-01 18:34   ` Christopher Dimech
  2020-11-01 18:45     ` Drew Adams
  2020-11-01 18:45     ` Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 18:34 UTC (permalink / raw)
  To: Jean Louis; +Cc: Help Gnu Emacs

Yes, but transpose-paragraph does not keep at the same point position.

I was asking how bounds-of-thing-at-point does not take paragraph as argument
as well, since it does for word, sentence, line. Can paragraph be included as well?




> Sent: Sunday, November 01, 2020 at 7:22 PM
> From: "Jean Louis" <bugs@gnu.support>
> To: "Christopher Dimech" <dimech@gmx.com>
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: Re: bounds-of-thing-at-point for paragraphs
>
> * Christopher Dimech <dimech@gmx.com> [2020-11-01 19:09]:
> > Been trying to write a function to transpose two paragraphs but keep the cursor
> > at the same position.  How is it that bounds-of-thing-at-point does not take
> > paragraph as argument?
>
> That is very nice.
>
> I like ivy-mode from GNU ELPA, it is package for automatic completion
> of many functions. There are many various completion packages.
>
> It may help you faster explore which functions are available.
>
> I was looking if such function already exists by doing {C-h f} and
> then I get list of functions, I have tried typing "trans" and "para"
> and I can find function `transpose-paragraphs'
>
> You may spare your efforts by finding some probably already existing
> functions.
>
> If you wish to make your own function out of `transpose-paragraphs'
> you may come with cursor on the function name, above here ^ and type
> {C-h f} then you press TAB and enter into file `paragraphs.el' where
> you can find how function is written.
>
> Then you may copy the same function and name it
> `my-transpose-paragraphs' and try modifying it as you wish. You could
> as well modify original function to do what you wish and save it in
> your configuration.
>
> See below:
>
> > (defun Skip-Over-Paragraphs (arg)
>
> I understand that some programming languages have mixture of upper
> case and lower case function names, in Lisp that is not so common. I
> believe it is common in some versions of Lisp, not in Emacs
> lisp.
>
> As:
>
> (setq A 1)
> (setq a 2)
>
> are not same so, so it is better writing all lower case letters.
>
> >    (let ((Prg-Bounds (bounds-of-thing-at-point 'paragraph)))
> >
> >       ;; ----------------------------------------------------------------
> >       (when Wrd-Bounds
> >          (let*
> >             ( (Beg (point))
> >               (End (cdr Prg-Bounds))
> >               (Shift (- Beg End))
>
> I understand you may need now for visibility or orientation some space
> at ( (Beg)) yet by convention there is no such space. You better not
> make new lines after let* to make it easier readable for people who
> are familiar to different style. Lisp is great, you may write it
> anyhow, but for readability there are some conventions.
>
> You may mark the function and simply press TAB and it will indent it
> for you.
>
> Please see the Emacs Lisp manual as it is built into Emacs. There is
> section "Tips" where you can read various conventions.
>
> >               ;; --------------------------------------------------------
> >               (Cursor-Psn
> >                  (save-excursion
> >                     (goto-char End)  ; [#A]
> >                     (if (condition-case err
> >                            (progn    ; bodyform
> >                               (transpose-paragraphs arg) ; [#B]
> >                               t
> >                            )
>
> Normally ending parenthesis you put straight after t.
>
> I suggest you use Options -> Highlight matching parenthesis to help
> you see where you are.
>
> --
> There are 50 messages yet in my incoming mailbox.
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 18:34   ` Christopher Dimech
@ 2020-11-01 18:45     ` Drew Adams
  2020-11-01 18:52       ` Jean Louis
  2020-11-01 18:45     ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-01 18:45 UTC (permalink / raw)
  To: Christopher Dimech, Jean Louis; +Cc: Help Gnu Emacs

> I was asking how bounds-of-thing-at-point does not take paragraph as argument
> as well, since it does for word, sentence, line. Can paragraph be included as
> well?

But it does.

(bound-of-thing-at-point 'paragraph) works fine.

(thing-at-point 'paragraph) also works fine.

See (emacs) `Paragraphs' for info about how paragraphs
are defined for Emacs use.

https://www.gnu.org/software/emacs/manual/html_node/emacs/Paragraphs.html



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 18:34   ` Christopher Dimech
  2020-11-01 18:45     ` Drew Adams
@ 2020-11-01 18:45     ` Jean Louis
  2020-11-01 18:51       ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-11-01 18:45 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: Help Gnu Emacs

* Christopher Dimech <dimech@gmx.com> [2020-11-01 21:35]:
> Yes, but transpose-paragraph does not keep at the same point
> position.

You can remember the point and restore it.

Make new function with:

1. Remember (point)
2. transpose-paragraph
3. (posn-set-point POSITION)

> I was asking how bounds-of-thing-at-point does not take paragraph as
> argument as well, since it does for word, sentence, line. Can
> paragraph be included as well?

You could try to define it. There is function org--paragraph-at-point
that gives information about paragraph at point. Try it out.

-- 
There are 50 messages yet in my incoming mailbox.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 18:45     ` Jean Louis
@ 2020-11-01 18:51       ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-11-01 18:51 UTC (permalink / raw)
  To: Jean Louis, Christopher Dimech; +Cc: Help Gnu Emacs

> > I was asking how bounds-of-thing-at-point does not take paragraph as
> > argument as well, since it does for word, sentence, line. Can
> > paragraph be included as well?
> 
> You could try to define it. There is function org--paragraph-at-point
> that gives information about paragraph at point. Try it out.

No need.

From the Commentary of file `thingatpt.el':

;; The function bounds-of-thing-at-point finds the beginning and end
;; positions by moving first forward to the end of the "thing", and then
;; backwards to the beginning.  By default, it uses the corresponding
;; forward-"thing" operator (eg. forward-word, forward-line).
;;
;; Special cases are allowed for using properties associated with the named
;; "thing":
;;
;;   forward-op		Function to call to skip forward over a "thing" (or
;;                      with a negative argument, backward).
;;
;;   beginning-op	Function to call to skip to the beginning of a "thing".
;;   end-op		Function to call to skip to the end of a "thing".
;;
;; Reliance on existing operators means that many `things' can be accessed
;; without further code:  eg.
;;     (thing-at-point 'line)
;;     (thing-at-point 'page)

It's enough that there's a function `forward-paragraph'
that moves forward over a paragraph.

`thing-at-point' is designed to be usable out of the
box with LOTS of things.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 18:45     ` Drew Adams
@ 2020-11-01 18:52       ` Jean Louis
  2020-11-01 19:00         ` Drew Adams
  2020-11-01 19:27         ` Eli Zaretskii
  0 siblings, 2 replies; 838+ messages in thread
From: Jean Louis @ 2020-11-01 18:52 UTC (permalink / raw)
  To: Drew Adams; +Cc: Christopher Dimech, Help Gnu Emacs

* Drew Adams <drew.adams@oracle.com> [2020-11-01 21:45]:
> > I was asking how bounds-of-thing-at-point does not take paragraph as argument
> > as well, since it does for word, sentence, line. Can paragraph be included as
> > well?
> 
> But it does.
> 
> (bounds-of-thing-at-point 'paragraph) works fine.

It works fine, but documentation does not describe it:

bounds-of-thing-at-point is an autoloaded compiled Lisp function in
‘thingatpt.el’.

(bounds-of-thing-at-point THING)

Determine the start and end buffer locations for the THING at point.
THING should be a symbol specifying a type of syntactic entity.
Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
‘line’, and ‘page’.

See the file ‘thingatpt.el’ for documentation on how to define a
valid THING.

Return a cons cell (START . END) giving the start and end
positions of the thing found.

> (thing-at-point 'paragraph) also works fine.

Also there documentation is not describing it:

thing-at-point is an autoloaded compiled Lisp function in
‘thingatpt.el’.

(thing-at-point THING &optional NO-PROPERTIES)

  Probably introduced at or before Emacs version 20.

Return the THING at point.
THING should be a symbol specifying a type of syntactic entity.
Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
‘line’, ‘number’, and ‘page’.


Could somebody update documentation for those functions?






^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 18:52       ` Jean Louis
@ 2020-11-01 19:00         ` Drew Adams
  2020-11-01 20:07           ` Christopher Dimech
  2020-11-01 20:36           ` Jean Louis
  2020-11-01 19:27         ` Eli Zaretskii
  1 sibling, 2 replies; 838+ messages in thread
From: Drew Adams @ 2020-11-01 19:00 UTC (permalink / raw)
  To: Jean Louis; +Cc: Christopher Dimech, Help Gnu Emacs

> > (bounds-of-thing-at-point 'paragraph) works fine.
> 
> It works fine, but documentation does not describe it:
> 
>   bounds-of-thing-at-point is an autoloaded compiled Lisp function in
>   ‘thingatpt.el’.
> 
>   (bounds-of-thing-at-point THING)
> 
>   Determine the start and end buffer locations for the THING at point.
>   THING should be a symbol specifying a type of syntactic entity.
>   Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
>   ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
>   ‘line’, and ‘page’.
> 
>   See the file ‘thingatpt.el’ for documentation on how to define a
>   valid THING.
> 
>   Return a cons cell (START . END) giving the start and end
>   positions of the thing found.

Just read it more carefully.

1. "Possibilities include"
                  ^^^^^^^

   It doesn't say that those are the only possibilities.

2. It points you to "`thingatpt.el' for documentation on
   how to define a valid THING."  IOW, for documentation
   what makes a THING defined for use by `thing-at-point'.

> > (thing-at-point 'paragraph) also works fine.
> 
> Also there documentation is not describing it:
> 
>   thing-at-point is an autoloaded compiled Lisp function in
>   ‘thingatpt.el’.
> 
>   (thing-at-point THING &optional NO-PROPERTIES)
> 
>     Probably introduced at or before Emacs version 20.
> 
>   Return the THING at point.
>   THING should be a symbol specifying a type of syntactic entity.
>   Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
>   ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
>   ‘line’, ‘number’, and ‘page’.

See above.  The word "include" doesn't mean the
same thing as "include only" or "comprise".  The
list of THINGS mentioned isn't exhaustive.

The English language includes the words "thing"
and "point" (but it also includes a lot more words).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 18:52       ` Jean Louis
  2020-11-01 19:00         ` Drew Adams
@ 2020-11-01 19:27         ` Eli Zaretskii
  2020-11-01 19:51           ` Christopher Dimech
  2020-11-01 20:23           ` Michael Heerdegen
  1 sibling, 2 replies; 838+ messages in thread
From: Eli Zaretskii @ 2020-11-01 19:27 UTC (permalink / raw)
  To: help-gnu-emacs

> Date: Sun, 1 Nov 2020 21:52:32 +0300
> From: Jean Louis <bugs@gnu.support>
> Cc: Christopher Dimech <dimech@gmx.com>,
>  Help Gnu Emacs <help-gnu-emacs@gnu.org>
> 
> Return the THING at point.
> THING should be a symbol specifying a type of syntactic entity.
> Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
> ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
> ‘line’, ‘number’, and ‘page’.
> 
> 
> Could somebody update documentation for those functions?

The number of "things" it can support is unbounded.  How would you
suggest to update the doc string to describe an infinite number of
possible objects?



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 19:27         ` Eli Zaretskii
@ 2020-11-01 19:51           ` Christopher Dimech
  2020-11-01 20:00             ` Eli Zaretskii
  2020-11-01 21:46             ` Drew Adams
  2020-11-01 20:23           ` Michael Heerdegen
  1 sibling, 2 replies; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 19:51 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: help-gnu-emacs

We should include ones that come to our minds would be useful, particularly those
customarily dealt by users. Linguistic structures are an example since many Emacs
users deal with words, sentences, and paragraphs on a daily basis.

More documentation is more useful than less documentation.  We can keep the more
exotic things off the list.  Especially THINGS coming from outer space. 




> Sent: Sunday, November 01, 2020 at 8:27 PM
> From: "Eli Zaretskii" <eliz@gnu.org>
> To: help-gnu-emacs@gnu.org
> Subject: Re: bounds-of-thing-at-point for paragraphs
>
> > Date: Sun, 1 Nov 2020 21:52:32 +0300
> > From: Jean Louis <bugs@gnu.support>
> > Cc: Christopher Dimech <dimech@gmx.com>,
> >  Help Gnu Emacs <help-gnu-emacs@gnu.org>
> > 
> > Return the THING at point.
> > THING should be a symbol specifying a type of syntactic entity.
> > Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
> > ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
> > ‘line’, ‘number’, and ‘page’.
> > 
> > 
> > Could somebody update documentation for those functions?
> 
> The number of "things" it can support is unbounded.  How would you
> suggest to update the doc string to describe an infinite number of
> possible objects?
> 
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 19:51           ` Christopher Dimech
@ 2020-11-01 20:00             ` Eli Zaretskii
  2020-11-01 20:09               ` Christopher Dimech
  2020-11-01 21:46             ` Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2020-11-01 20:00 UTC (permalink / raw)
  To: help-gnu-emacs

> From: Christopher Dimech <dimech@gmx.com>
> Cc: help-gnu-emacs@gnu.org
> Date: Sun, 1 Nov 2020 20:51:29 +0100
> 
> We should include ones that come to our minds would be useful

That we did already.  In fact, I think the list is too long as it is.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 19:00         ` Drew Adams
@ 2020-11-01 20:07           ` Christopher Dimech
  2020-11-01 22:06             ` Drew Adams
  2020-11-01 20:36           ` Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 20:07 UTC (permalink / raw)
  To: Drew Adams; +Cc: Help Gnu Emacs, Jean Louis

Looking at thingatpt.el is not helpful.  If you know important things
that are useful to know about it, place it at the top of the file.

I customarily define a documentation function for the file so that it
would be available interactively, even if mostly of interest to Elisp
Designers.


> Sent: Sunday, November 01, 2020 at 8:00 PM
> From: "Drew Adams" <drew.adams@oracle.com>
> To: "Jean Louis" <bugs@gnu.support>
> Cc: "Christopher Dimech" <dimech@gmx.com>, "Help Gnu Emacs" <help-gnu-emacs@gnu.org>
> Subject: RE: bounds-of-thing-at-point for paragraphs
>
> > > (bounds-of-thing-at-point 'paragraph) works fine.
> > 
> > It works fine, but documentation does not describe it:
> > 
> >   bounds-of-thing-at-point is an autoloaded compiled Lisp function in
> >   ‘thingatpt.el’.
> > 
> >   (bounds-of-thing-at-point THING)
> > 
> >   Determine the start and end buffer locations for the THING at point.
> >   THING should be a symbol specifying a type of syntactic entity.
> >   Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
> >   ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
> >   ‘line’, and ‘page’.
> > 
> >   See the file ‘thingatpt.el’ for documentation on how to define a
> >   valid THING.
> > 
> >   Return a cons cell (START . END) giving the start and end
> >   positions of the thing found.
> 
> Just read it more carefully.
> 
> 1. "Possibilities include"
>                   ^^^^^^^
> 
>    It doesn't say that those are the only possibilities.
> 
> 2. It points you to "`thingatpt.el' for documentation on
>    how to define a valid THING."  IOW, for documentation
>    what makes a THING defined for use by `thing-at-point'.
> 
> > > (thing-at-point 'paragraph) also works fine.
> > 
> > Also there documentation is not describing it:
> > 
> >   thing-at-point is an autoloaded compiled Lisp function in
> >   ‘thingatpt.el’.
> > 
> >   (thing-at-point THING &optional NO-PROPERTIES)
> > 
> >     Probably introduced at or before Emacs version 20.
> > 
> >   Return the THING at point.
> >   THING should be a symbol specifying a type of syntactic entity.
> >   Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
> >   ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
> >   ‘line’, ‘number’, and ‘page’.
> 
> See above.  The word "include" doesn't mean the
> same thing as "include only" or "comprise".  The
> list of THINGS mentioned isn't exhaustive.
> 
> The English language includes the words "thing"
> and "point" (but it also includes a lot more words).
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:00             ` Eli Zaretskii
@ 2020-11-01 20:09               ` Christopher Dimech
  2020-11-01 20:13                 ` Eli Zaretskii
  2020-11-01 20:27                 ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 2 replies; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 20:09 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: help-gnu-emacs


May I have my paragraph if you please?


> Sent: Sunday, November 01, 2020 at 9:00 PM
> From: "Eli Zaretskii" <eliz@gnu.org>
> To: help-gnu-emacs@gnu.org
> Subject: Re: bounds-of-thing-at-point for paragraphs
>
> > From: Christopher Dimech <dimech@gmx.com>
> > Cc: help-gnu-emacs@gnu.org
> > Date: Sun, 1 Nov 2020 20:51:29 +0100
> >
> > We should include ones that come to our minds would be useful
>
> That we did already.  In fact, I think the list is too long as it is.
>
>
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:09               ` Christopher Dimech
@ 2020-11-01 20:13                 ` Eli Zaretskii
  2020-11-01 20:27                 ` Emanuel Berg via Users list for the GNU Emacs text editor
  1 sibling, 0 replies; 838+ messages in thread
From: Eli Zaretskii @ 2020-11-01 20:13 UTC (permalink / raw)
  To: help-gnu-emacs

> From: Christopher Dimech <dimech@gmx.com>
> Cc: help-gnu-emacs@gnu.org
> Date: Sun, 1 Nov 2020 21:09:08 +0100
> 
> May I have my paragraph if you please?

Paragraphs aren't handled by thingatpt.el.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 19:27         ` Eli Zaretskii
  2020-11-01 19:51           ` Christopher Dimech
@ 2020-11-01 20:23           ` Michael Heerdegen
  2020-11-01 20:29             ` Christopher Dimech
  2020-11-01 21:01             ` Stefan Monnier
  1 sibling, 2 replies; 838+ messages in thread
From: Michael Heerdegen @ 2020-11-01 20:23 UTC (permalink / raw)
  To: help-gnu-emacs

Eli Zaretskii <eliz@gnu.org> writes:

> > Could somebody update documentation for those functions?
>
> The number of "things" it can support is unbounded.  How would you
> suggest to update the doc string to describe an infinite number of
> possible objects?

I think for discoverability for non-Elisp-programmer Emacs users it
would be nice at least if there was something that would dynamically
generate a list for you.

Michael.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:09               ` Christopher Dimech
  2020-11-01 20:13                 ` Eli Zaretskii
@ 2020-11-01 20:27                 ` Emanuel Berg via Users list for the GNU Emacs text editor
  2020-11-01 20:31                   ` Christopher Dimech
  1 sibling, 1 reply; 838+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2020-11-01 20:27 UTC (permalink / raw)
  To: help-gnu-emacs

Christopher Dimech wrote:

> May I have my paragraph if you please?

Do it yourself:

1. mark-paragraph

2. kill-region

3. re-search-backward for a blank line

4. yank

-- 
underground experts united
http://user.it.uu.se/~embe8573
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:23           ` Michael Heerdegen
@ 2020-11-01 20:29             ` Christopher Dimech
  2020-11-01 22:10               ` Drew Adams
  2020-11-01 21:01             ` Stefan Monnier
  1 sibling, 1 reply; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 20:29 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: help-gnu-emacs

> I think for discoverability for non-Elisp-programmer Emacs users it
> would be nice at least if there was something that would dynamically
> generate a list for you.

Fully agree.  A list is a beautiful thing.

---------------------
Christopher Dimech
General Administrator - Naiad Informatics - GNU Project (Geocomputation)
- Geophysical Simulation
- Geological Subsurface Mapping
- Disaster Preparedness and Mitigation
- Natural Resource Exploration and Production
- Free Software Advocacy


> Sent: Sunday, November 01, 2020 at 9:23 PM
> From: "Michael Heerdegen" <michael_heerdegen@web.de>
> To: help-gnu-emacs@gnu.org
> Subject: Re: bounds-of-thing-at-point for paragraphs
>
> Eli Zaretskii <eliz@gnu.org> writes:
>
> > > Could somebody update documentation for those functions?
> >
> > The number of "things" it can support is unbounded.  How would you
> > suggest to update the doc string to describe an infinite number of
> > possible objects?
>
> I think for discoverability for non-Elisp-programmer Emacs users it
> would be nice at least if there was something that would dynamically
> generate a list for you.
>
> Michael.
>
>
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:27                 ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2020-11-01 20:31                   ` Christopher Dimech
  2020-11-01 22:10                     ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 1 reply; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 20:31 UTC (permalink / raw)
  To: moasenwood; +Cc: help-gnu-emacs





> Sent: Sunday, November 01, 2020 at 9:27 PM
> From: "Emanuel Berg via Users list for the GNU Emacs text editor" <help-gnu-emacs@gnu.org>
> To: help-gnu-emacs@gnu.org
> Subject: Re: bounds-of-thing-at-point for paragraphs
>
> Christopher Dimech wrote:
>
> > May I have my paragraph if you please?
>
> Do it yourself:
>
> 1. mark-paragraph
>
> 2. kill-region
>
> 3. re-search-backward for a blank line
>
> 4. yank

I meant mentioning paragraph in documentation for bounds-of-thing-at-point

>
> --
> underground experts united
> http://user.it.uu.se/~embe8573
> https://dataswamp.org/~incal
>
>
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 19:00         ` Drew Adams
  2020-11-01 20:07           ` Christopher Dimech
@ 2020-11-01 20:36           ` Jean Louis
  2020-11-01 21:32             ` Michael Heerdegen
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-11-01 20:36 UTC (permalink / raw)
  To: Drew Adams; +Cc: Christopher Dimech, Help Gnu Emacs

* Drew Adams <drew.adams@oracle.com> [2020-11-01 22:01]:
> > > (bounds-of-thing-at-point 'paragraph) works fine.
> > 
> > It works fine, but documentation does not describe it:
> > 
> >   bounds-of-thing-at-point is an autoloaded compiled Lisp function in
> >   ‘thingatpt.el’.
> > 
> >   (bounds-of-thing-at-point THING)
> > 
> >   Determine the start and end buffer locations for the THING at point.
> >   THING should be a symbol specifying a type of syntactic entity.
> >   Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
> >   ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
> >   ‘line’, and ‘page’.
> > 
> >   See the file ‘thingatpt.el’ for documentation on how to define a
> >   valid THING.
> > 
> >   Return a cons cell (START . END) giving the start and end
> >   positions of the thing found.
> 
> Just read it more carefully.
> 
> 1. "Possibilities include"
>                   ^^^^^^^
> 
>    It doesn't say that those are the only possibilities.

Maybe if I say Sesame open the door... :-)

I went into thingatpt.el and I tried searching for "paragraph" and I
cannot find it. This opens plethora of possibilities to jump into
maybe other files and find "paragraph" defined. 

> >   Return the THING at point.
> >   THING should be a symbol specifying a type of syntactic entity.
> >   Possibilities include ‘symbol’, ‘list’, ‘sexp’, ‘defun’,
> >   ‘filename’, ‘url’, ‘email’, ‘uuid’, ‘word’, ‘sentence’, ‘whitespace’,
> >   ‘line’, ‘number’, and ‘page’.
> 
> See above.  The word "include" doesn't mean the
> same thing as "include only" or "comprise".  The
> list of THINGS mentioned isn't exhaustive.
> 
> The English language includes the words "thing"
> and "point" (but it also includes a lot more words).

Alright, sure. But that does not make it friendly to user to
understand that paragraph is included.

Do you have a word "paragraph" in your thingatpt.el?

-- 
There are 57 messages yet in my incoming mailbox.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:23           ` Michael Heerdegen
  2020-11-01 20:29             ` Christopher Dimech
@ 2020-11-01 21:01             ` Stefan Monnier
  1 sibling, 0 replies; 838+ messages in thread
From: Stefan Monnier @ 2020-11-01 21:01 UTC (permalink / raw)
  To: help-gnu-emacs

> I think for discoverability for non-Elisp-programmer Emacs users it
> would be nice at least if there was something that would dynamically
> generate a list for you.

`C-h o` can display a dynamically-generated list.
E.g. we do that for `pcase` (to list available patterns) and for generic
functions (to list existing methods).


        Stefan




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:36           ` Jean Louis
@ 2020-11-01 21:32             ` Michael Heerdegen
  2020-11-01 21:43               ` Jean Louis
  2020-11-01 21:43               ` Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Michael Heerdegen @ 2020-11-01 21:32 UTC (permalink / raw)
  To: help-gnu-emacs

Jean Louis <bugs@gnu.support> writes:

> I went into thingatpt.el and I tried searching for "paragraph" and I
> cannot find it. This opens plethora of possibilities to jump into
> maybe other files and find "paragraph" defined. 

AFAIU a thing "foo" gets defined as side effect when a function
`forward-foo' is defined.  Seems actually most "things" are defined that
way.

Michael.




^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 21:32             ` Michael Heerdegen
@ 2020-11-01 21:43               ` Jean Louis
  2020-11-01 21:43               ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-11-01 21:43 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: help-gnu-emacs

* Michael Heerdegen <michael_heerdegen@web.de> [2020-11-02 00:33]:
> Jean Louis <bugs@gnu.support> writes:
> 
> > I went into thingatpt.el and I tried searching for "paragraph" and I
> > cannot find it. This opens plethora of possibilities to jump into
> > maybe other files and find "paragraph" defined. 
> 
> AFAIU a thing "foo" gets defined as side effect when a function
> `forward-foo' is defined.  Seems actually most "things" are defined that
> way.

That's magic



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 21:32             ` Michael Heerdegen
  2020-11-01 21:43               ` Jean Louis
@ 2020-11-01 21:43               ` Jean Louis
  1 sibling, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-11-01 21:43 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: help-gnu-emacs

* Michael Heerdegen <michael_heerdegen@web.de> [2020-11-02 00:33]:
> Jean Louis <bugs@gnu.support> writes:
> 
> > I went into thingatpt.el and I tried searching for "paragraph" and I
> > cannot find it. This opens plethora of possibilities to jump into
> > maybe other files and find "paragraph" defined. 
> 
> AFAIU a thing "foo" gets defined as side effect when a function
> `forward-foo' is defined.  Seems actually most "things" are defined that
> way.
> 
> Michael.

Then it could magically update the docstring as well.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 19:51           ` Christopher Dimech
  2020-11-01 20:00             ` Eli Zaretskii
@ 2020-11-01 21:46             ` Drew Adams
  1 sibling, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-11-01 21:46 UTC (permalink / raw)
  To: Christopher Dimech, Eli Zaretskii; +Cc: help-gnu-emacs

> We can keep the more exotic things off the list.
> Especially THINGS coming from outer space.

Paragraphs come from outer space, like all other things.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:07           ` Christopher Dimech
@ 2020-11-01 22:06             ` Drew Adams
  2020-11-01 22:36               ` Christopher Dimech
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-01 22:06 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: Help Gnu Emacs, Jean Louis

> Looking at thingatpt.el is not helpful.

It's very helpful.  It directly answers your question.

Or perhaps you meant that needing to look at that file
is a burden.  That's different from saying that if you
do look in the file you find no help.

> If you know important things that are useful to know
> about it, place it at the top of the file.

Define "top" of the file.  Elisp files have certain
things, conventionally, at the very top.

One of the things they can have near the top, i.e.,
in the file header, is a Commentary section, which is
documentation.

And lo and behold, what do we find there, in lines
4-7 of the Commentary?  

 The function bounds-of-thing-at-point finds the beginning and end
 positions by moving first forward to the end of the "thing", and then
 backwards to the beginning.  By default, it uses the corresponding
 forward-"thing" operator (eg. forward-word, forward-line).

That directly answers your question, no?

What happens when you do `C-h f forward- TAB'?  Do you
see `forward-paragraph' listed?  QED.

> I customarily define a documentation function for the file so that it
> would be available interactively, even if mostly of interest to Elisp
> Designers.

You want interactive access to just the Commentary?
Your wish is granted:

 M-x finder-commentary thingatpt

That's how I got the text to include in my answer to
you, without having to remove comment chars (`;').

(And yes, you can use `TAB' with `finder-commentary'
to see all of the currently available libraries as
candidates.)



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:31                   ` Christopher Dimech
@ 2020-11-01 22:10                     ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 0 replies; 838+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2020-11-01 22:10 UTC (permalink / raw)
  To: help-gnu-emacs

Christopher Dimech wrote:

> I meant mentioning paragraph in documentation for
> bounds-of-thing-at-point

Wha...? :O

Heh, I thought you wanted to transpose paragraphs :)

-- 
underground experts united
http://user.it.uu.se/~embe8573
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 20:29             ` Christopher Dimech
@ 2020-11-01 22:10               ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-11-01 22:10 UTC (permalink / raw)
  To: Christopher Dimech, Michael Heerdegen; +Cc: help-gnu-emacs

> > I think for discoverability for non-Elisp-programmer Emacs users it
> > would be nice at least if there was something that would dynamically
> > generate a list for you.
> 
> Fully agree.  A list is a beautiful thing.

I use this, which is a straightforward definition
from the thingatpt.el Commentary.

(defun icicle-defined-thing-p (thing)
  "Return non-nil if THING is defined as a thing-at-point type.
THING is normally a symbol, but it can also be a string that names a
symbol or a cons whose car is such a string.  This is so that the
function can be used to filter completion candidates."
  (when (consp thing) (setq thing  (car thing)))
  (when (stringp thing) (setq thing  (intern thing)))
  (let ((forward-op    (or (get thing 'forward-op)
                           (intern-soft (format "forward-%s" thing))))
        (beginning-op  (get thing 'beginning-op))
        (end-op        (get thing 'end-op))
        (bounds-fn     (get thing 'bounds-of-thing-at-point))
        (thing-fn      (get thing 'thing-at-point)))
    (or (functionp forward-op)
        (and (functionp beginning-op)  (functionp end-op))
        (functionp bounds-fn)
        (functionp thing-fn))))

(defun icicle-things-alist ()
  "Alist of most thing types currently defined.
Each is a cons (STRING), where STRING names a type of text entity for
which there is a either a corresponding `forward-'thing operation, or
corresponding `beginning-of-'thing and `end-of-'thing operations.  The
list includes the names of the symbols that satisfy
`icicle-defined-thing-p', but with these excluded: `thing', `buffer',
`point'."
  (let ((types  ()))
    (mapatoms
     (lambda (tt)
       (when (icicle-defined-thing-p tt)
         (push (symbol-name tt) types))))
    ;; Remove types that don't make sense.
    (dolist (typ  '("thing" "buffer" "point"))
      (setq types (delete typ types)))
    (setq types  (sort types #'string-lessp))
    (mapcar #'list types)))

Remove the mapcar sexp in the latter definition, if you
want just a list, not an alist, of names.  Map `intern'
over the list if you want symbols instead of strings.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 22:06             ` Drew Adams
@ 2020-11-01 22:36               ` Christopher Dimech
  2020-11-01 22:47                 ` Jean Louis
                                   ` (2 more replies)
  0 siblings, 3 replies; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 22:36 UTC (permalink / raw)
  To: Drew Adams; +Cc: Help Gnu Emacs, Jean Louis

When I tried I got "Can't find library thingatapt"

 M-x finder-commentary thingatpt



> Sent: Sunday, November 01, 2020 at 11:06 PM
> From: "Drew Adams" <drew.adams@oracle.com>
> To: "Christopher Dimech" <dimech@gmx.com>
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>, "Jean Louis" <bugs@gnu.support>
> Subject: RE: RE: bounds-of-thing-at-point for paragraphs
>
> > Looking at thingatpt.el is not helpful.
>
> It's very helpful.  It directly answers your question.
>
> Or perhaps you meant that needing to look at that file
> is a burden.  That's different from saying that if you
> do look in the file you find no help.
>
> > If you know important things that are useful to know
> > about it, place it at the top of the file.
>
> Define "top" of the file.  Elisp files have certain
> things, conventionally, at the very top.
>
> One of the things they can have near the top, i.e.,
> in the file header, is a Commentary section, which is
> documentation.
>
> And lo and behold, what do we find there, in lines
> 4-7 of the Commentary?
>
>  The function bounds-of-thing-at-point finds the beginning and end
>  positions by moving first forward to the end of the "thing", and then
>  backwards to the beginning.  By default, it uses the corresponding
>  forward-"thing" operator (eg. forward-word, forward-line).
>
> That directly answers your question, no?
>
> What happens when you do `C-h f forward- TAB'?  Do you
> see `forward-paragraph' listed?  QED.
>
> > I customarily define a documentation function for the file so that it
> > would be available interactively, even if mostly of interest to Elisp
> > Designers.
>
> You want interactive access to just the Commentary?
> Your wish is granted:
>
>  M-x finder-commentary thingatpt
>
> That's how I got the text to include in my answer to
> you, without having to remove comment chars (`;').
>
> (And yes, you can use `TAB' with `finder-commentary'
> to see all of the currently available libraries as
> candidates.)
>
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 22:36               ` Christopher Dimech
@ 2020-11-01 22:47                 ` Jean Louis
  2020-11-01 22:52                   ` Drew Adams
  2020-11-01 22:49                 ` RE: RE: bounds-of-thing-at-point for paragraphs Jean Louis
  2020-11-01 22:51                 ` Drew Adams
  2 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-11-01 22:47 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: GNU Emacs Help

* Christopher Dimech <dimech@gmx.com> [2020-11-02 01:36]:
> When I tried I got "Can't find library thingatapt"
> 
>  M-x finder-commentary thingatpt

M-x find-library





^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 22:36               ` Christopher Dimech
  2020-11-01 22:47                 ` Jean Louis
@ 2020-11-01 22:49                 ` Jean Louis
  2020-11-01 22:51                 ` Drew Adams
  2 siblings, 0 replies; 838+ messages in thread
From: Jean Louis @ 2020-11-01 22:49 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: GNU Emacs Help

* Christopher Dimech <dimech@gmx.com> [2020-11-02 01:36]:
> When I tried I got "Can't find library thingatapt"
> 
>  M-x finder-commentary thingatpt

Sorry I did not see you wish to find commentary only. On my side that
function works. Do you complete with TAB when typing in minibuffer?




^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 22:36               ` Christopher Dimech
  2020-11-01 22:47                 ` Jean Louis
  2020-11-01 22:49                 ` RE: RE: bounds-of-thing-at-point for paragraphs Jean Louis
@ 2020-11-01 22:51                 ` Drew Adams
  2020-11-01 23:10                   ` Christopher Dimech
  2 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-01 22:51 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: Help Gnu Emacs, Jean Louis

> When I tried I got "Can't find library thingatapt"
>
>>   M-x finder-commentary thingatpt

thingatpt, not thingatapt
                      ^


emacs -Q

M-x finder-commentary RET thi TAB RET



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 22:47                 ` Jean Louis
@ 2020-11-01 22:52                   ` Drew Adams
  2020-11-01 23:14                     ` Christopher Dimech
  2020-11-02  6:07                     ` finder-commentary Jean Louis
  0 siblings, 2 replies; 838+ messages in thread
From: Drew Adams @ 2020-11-01 22:52 UTC (permalink / raw)
  To: Jean Louis, Christopher Dimech; +Cc: GNU Emacs Help

> >  M-x finder-commentary thingatpt
> 
> M-x find-library

Nope, not what I meant.  Sure, you can bring up
the whole file.  But `finder-commentary' is a
help command designed just for this purpose.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: RE: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 22:51                 ` Drew Adams
@ 2020-11-01 23:10                   ` Christopher Dimech
  2020-11-02  1:05                     ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 23:10 UTC (permalink / raw)
  To: Drew Adams; +Cc: Help Gnu Emacs, Jean Louis


I did 'M-x finder-commentary Ret thing Tab'

which got me Library name: thingatpt.elc

Result: "Can't find library thingatpt"



> Sent: Sunday, November 01, 2020 at 11:51 PM
> From: "Drew Adams" <drew.adams@oracle.com>
> To: "Christopher Dimech" <dimech@gmx.com>
> Cc: "Help Gnu Emacs" <help-gnu-emacs@gnu.org>, "Jean Louis" <bugs@gnu.support>
> Subject: RE: RE: RE: bounds-of-thing-at-point for paragraphs
>
> > When I tried I got "Can't find library thingatapt"
> >
> >>   M-x finder-commentary thingatpt
>
> thingatpt, not thingatapt
>                       ^
>
>
> emacs -Q
>
> M-x finder-commentary RET thi TAB RET
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: RE: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 22:52                   ` Drew Adams
@ 2020-11-01 23:14                     ` Christopher Dimech
  2020-11-02  1:07                       ` Drew Adams
  2020-11-02  6:07                     ` finder-commentary Jean Louis
  1 sibling, 1 reply; 838+ messages in thread
From: Christopher Dimech @ 2020-11-01 23:14 UTC (permalink / raw)
  To: Drew Adams; +Cc: GNU Emacs Help, Jean Louis

Of course I brought up the whole file.  Yet I could not figure out
about the paragraph thing.  Which region are you referring that is
useful to you?



> Sent: Sunday, November 01, 2020 at 11:52 PM
> From: "Drew Adams" <drew.adams@oracle.com>
> To: "Jean Louis" <bugs@gnu.support>, "Christopher Dimech" <dimech@gmx.com>
> Cc: "GNU Emacs Help" <help-gnu-emacs@gnu.org>
> Subject: RE: RE: RE: bounds-of-thing-at-point for paragraphs
>
> > >  M-x finder-commentary thingatpt
> >
> > M-x find-library
>
> Nope, not what I meant.  Sure, you can bring up
> the whole file.  But `finder-commentary' is a
> help command designed just for this purpose.
>



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: RE: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 23:10                   ` Christopher Dimech
@ 2020-11-02  1:05                     ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-11-02  1:05 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: Help Gnu Emacs, Jean Louis

> I did 'M-x finder-commentary Ret thing Tab'
> which got me Library name: thingatpt.elc
> Result: "Can't find library thingatpt"

What happens if you type the whole file name?

 M-x finder-commentary RET thingatpt.el RET

It should find that source file, if you have it.

Similarly, `M-x find-library thingatpt.el' should
find it.

Do you have source file thingatpt.el?  You should
have it, as part of the GNU Emacs distribution.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: RE: RE: RE: bounds-of-thing-at-point for paragraphs
  2020-11-01 23:14                     ` Christopher Dimech
@ 2020-11-02  1:07                       ` Drew Adams
  2020-11-02  4:09                         ` Robert Thorpe
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-02  1:07 UTC (permalink / raw)
  To: Christopher Dimech; +Cc: GNU Emacs Help, Jean Louis

> Of course I brought up the whole file.  

Which file?  Were you able to find file thingatpt.el?

> Yet I could not figure out about the paragraph thing.
> Which region are you referring that is useful to you?

Search for "Commentary" in file thingatpt.el.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-02  1:07                       ` Drew Adams
@ 2020-11-02  4:09                         ` Robert Thorpe
  2020-11-02 15:41                           ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Robert Thorpe @ 2020-11-02  4:09 UTC (permalink / raw)
  To: Drew Adams; +Cc: help-gnu-emacs

Drew Adams <drew.adams@oracle.com> writes:

>> Of course I brought up the whole file.  
>
> Which file?  Were you able to find file thingatpt.el?
>
>> Yet I could not figure out about the paragraph thing.
>> Which region are you referring that is useful to you?
>
> Search for "Commentary" in file thingatpt.el.

As a sidenote, I found another bug here.

In the buffer created by M-x finder-commentary it should be possible to
quit using "q", but that keybinding doesn't work.  I'll make a bug
report.

BR,
Robert Thorpe




^ permalink raw reply	[flat|nested] 838+ messages in thread

* finder-commentary
  2020-11-01 22:52                   ` Drew Adams
  2020-11-01 23:14                     ` Christopher Dimech
@ 2020-11-02  6:07                     ` Jean Louis
  2020-11-02 15:48                       ` finder-commentary Drew Adams
  1 sibling, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-11-02  6:07 UTC (permalink / raw)
  To: Drew Adams; +Cc: GNU Emacs Help

* Drew Adams <drew.adams@oracle.com> [2020-11-02 01:53]:
> > >  M-x finder-commentary thingatpt
> > 
> > M-x find-library
> 
> Nope, not what I meant.  Sure, you can bring up
> the whole file.  But `finder-commentary' is a
> help command designed just for this purpose.

Thank you, nice feature.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: bounds-of-thing-at-point for paragraphs
  2020-11-02  4:09                         ` Robert Thorpe
@ 2020-11-02 15:41                           ` Drew Adams
  2020-11-03  6:00                             ` Corwin Brust
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-02 15:41 UTC (permalink / raw)
  To: Robert Thorpe; +Cc: help-gnu-emacs

> In the buffer created by M-x finder-commentary it should be possible to
> quit using "q", but that keybinding doesn't work.  I'll make a bug
> report.

I don't see that.  I'm using Emacs 26.3.

`finder-mode-map' has `q' defined as `finder-exit',
which works fine, for me.  Its doc says:

Exit finder mode.
Delete the window and kill all Finder-related buffers.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: finder-commentary
  2020-11-02  6:07                     ` finder-commentary Jean Louis
@ 2020-11-02 15:48                       ` Drew Adams
  2020-11-02 16:02                         ` finder-commentary Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-02 15:48 UTC (permalink / raw)
  To: Jean Louis; +Cc: GNU Emacs Help

> >`finder-commentary' is a help command designed
> > just for this purpose.
> 
> Thank you, nice feature.

Maybe it should be on the `Help' menu somewhere.
___

[My library `menu-bar+.el' puts `finder-by-keyword'
on menu `Help' > `Learn More' > `Emacs Lisp' >
`Locate Libraries By Keyword'.  But I haven't added
a menu item anywhere for `finder-commentary'.]



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: finder-commentary
  2020-11-02 15:48                       ` finder-commentary Drew Adams
@ 2020-11-02 16:02                         ` Drew Adams
  2020-11-02 16:58                           ` finder-commentary Jean Louis
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-02 16:02 UTC (permalink / raw)
  To: Jean Louis; +Cc: GNU Emacs Help

BTW/FWIW -

My library `finder+.el' enhances Finder mode in minor ways.

In particular, it changes `finder-commentary' so it names
the buffer `*Commentary, <FILE>*, not just `*Finder*', so
you can have any number of such buffers and recognize which
libraries they are for.

https://www.emacswiki.org/emacs/download/finder%2b.el



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: finder-commentary
  2020-11-02 16:02                         ` finder-commentary Drew Adams
@ 2020-11-02 16:58                           ` Jean Louis
  2020-11-02 17:27                             ` finder-commentary Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Jean Louis @ 2020-11-02 16:58 UTC (permalink / raw)
  To: Drew Adams; +Cc: GNU Emacs Help

* Drew Adams <drew.adams@oracle.com> [2020-11-02 19:02]:
> BTW/FWIW -
> 
> My library `finder+.el' enhances Finder mode in minor ways.
> 
> In particular, it changes `finder-commentary' so it names
> the buffer `*Commentary, <FILE>*, not just `*Finder*', so
> you can have any number of such buffers and recognize which
> libraries they are for.
> 
> https://www.emacswiki.org/emacs/download/finder%2b.el

Is it automatically working with el-get? I can find it, and do
el-get-install but do not see how to activate.

-- 
There are 36 messages yet in my incoming mailbox.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: finder-commentary
  2020-11-02 16:58                           ` finder-commentary Jean Louis
@ 2020-11-02 17:27                             ` Drew Adams
  0 siblings, 0 replies; 838+ messages in thread
From: Drew Adams @ 2020-11-02 17:27 UTC (permalink / raw)
  To: Jean Louis; +Cc: GNU Emacs Help

> Is it automatically working with el-get? I can find it, and do
> el-get-install but do not see how to activate.

There's nothing to activate.  Just load `finder+.el'
(or a byte-compiled version of it, `finder.elc'):

. Put it in your `load-path', then (require 'finder+).

. Or interactively: `M-x load-library finder+'.

. Or interactively, if not in your `load-path':
  `M-x load-file <.../finder+.el[c]>

This is true of any Elisp library.  That is,
assuming the library has a `provide' you can
`require' it, to load it, assuming it's in your
`load-path'.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-02 15:41                           ` Drew Adams
@ 2020-11-03  6:00                             ` Corwin Brust
  2020-11-03  6:40                               ` Stefan Kangas
  0 siblings, 1 reply; 838+ messages in thread
From: Corwin Brust @ 2020-11-03  6:00 UTC (permalink / raw)
  To: Drew Adams; +Cc: Help Gnu Emacs mailing list, Robert Thorpe

Hi all,

On Mon, Nov 2, 2020 at 9:41 AM Drew Adams <drew.adams@oracle.com> wrote:
>
> > In the buffer created by M-x finder-commentary it should be possible to
> > quit using "q", but that keybinding doesn't work.  I'll make a bug
> > report.
>
> I don't see that.  I'm using Emacs 26.3.
>
> `finder-mode-map' has `q' defined as `finder-exit',
> which works fine, for me.  Its doc says:
>
> Exit finder mode.
> Delete the window and kill all Finder-related buffers.
>

I can reproduce this.  In fact, I had been about to submit the same
bug when I saw Robert's note (thanks Robert!)

So, likely regression in 27?  I'm not able to check master sadly.

Regards,
Corwin



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-03  6:00                             ` Corwin Brust
@ 2020-11-03  6:40                               ` Stefan Kangas
  2020-11-03  7:41                                 ` Corwin Brust
  0 siblings, 1 reply; 838+ messages in thread
From: Stefan Kangas @ 2020-11-03  6:40 UTC (permalink / raw)
  To: Corwin Brust, Drew Adams; +Cc: Help Gnu Emacs mailing list, Robert Thorpe

Corwin Brust <corwin@bru.st> writes:

>> Exit finder mode.
>> Delete the window and kill all Finder-related buffers.
>
> I can reproduce this.  In fact, I had been about to submit the same
> bug when I saw Robert's note (thanks Robert!)
>
> So, likely regression in 27?  I'm not able to check master sadly.

See Bug#44384, fixed on master.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-03  6:40                               ` Stefan Kangas
@ 2020-11-03  7:41                                 ` Corwin Brust
  2020-11-03 16:07                                   ` Drew Adams
  0 siblings, 1 reply; 838+ messages in thread
From: Corwin Brust @ 2020-11-03  7:41 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Help Gnu Emacs mailing list, Robert Thorpe

Thank you Stefan!

On Tue, Nov 3, 2020 at 12:40 AM Stefan Kangas <stefankangas@gmail.com> wrote:
>
> Corwin Brust <corwin@bru.st> writes:
[...]
> > So, likely regression in 27?  I'm not able to check master sadly.
>
> See Bug#44384, fixed on master.

FWIW, I can also repro this on 26.3 under -Q so I no longer think this
is a regression for 27.

Regards,
Corwin



^ permalink raw reply	[flat|nested] 838+ messages in thread

* RE: bounds-of-thing-at-point for paragraphs
  2020-11-03  7:41                                 ` Corwin Brust
@ 2020-11-03 16:07                                   ` Drew Adams
  2020-11-06 23:45                                     ` Corwin Brust
  0 siblings, 1 reply; 838+ messages in thread
From: Drew Adams @ 2020-11-03 16:07 UTC (permalink / raw)
  To: Corwin Brust, Stefan Kangas; +Cc: Help Gnu Emacs mailing list, Robert Thorpe

> FWIW, I can also repro this on 26.3 under -Q so I no longer think this
> is a regression for 27.

What is it that you can repro on 26.3? What's the recipe?

If I use `emacs -Q' then `q' exits with `finder-exit',
which deletes the window (unless it's alone in its frame).

I think that's what `q' has always done in such a Finder
window (until the regression introduced in Emacs 27).



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-03 16:07                                   ` Drew Adams
@ 2020-11-06 23:45                                     ` Corwin Brust
  2020-11-07  1:26                                       ` Stefan Kangas
  0 siblings, 1 reply; 838+ messages in thread
From: Corwin Brust @ 2020-11-06 23:45 UTC (permalink / raw)
  To: Drew Adams; +Cc: Help Gnu Emacs mailing list, Robert Thorpe, Stefan Kangas

Thanks for replying back in Drew, I missed had missed this and just saw now.

On Tue, Nov 3, 2020 at 10:07 AM Drew Adams <drew.adams@oracle.com> wrote:
>
> > FWIW, I can also repro this on 26.3 under -Q so I no longer think this
> > is a regression for 27.
>
> What is it that you can repro on 26.3? What's the recipe?
>
> If I use `emacs -Q' then `q' exits with `finder-exit',
> which deletes the window (unless it's alone in its frame).
>
> I think that's what `q' has always done in such a Finder
> window (until the regression introduced in Emacs 27).

I retested and now agree this is a regression for Emacs 27.

I was intially confused about the different behaviour when the
*Finder-package* is the only window in the frame.  Retesting under -Q
in 26.3 and 27.1 clearly gives different behavior when the commentary
buffer's window isn't made to occupy the whole frame.

Stephan,

I think this should be pushed to the Emacs 27 branch. Are you convinced?

Regards,
Corwin
612-217-1742
612-695-4276 (signal)
corwin@bru.st



^ permalink raw reply	[flat|nested] 838+ messages in thread

* Re: bounds-of-thing-at-point for paragraphs
  2020-11-06 23:45                                     ` Corwin Brust
@ 2020-11-07  1:26                                       ` Stefan Kangas
  0 siblings, 0 replies; 838+ messages in thread
From: Stefan Kangas @ 2020-11-07  1:26 UTC (permalink / raw)
  To: Corwin Brust, Drew Adams; +Cc: Help Gnu Emacs mailing list, Robert Thorpe

Corwin Brust <corwin@bru.st> writes:

> I think this should be pushed to the Emacs 27 branch. Are you convinced?

OK; done.



^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2020-08-07 10:53                 ` Philip K.
  2020-08-08 23:54                   ` Juri Linkov
@ 2021-05-12 20:38                   ` Lars Ingebrigtsen
  2021-05-12 21:27                     ` Philip Kaludercic
  2021-05-22 20:29                     ` Philip Kaludercic
  1 sibling, 2 replies; 838+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-12 20:38 UTC (permalink / raw)
  To: Philip K.; +Cc: 41438, Juri Linkov

"Philip K." <philipk@posteo.net> writes:

> These are the only edge-cases I found, but I didn't fix them yet, as I'm
> not sure what would be preferred. So the patches should not be applies yet.

Have you done any further work on this?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-12 20:38                   ` Lars Ingebrigtsen
@ 2021-05-12 21:27                     ` Philip Kaludercic
  2021-05-22 20:29                     ` Philip Kaludercic
  1 sibling, 0 replies; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-12 21:27 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 41438, Juri Linkov

Lars Ingebrigtsen <larsi@gnus.org> writes:

> "Philip K." <philipk@posteo.net> writes:
>
>> These are the only edge-cases I found, but I didn't fix them yet, as I'm
>> not sure what would be preferred. So the patches should not be applies yet.
>
> Have you done any further work on this?

No, not since whenever that message was sent.

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-12 20:38                   ` Lars Ingebrigtsen
  2021-05-12 21:27                     ` Philip Kaludercic
@ 2021-05-22 20:29                     ` Philip Kaludercic
  2021-05-22 21:09                       ` Philip Kaludercic
  2021-05-25  5:12                       ` Lars Ingebrigtsen
  1 sibling, 2 replies; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-22 20:29 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 41438, Juri Linkov

[-- Attachment #1: Type: text/plain, Size: 1033 bytes --]

Lars Ingebrigtsen <larsi@gnus.org> writes:

> "Philip K." <philipk@posteo.net> writes:
>
>> These are the only edge-cases I found, but I didn't fix them yet, as I'm
>> not sure what would be preferred. So the patches should not be applies yet.
>
> Have you done any further work on this?

I have been thinking about this a bit more, and tried a different
approach. The implementation is not prefect, but basically I am playing
with emulation-mode-map-alists to bind the keys, instead of using the
global map.

The should solve the two issues I brought up, because I do not have to
worry about restoring the previous keys, and some edge-cases are
avoided, where e.g. doc-view would override up and down breaking the
expected behaviour when setting the prefix to 'none.

The code should probably be refactored, moving more of the common
functionality into it's own function, but I am primarily wondering if
using emulation-mode-map-alists the way I am proposing it here is ok. Or
should I prefer minor-mode-map-alist?

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Allow-windmove-keys-to-be-bound-without-prefix-or-mo.patch --]
[-- Type: text/x-diff, Size: 7384 bytes --]

From eba161853d50c2a6ce27af5907efdae4f6ab81eb Mon Sep 17 00:00:00 2001
From: Philip K <philipk@posteo.net>
Date: Sat, 22 May 2021 22:03:22 +0200
Subject: [PATCH] Allow windmove keys to be bound without prefix or modifiers

---
 lisp/windmove.el | 91 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 70 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..acd9cb41fc 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,35 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-map (make-sparse-keymap)
+  "Keymap to bind windmove keys to.")
+
+(add-to-list 'emulation-mode-map-alists
+             (list (cons t windmove-map)))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (dolist (bind '((windmove-left left)
+                  (windmove-right right)
+                  (windmove-up up)
+                  (windmove-down down)))
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-map))
+        (define-key windmove-map old nil))
+      (define-key windmove-map
+        (vector (append modifiers (cdr bind)))
+        (car bind)))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +562,27 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (dolist (bind '((windmove-display-left left)
+                  (windmove-display-right right)
+                  (windmove-display-up up)
+                  (windmove-display-down down)
+                  (windmove-display-same-window ?0)
+                  (windmove-display-new-frame ?f)
+                  (windmove-display-new-tab ?t)))
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-map))
+        (define-key windmove-map old nil))
+      (define-key windmove-map
+        (vector (append modifiers (cdr bind)))
+        (car bind)))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +644,28 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (dolist (bind '((windmove-delete-left left)
+                  (windmove-delete-right right)
+                  (windmove-delete-up up)
+                  (windmove-delete-down down)))
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-map))
+        (define-key windmove-map old nil))
+      (define-key windmove-map
+        (vector (append modifiers (cdr bind)))
+        (car bind)))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +711,25 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (dolist (bind '((windmove-swap-states-left left)
+                  (windmove-swap-states-right right)
+                  (windmove-swap-states-up up)
+                  (windmove-swap-states-down down)))
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-map))
+        (define-key windmove-map old nil))
+      (define-key windmove-map
+        (vector (append modifiers (cdr bind)))
+        (car bind)))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-22 20:29                     ` Philip Kaludercic
@ 2021-05-22 21:09                       ` Philip Kaludercic
  2021-05-23  6:49                         ` Eli Zaretskii
  2021-05-25  5:12                       ` Lars Ingebrigtsen
  1 sibling, 1 reply; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-22 21:09 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 41438, Juri Linkov

[-- Attachment #1: Type: text/plain, Size: 358 bytes --]


Philip Kaludercic <philipk@posteo.net> writes:

> The code should probably be refactored, moving more of the common
> functionality into it's own function, but I am primarily wondering if
> using emulation-mode-map-alists the way I am proposing it here is ok. Or
> should I prefer minor-mode-map-alist?

Here is a slightly cleaner version.

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Allow-windmove-keys-to-be-bound-without-prefix-or-mo.patch --]
[-- Type: text/x-diff, Size: 7168 bytes --]

From 03248e79527f9603aa944e7e147fc67a8886eb3a Mon Sep 17 00:00:00 2001
From: Philip K <philipk@posteo.net>
Date: Sat, 22 May 2021 22:03:22 +0200
Subject: [PATCH] Allow windmove keys to be bound without prefix or modifiers

---
 lisp/windmove.el | 79 +++++++++++++++++++++++++++++++++++-------------
 1 file changed, 58 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..bb9478eab4 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,41 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-default-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(defun windmove-install-defaults (modifiers alist)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, before installing the key.  Previous
+bindings of FN are unbound."
+  (add-to-list 'emulation-mode-map-alists `((t . ,windmove-default-map)))
+  (dolist (bind alist)
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-default-map))
+        (define-key windmove-default-map old nil))
+      (define-key windmove-default-map
+        (vector (append modifiers (cdr bind)))
+        (car bind)))))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +568,21 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (windmove-install-defaults modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +644,22 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +705,19 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-22 21:09                       ` Philip Kaludercic
@ 2021-05-23  6:49                         ` Eli Zaretskii
  2021-05-23 12:36                           ` Philip Kaludercic
  0 siblings, 1 reply; 838+ messages in thread
From: Eli Zaretskii @ 2021-05-23  6:49 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, larsi, juri

> From: Philip Kaludercic <philipk@posteo.net>
> Date: Sat, 22 May 2021 21:09:00 +0000
> Cc: 41438@debbugs.gnu.org, Juri Linkov <juri@linkov.net>
> 
> Philip Kaludercic <philipk@posteo.net> writes:
> 
> > The code should probably be refactored, moving more of the common
> > functionality into it's own function, but I am primarily wondering if
> > using emulation-mode-map-alists the way I am proposing it here is ok. Or
> > should I prefer minor-mode-map-alist?
> 
> Here is a slightly cleaner version.

Thanks.  Should this be in NEWS?





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-23  6:49                         ` Eli Zaretskii
@ 2021-05-23 12:36                           ` Philip Kaludercic
  0 siblings, 0 replies; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-23 12:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 41438, larsi, juri

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Philip Kaludercic <philipk@posteo.net>
>> Date: Sat, 22 May 2021 21:09:00 +0000
>> Cc: 41438@debbugs.gnu.org, Juri Linkov <juri@linkov.net>
>> 
>> Philip Kaludercic <philipk@posteo.net> writes:
>> 
>> > The code should probably be refactored, moving more of the common
>> > functionality into it's own function, but I am primarily wondering if
>> > using emulation-mode-map-alists the way I am proposing it here is ok. Or
>> > should I prefer minor-mode-map-alist?
>> 
>> Here is a slightly cleaner version.
>
> Thanks.  Should this be in NEWS?

I think so. IIRC the plan was to add a few additional user options to
make it easier to configure.

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-22 20:29                     ` Philip Kaludercic
  2021-05-22 21:09                       ` Philip Kaludercic
@ 2021-05-25  5:12                       ` Lars Ingebrigtsen
  2021-05-25  7:25                         ` Philip Kaludercic
  2021-05-25  9:53                         ` Philip Kaludercic
  1 sibling, 2 replies; 838+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-25  5:12 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Juri Linkov

Philip Kaludercic <philipk@posteo.net> writes:

> The code should probably be refactored, moving more of the common
> functionality into it's own function, but I am primarily wondering if
> using emulation-mode-map-alists the way I am proposing it here is ok. Or
> should I prefer minor-mode-map-alist?

Making windmove into a regular (global) minor mode would be less
surprising, I think, but I'm not really familiar with windmove, and
whether that would be an easy rewrite?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25  5:12                       ` Lars Ingebrigtsen
@ 2021-05-25  7:25                         ` Philip Kaludercic
  2021-05-25  9:53                         ` Philip Kaludercic
  1 sibling, 0 replies; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-25  7:25 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 41438, Juri Linkov

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> The code should probably be refactored, moving more of the common
>> functionality into it's own function, but I am primarily wondering if
>> using emulation-mode-map-alists the way I am proposing it here is ok. Or
>> should I prefer minor-mode-map-alist?
>
> Making windmove into a regular (global) minor mode would be less
> surprising, I think, but I'm not really familiar with windmove, and
> whether that would be an easy rewrite?

From my experience, it should be possible, I'll try preparing a
patch. The only issue is that most people won't realize there is a minor
mode at first, but that should be OK as long as the actual windmove
commands do not depend on said minor mode.

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25  5:12                       ` Lars Ingebrigtsen
  2021-05-25  7:25                         ` Philip Kaludercic
@ 2021-05-25  9:53                         ` Philip Kaludercic
  2021-05-25 11:16                           ` Arthur Miller
                                             ` (3 more replies)
  1 sibling, 4 replies; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-25  9:53 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 41438, Juri Linkov

[-- Attachment #1: Type: text/plain, Size: 682 bytes --]

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> The code should probably be refactored, moving more of the common
>> functionality into it's own function, but I am primarily wondering if
>> using emulation-mode-map-alists the way I am proposing it here is ok. Or
>> should I prefer minor-mode-map-alist?
>
> Making windmove into a regular (global) minor mode would be less
> surprising, I think, but I'm not really familiar with windmove, and
> whether that would be an easy rewrite?

I have tried this out, and it seems somewhat elegant.  From my testing,
it seems to behave the same way as the previous approach.

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Improve-windmove-default-keybindings-fuctions.patch --]
[-- Type: text/x-diff, Size: 7751 bytes --]

From 2f7a8d89cdb5835cf875bc1f2bcfcb6755a0e0c0 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 25 May 2021 11:47:51 +0200
Subject: [PATCH] Improve windmove-*-default-keybindings fuctions

* windmove.el (windmove-default-map): Add special map for windmove
commands
(windmove-mode): Add minor mode for activating windmove-default-map
(windmove-install-defaults): Add general function for manipulating
windmove-default-map
(windmove-default-keybindings): Use windmove-install-defaults
(windmove-display-default-keybindings): Use windmove-install-defaults
(windmove-delete-default-keybindings): Use windmove-install-defaults
(windmove-swap-states-default-keybindings): Use
windmove-install-defaults
---
 lisp/windmove.el | 84 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 63 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..5a81893bf9 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,46 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-default-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(define-minor-mode windmove-mode
+  "Global minor mode for default windmove commands."
+  :keymap windmove-default-map
+  :init-value t
+  :global t)
+
+(defun windmove-install-defaults (modifiers alist)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, before installing the key.  Previous
+bindings of FN are unbound."
+  (dolist (bind alist)
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-default-map))
+        (define-key windmove-default-map old nil))
+      (define-key windmove-default-map
+        (vector (append modifiers (cdr bind)))
+        (car bind)))))
+
 ;;;###autoload
 (defun windmove-default-keybindingsq (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +573,21 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (windmove-install-defaults modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +649,22 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +710,19 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25  9:53                         ` Philip Kaludercic
@ 2021-05-25 11:16                           ` Arthur Miller
  2021-05-25 11:42                             ` Philip Kaludercic
  2021-05-25 11:36                           ` Arthur Miller
                                             ` (2 subsequent siblings)
  3 siblings, 1 reply; 838+ messages in thread
From: Arthur Miller @ 2021-05-25 11:16 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen, Juri Linkov

Philip Kaludercic <philipk@posteo.net> writes:

> Lars Ingebrigtsen <larsi@gnus.org> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> The code should probably be refactored, moving more of the common
>>> functionality into it's own function, but I am primarily wondering if
>>> using emulation-mode-map-alists the way I am proposing it here is ok. Or
>>> should I prefer minor-mode-map-alist?
>>
>> Making windmove into a regular (global) minor mode would be less
>> surprising, I think, but I'm not really familiar with windmove, and
>> whether that would be an easy rewrite?
>
> I have tried this out, and it seems somewhat elegant.  From my testing,
> it seems to behave the same way as the previous approach.
>
> -- 
> 	Philip K.
>
> From 2f7a8d89cdb5835cf875bc1f2bcfcb6755a0e0c0 Mon Sep 17 00:00:00 2001
> From: Philip Kaludercic <philipk@posteo.net>
> Date: Tue, 25 May 2021 11:47:51 +0200
> Subject: [PATCH] Improve windmove-*-default-keybindings fuctions
>
> * windmove.el (windmove-default-map): Add special map for windmove
> commands
> (windmove-mode): Add minor mode for activating windmove-default-map
> (windmove-install-defaults): Add general function for manipulating
> windmove-default-map
> (windmove-default-keybindings): Use windmove-install-defaults
> (windmove-display-default-keybindings): Use windmove-install-defaults
> (windmove-delete-default-keybindings): Use windmove-install-defaults
> (windmove-swap-states-default-keybindings): Use
> windmove-install-defaults
> ---
>  lisp/windmove.el | 84 ++++++++++++++++++++++++++++++++++++------------
>  1 file changed, 63 insertions(+), 21 deletions(-)
>
> diff --git a/lisp/windmove.el b/lisp/windmove.el
> index e4ea8e0f69..5a81893bf9 100644
> --- a/lisp/windmove.el
> +++ b/lisp/windmove.el
> @@ -426,19 +426,46 @@ windmove-down
>  ;; I don't think these bindings will work on non-X terminals; you
>  ;; probably want to use different bindings in that case.
>  
> +(defvar windmove-default-map (make-sparse-keymap)
> +  "Map used by `windmove-install-defaults'.")
Sorry if I ask, but wouldn't ordinary windmove-mode-map do here?

Since it is a convention to have mode maps called modename-mode-maps,
if people would like to change, or add a binding in the windmove mode
they would probably automatically try to alter windmove-mode-map instead
of windmove-default-map.


> +(define-minor-mode windmove-mode
> +  "Global minor mode for default windmove commands."
> +  :keymap windmove-default-map
> +  :init-value t
> +  :global t)
> +
> +(defun windmove-install-defaults (modifiers alist)
> +  "Install keys as specified by ALIST.
> +Every element of ALIST has the form (FN KEY), where KEY is
> +appended to MODIFIERS, before installing the key.  Previous
> +bindings of FN are unbound."
> +  (dolist (bind alist)
> +    (when (or (memq (cadr bind) '(left right up down))
> +              (not (null modifiers)))
> +      (dolist (old (where-is-internal (car bind) windmove-default-map))
> +        (define-key windmove-default-map old nil))
> +      (define-key windmove-default-map
> +        (vector (append modifiers (cdr bind)))
> +        (car bind)))))
> +
>  ;;;###autoload
>  (defun windmove-default-keybindingsq (&optional modifiers)
>    "Set up keybindings for `windmove'.
>  Keybindings are of the form MODIFIERS-{left,right,up,down},
>  where MODIFIERS is either a list of modifiers or a single modifier.
> +If MODIFIERS is `none', the keybindings will be directly bound to
> +the arrow keys.
>  Default value of MODIFIERS is `shift'."
>    (interactive)
>    (unless modifiers (setq modifiers 'shift))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
> -  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
> -  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
> -  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-left left)
> +                               (windmove-right right)
> +                               (windmove-up up)
> +                               (windmove-down down))))
>  
>  \f
>  ;;; Directional window display and selection
> @@ -546,17 +573,21 @@ windmove-display-default-keybindings
>  Keys are bound to commands that display the next buffer in the specified
>  direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
>  where MODIFIERS is either a list of modifiers or a single modifier.
> +If MODIFIERS is `none', the keybindings will be directly bound to
> +the arrow keys.
>  Default value of MODIFIERS is `shift-meta'."
>    (interactive)
>    (unless modifiers (setq modifiers '(shift meta)))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
> -  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
> -  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
> -  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
> -  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
> -  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
> -  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-display-left left)
> +                               (windmove-display-right right)
> +                               (windmove-display-up up)
> +                               (windmove-display-down down)
> +                               (windmove-display-same-window ?0)
> +                               (windmove-display-new-frame ?f)
> +                               (windmove-display-new-tab ?t))))
>  
>  \f
>  ;;; Directional window deletion
> @@ -618,16 +649,22 @@ windmove-delete-default-keybindings
>  Keys are bound to commands that delete windows in the specified
>  direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
>  where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
> -a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
> +a single modifier.
> +If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
> +are directly bound to the arrow keys.
> +Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
>    (interactive)
>    (unless prefix (setq prefix '(?\C-x)))
> +  (when (eq prefix 'none) (setq prefix nil))
>    (unless (listp prefix) (setq prefix (list prefix)))
>    (unless modifiers (setq modifiers '(shift)))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
> -  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
> -  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
> -  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-delete-left left)
> +                               (windmove-delete-right right)
> +                               (windmove-delete-up up)
> +                               (windmove-delete-down down))))
>  
>  \f
>  ;;; Directional window swap states
> @@ -673,14 +710,19 @@ windmove-swap-states-default-keybindings
>  Keys are bound to commands that swap the states of the selected window
>  with the window in the specified direction.  Keybindings are of the form
>  MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
> -or a single modifier.  Default value of MODIFIERS is `shift-super'."
> +or a single modifier.
> +If MODIFIERS is `none', the keybindings will be directly bound to the
> +arrow keys.
> +Default value of MODIFIERS is `shift-super'."
>    (interactive)
>    (unless modifiers (setq modifiers '(shift super)))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
> -  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
> -  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
> -  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-swap-states-left left)
> +                               (windmove-swap-states-right right)
> +                               (windmove-swap-states-up up)
> +                               (windmove-swap-states-down down))))
>  
>  \f
>  (provide 'windmove)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25  9:53                         ` Philip Kaludercic
  2021-05-25 11:16                           ` Arthur Miller
@ 2021-05-25 11:36                           ` Arthur Miller
  2021-05-25 11:46                             ` Philip Kaludercic
  2021-05-25 19:13                             ` Lars Ingebrigtsen
  2021-05-25 19:16                           ` Lars Ingebrigtsen
  2021-05-25 20:18                           ` Juri Linkov
  3 siblings, 2 replies; 838+ messages in thread
From: Arthur Miller @ 2021-05-25 11:36 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen, Juri Linkov

Philip Kaludercic <philipk@posteo.net> writes:

If you are already patching windmove.el, can you consider adding
bindings for these funcitions too (defined in window.el):

enlarge-window-horizontally
shrink-window-horizontally

As well as add these two wrappers for vertical operations:

#+begin_src emacs-lisp

;;;###autoload
(defun enlarge-window-vertically (delta)
  "Make selected window DELTA columns wider.
Interactively, if no argument is given, make selected window one
column wider."
  (interactive "p")
  (enlarge-window delta nil))

;;;###autoload
(defun shrink-window-vertically (delta)
  "Make selected window DELTA columns narrower.
Interactively, if no argument is given, make selected window one
column narrower."
  (interactive "p")
  (shrink-window delta nil))

#+end_src

I have been using those for long time myself since I prefer to do
everything from the keyboard. Maybe someone else finds them useful too;
they have been in my config on GH for long time.

> Lars Ingebrigtsen <larsi@gnus.org> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>
>>> The code should probably be refactored, moving more of the common
>>> functionality into it's own function, but I am primarily wondering if
>>> using emulation-mode-map-alists the way I am proposing it here is ok. Or
>>> should I prefer minor-mode-map-alist?
>>
>> Making windmove into a regular (global) minor mode would be less
>> surprising, I think, but I'm not really familiar with windmove, and
>> whether that would be an easy rewrite?
>
> I have tried this out, and it seems somewhat elegant.  From my testing,
> it seems to behave the same way as the previous approach.
>
> -- 
> 	Philip K.
>
> From 2f7a8d89cdb5835cf875bc1f2bcfcb6755a0e0c0 Mon Sep 17 00:00:00 2001
> From: Philip Kaludercic <philipk@posteo.net>
> Date: Tue, 25 May 2021 11:47:51 +0200
> Subject: [PATCH] Improve windmove-*-default-keybindings fuctions
>
> * windmove.el (windmove-default-map): Add special map for windmove
> commands
> (windmove-mode): Add minor mode for activating windmove-default-map
> (windmove-install-defaults): Add general function for manipulating
> windmove-default-map
> (windmove-default-keybindings): Use windmove-install-defaults
> (windmove-display-default-keybindings): Use windmove-install-defaults
> (windmove-delete-default-keybindings): Use windmove-install-defaults
> (windmove-swap-states-default-keybindings): Use
> windmove-install-defaults
> ---
>  lisp/windmove.el | 84 ++++++++++++++++++++++++++++++++++++------------
>  1 file changed, 63 insertions(+), 21 deletions(-)
>
> diff --git a/lisp/windmove.el b/lisp/windmove.el
> index e4ea8e0f69..5a81893bf9 100644
> --- a/lisp/windmove.el
> +++ b/lisp/windmove.el
> @@ -426,19 +426,46 @@ windmove-down
>  ;; I don't think these bindings will work on non-X terminals; you
>  ;; probably want to use different bindings in that case.
>  
> +(defvar windmove-default-map (make-sparse-keymap)
> +  "Map used by `windmove-install-defaults'.")
> +
> +(define-minor-mode windmove-mode
> +  "Global minor mode for default windmove commands."
> +  :keymap windmove-default-map
> +  :init-value t
> +  :global t)
> +
> +(defun windmove-install-defaults (modifiers alist)
> +  "Install keys as specified by ALIST.
> +Every element of ALIST has the form (FN KEY), where KEY is
> +appended to MODIFIERS, before installing the key.  Previous
> +bindings of FN are unbound."
> +  (dolist (bind alist)
> +    (when (or (memq (cadr bind) '(left right up down))
> +              (not (null modifiers)))
> +      (dolist (old (where-is-internal (car bind) windmove-default-map))
> +        (define-key windmove-default-map old nil))
> +      (define-key windmove-default-map
> +        (vector (append modifiers (cdr bind)))
> +        (car bind)))))
> +
>  ;;;###autoload
>  (defun windmove-default-keybindingsq (&optional modifiers)
>    "Set up keybindings for `windmove'.
>  Keybindings are of the form MODIFIERS-{left,right,up,down},
>  where MODIFIERS is either a list of modifiers or a single modifier.
> +If MODIFIERS is `none', the keybindings will be directly bound to
> +the arrow keys.
>  Default value of MODIFIERS is `shift'."
>    (interactive)
>    (unless modifiers (setq modifiers 'shift))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
> -  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
> -  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
> -  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-left left)
> +                               (windmove-right right)
> +                               (windmove-up up)
> +                               (windmove-down down))))
>  
>  \f
>  ;;; Directional window display and selection
> @@ -546,17 +573,21 @@ windmove-display-default-keybindings
>  Keys are bound to commands that display the next buffer in the specified
>  direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
>  where MODIFIERS is either a list of modifiers or a single modifier.
> +If MODIFIERS is `none', the keybindings will be directly bound to
> +the arrow keys.
>  Default value of MODIFIERS is `shift-meta'."
>    (interactive)
>    (unless modifiers (setq modifiers '(shift meta)))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
> -  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
> -  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
> -  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
> -  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
> -  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
> -  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-display-left left)
> +                               (windmove-display-right right)
> +                               (windmove-display-up up)
> +                               (windmove-display-down down)
> +                               (windmove-display-same-window ?0)
> +                               (windmove-display-new-frame ?f)
> +                               (windmove-display-new-tab ?t))))
>  
>  \f
>  ;;; Directional window deletion
> @@ -618,16 +649,22 @@ windmove-delete-default-keybindings
>  Keys are bound to commands that delete windows in the specified
>  direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
>  where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
> -a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
> +a single modifier.
> +If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
> +are directly bound to the arrow keys.
> +Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
>    (interactive)
>    (unless prefix (setq prefix '(?\C-x)))
> +  (when (eq prefix 'none) (setq prefix nil))
>    (unless (listp prefix) (setq prefix (list prefix)))
>    (unless modifiers (setq modifiers '(shift)))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
> -  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
> -  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
> -  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-delete-left left)
> +                               (windmove-delete-right right)
> +                               (windmove-delete-up up)
> +                               (windmove-delete-down down))))
>  
>  \f
>  ;;; Directional window swap states
> @@ -673,14 +710,19 @@ windmove-swap-states-default-keybindings
>  Keys are bound to commands that swap the states of the selected window
>  with the window in the specified direction.  Keybindings are of the form
>  MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
> -or a single modifier.  Default value of MODIFIERS is `shift-super'."
> +or a single modifier.
> +If MODIFIERS is `none', the keybindings will be directly bound to the
> +arrow keys.
> +Default value of MODIFIERS is `shift-super'."
>    (interactive)
>    (unless modifiers (setq modifiers '(shift super)))
> +  (when (eq modifiers 'none) (setq modifiers nil))
>    (unless (listp modifiers) (setq modifiers (list modifiers)))
> -  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
> -  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
> -  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
> -  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-swap-states-left left)
> +                               (windmove-swap-states-right right)
> +                               (windmove-swap-states-up up)
> +                               (windmove-swap-states-down down))))
>  
>  \f
>  (provide 'windmove)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 11:16                           ` Arthur Miller
@ 2021-05-25 11:42                             ` Philip Kaludercic
  2021-05-25 13:31                               ` Arthur Miller
  0 siblings, 1 reply; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-25 11:42 UTC (permalink / raw)
  To: Arthur Miller; +Cc: 41438, Lars Ingebrigtsen, Juri Linkov

Arthur Miller <arthur.miller@live.com> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>> +(defvar windmove-default-map (make-sparse-keymap)
>> +  "Map used by `windmove-install-defaults'.")
>
> Sorry if I ask, but wouldn't ordinary windmove-mode-map do here?

You are probably right -- my thought was that the minor mode exists for
the sake of the map.

> Since it is a convention to have mode maps called modename-mode-maps,
> if people would like to change, or add a binding in the windmove mode
> they would probably automatically try to alter windmove-mode-map instead
> of windmove-default-map.

That's the question: should windmove-default-map be accessed by default
or only via the -default-keybindings functions? Either way something
should be changed, if windmove-default-map it should be renamed to
windmove--default-map to explicitly mark it as an internal
map. Otherwise it should be renamed to windmove-mode-map as you suggest.

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 11:36                           ` Arthur Miller
@ 2021-05-25 11:46                             ` Philip Kaludercic
  2021-05-25 13:58                               ` Arthur Miller
  2021-05-25 19:13                             ` Lars Ingebrigtsen
  1 sibling, 1 reply; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-25 11:46 UTC (permalink / raw)
  To: Arthur Miller; +Cc: 41438, Lars Ingebrigtsen, Juri Linkov

Arthur Miller <arthur.miller@live.com> writes:

> If you are already patching windmove.el, can you consider adding
> bindings for these funcitions too (defined in window.el):
>
> enlarge-window-horizontally
> shrink-window-horizontally
>
> As well as add these two wrappers for vertical operations:
>
> #+begin_src emacs-lisp
>
> ;;;###autoload
> (defun enlarge-window-vertically (delta)
>   "Make selected window DELTA columns wider.
> Interactively, if no argument is given, make selected window one
> column wider."
>   (interactive "p")
>   (enlarge-window delta nil))
>
> ;;;###autoload
> (defun shrink-window-vertically (delta)
>   "Make selected window DELTA columns narrower.
> Interactively, if no argument is given, make selected window one
> column narrower."
>   (interactive "p")
>   (shrink-window delta nil))
>
> #+end_src
>
> I have been using those for long time myself since I prefer to do
> everything from the keyboard. Maybe someone else finds them useful too;
> they have been in my config on GH for long time.

I am not sure if these commands should be added as part of the same
changeset. The point of this commit is to make configuring windmove keys
using windmove-default-keybindings & co. more consistent.

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 11:42                             ` Philip Kaludercic
@ 2021-05-25 13:31                               ` Arthur Miller
  2021-05-25 14:39                                 ` Philip Kaludercic
  0 siblings, 1 reply; 838+ messages in thread
From: Arthur Miller @ 2021-05-25 13:31 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen, Juri Linkov

Philip Kaludercic <philipk@posteo.net> writes:

> Arthur Miller <arthur.miller@live.com> writes:
>
>> Philip Kaludercic <philipk@posteo.net> writes:
>>> +(defvar windmove-default-map (make-sparse-keymap)
>>> +  "Map used by `windmove-install-defaults'.")
>>
>> Sorry if I ask, but wouldn't ordinary windmove-mode-map do here?
>
> You are probably right -- my thought was that the minor mode exists for
> the sake of the map.

Yeah, exactly in this case. I am not sure if I understand correctly, you
mean people will set new map for the mode to change bindings?

I just remarked on the name you choose for the mode map, most peeps like
me probably expect it to be names after the convention 'modename-mode-map'.

>> Since it is a convention to have mode maps called modename-mode-maps,
>> if people would like to change, or add a binding in the windmove mode
>> they would probably automatically try to alter windmove-mode-map instead
>> of windmove-default-map.
>
> That's the question: should windmove-default-map be accessed by default
> or only via the -default-keybindings functions? Either way something

I think you are thinking about default keybindings reather than default
map. If I assume correctly. If I understand corectly you would like to
preserve some default bindings, the map is just a mean to accomplish it.

> should be changed, if windmove-default-map it should be renamed to
> windmove--default-map to explicitly mark it as an internal
> map. Otherwise it shsould be renamed to windmove-mode-map as you suggest.

Either use default map stored some "default var", and add a function
that restores mode map, or just add a function that resets keybindings
into mode map directly, which might be sufficient. I don't know matter
of taste? A default mode map in a variable is cleaner but more costly?

Emacs provides windows, so I think there should also be a default way of
moving cursor between them, manipulate them and so on. Thus I think
windmove operations should be on by default, I don't think C-x 1/2/3/o
are satisfying when we have more then 2 widows.

A minor mode is probably a good balance between altering Emacs defaults,
so not break someones config, and to give people an option to easily
turn on some useful feature/configuration.






^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 11:46                             ` Philip Kaludercic
@ 2021-05-25 13:58                               ` Arthur Miller
  0 siblings, 0 replies; 838+ messages in thread
From: Arthur Miller @ 2021-05-25 13:58 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen, Juri Linkov

Philip Kaludercic <philipk@posteo.net> writes:

> Arthur Miller <arthur.miller@live.com> writes:
>
>> If you are already patching windmove.el, can you consider adding
>> bindings for these funcitions too (defined in window.el):
>>
>> enlarge-window-horizontally
>> shrink-window-horizontally
>>
>> As well as add these two wrappers for vertical operations:
>>
>> #+begin_src emacs-lisp
>>
>> ;;;###autoload
>> (defun enlarge-window-vertically (delta)
>>   "Make selected window DELTA columns wider.
>> Interactively, if no argument is given, make selected window one
>> column wider."
>>   (interactive "p")
>>   (enlarge-window delta nil))
>>
>> ;;;###autoload
>> (defun shrink-window-vertically (delta)
>>   "Make selected window DELTA columns narrower.
>> Interactively, if no argument is given, make selected window one
>> column narrower."
>>   (interactive "p")
>>   (shrink-window delta nil))
>>
>> #+end_src
>>
>> I have been using those for long time myself since I prefer to do
>> everything from the keyboard. Maybe someone else finds them useful too;
>> they have been in my config on GH for long time.
>
> I am not sure if these commands should be added as part of the same
> changeset.
Those two wrappers itself are not necessary to add, they are just they
for the sake of naming. It looks better and more clear what a binding
does in "whick-key" window, in help buffers, and provides better
symmetry to shrink/enlarge-window-horizontally.

original functions are all in window.el:

shrink-window
enlarge-window
shrink-window-horizontally
enlarge-window-horizontally

> The point of this commit is to make configuring windmove keys
> using windmove-default-keybindings & co. more consistent.

I completeley understand you are concentrated just on windmove keys.

This is just a suggestion. I think windmove should have probably be
named from the beginning as "windoperations", since it does more than
just move corsor between windows.

Shrinking and enlarging windows is definitely a useful window operation
to beind on a key, in my opinion should have been in windmove.el since
beginning.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 13:31                               ` Arthur Miller
@ 2021-05-25 14:39                                 ` Philip Kaludercic
  0 siblings, 0 replies; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-25 14:39 UTC (permalink / raw)
  To: Arthur Miller; +Cc: 41438, Lars Ingebrigtsen, Juri Linkov

Arthur Miller <arthur.miller@live.com> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> Arthur Miller <arthur.miller@live.com> writes:
>>
>>> Philip Kaludercic <philipk@posteo.net> writes:
>>>> +(defvar windmove-default-map (make-sparse-keymap)
>>>> +  "Map used by `windmove-install-defaults'.")
>>>
>>> Sorry if I ask, but wouldn't ordinary windmove-mode-map do here?
>>
>> You are probably right -- my thought was that the minor mode exists for
>> the sake of the map.
>
> Yeah, exactly in this case. I am not sure if I understand correctly, you
> mean people will set new map for the mode to change bindings?

No, that is why the minor mode is active by default. The only reason the
minor mode is defined is to modify minor-mode-map-alist.

>> That's the question: should windmove-default-map be accessed by default
>> or only via the -default-keybindings functions? Either way something
>
> I think you are thinking about default keybindings reather than default
> map. If I assume correctly. If I understand corectly you would like to
> preserve some default bindings, the map is just a mean to accomplish it.

I am not sure what you are referring to, the map is manipulated by
windmove-install-defaults, which in turn is used by

* windmove-default-keybindings
* windmove-display-default-keybindings
* windmove-delete-default-keybindings
* windmove-swap-states-default-keybindings

So it is not just about preserving some default bindings, but ensuring
that the explicitly requested bindings are installed correctly.

>> should be changed, if windmove-default-map it should be renamed to
>> windmove--default-map to explicitly mark it as an internal
>> map. Otherwise it shsould be renamed to windmove-mode-map as you suggest.
>
> Either use default map stored some "default var", and add a function
> that restores mode map, or just add a function that resets keybindings
> into mode map directly, which might be sufficient. I don't know matter
> of taste? A default mode map in a variable is cleaner but more costly?
>
> Emacs provides windows, so I think there should also be a default way of
> moving cursor between them, manipulate them and so on. Thus I think
> windmove operations should be on by default, I don't think C-x 1/2/3/o
> are satisfying when we have more then 2 widows.
>
> A minor mode is probably a good balance between altering Emacs defaults,
> so not break someones config, and to give people an option to easily
> turn on some useful feature/configuration.

I'm sorry, either I am missing something or we are talking besides one
another.

-- 
	Philip K.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 11:36                           ` Arthur Miller
  2021-05-25 11:46                             ` Philip Kaludercic
@ 2021-05-25 19:13                             ` Lars Ingebrigtsen
  1 sibling, 0 replies; 838+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-25 19:13 UTC (permalink / raw)
  To: Arthur Miller; +Cc: 41438, Philip Kaludercic, Juri Linkov

Arthur Miller <arthur.miller@live.com> writes:

> If you are already patching windmove.el, can you consider adding
> bindings for these funcitions too (defined in window.el):

This seems unrelated to this current bug report, but you could open a
new wishlist bug report for this.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25  9:53                         ` Philip Kaludercic
  2021-05-25 11:16                           ` Arthur Miller
  2021-05-25 11:36                           ` Arthur Miller
@ 2021-05-25 19:16                           ` Lars Ingebrigtsen
  2021-05-25 19:25                             ` Philip Kaludercic
  2021-05-25 20:18                           ` Juri Linkov
  3 siblings, 1 reply; 838+ messages in thread
From: Lars Ingebrigtsen @ 2021-05-25 19:16 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Juri Linkov

Philip Kaludercic <philipk@posteo.net> writes:

> I have tried this out, and it seems somewhat elegant.  From my testing,
> it seems to behave the same way as the previous approach.

Looks good to me.  One minor thing:

> +(defvar windmove-default-map (make-sparse-keymap)
> +  "Map used by `windmove-install-defaults'.")

This should be called -mode-map.

I don't actually use windmove -- could somebody else who's using this
try this patch out and see whether it works well for them?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 19:16                           ` Lars Ingebrigtsen
@ 2021-05-25 19:25                             ` Philip Kaludercic
  0 siblings, 0 replies; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-25 19:25 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 41438, Juri Linkov

[-- Attachment #1: Type: text/plain, Size: 684 bytes --]

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Philip Kaludercic <philipk@posteo.net> writes:
>
>> I have tried this out, and it seems somewhat elegant.  From my testing,
>> it seems to behave the same way as the previous approach.
>
> Looks good to me.  One minor thing:
>
>> +(defvar windmove-default-map (make-sparse-keymap)
>> +  "Map used by `windmove-install-defaults'.")
>
> This should be called -mode-map.

Ok, the patch is below. I also added warning this time to net people
know if automatically bound keys would conflict.

> I don't actually use windmove -- could somebody else who's using this
> try this patch out and see whether it works well for them?

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Improve-windmove-default-keybindings-fuctions.patch --]
[-- Type: text/x-diff, Size: 7733 bytes --]

From d572168a4fce653dcded2c4ca54f324dca78e280 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 25 May 2021 11:47:51 +0200
Subject: [PATCH] Improve windmove-*-default-keybindings fuctions

* windmove.el (windmove-mode-map): Add special map for windmove
commands
(windmove-mode): Add minor mode for activating windmove-mode-map
(windmove-install-defaults): Add general function for manipulating
windmove-mode-map
(windmove-default-keybindings): Use windmove-install-defaults
(windmove-display-default-keybindings): Use windmove-install-defaults
(windmove-delete-default-keybindings): Use windmove-install-defaults
(windmove-swap-states-default-keybindings): Use
windmove-install-defaults
---
 lisp/windmove.el | 80 +++++++++++++++++++++++++++++++++++-------------
 1 file changed, 59 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..479fdef512 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,42 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-mode-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(defun windmove-install-defaults (modifiers alist)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, before installing the key.  Previous
+bindings of FN are unbound."
+  (dolist (bind alist)
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-mode-map))
+        (define-key windmove-mode-map old nil))
+      (let ((key (vector (append modifiers (cdr bind)))))
+        (let ((old-fn (lookup-key windmove-mode-map key)))
+          (when old-fn
+            (warn "Overriding %S with %S" old-fn (car bind))))
+        (define-key windmove-mode-map key (car bind))))))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +569,21 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (windmove-install-defaults modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +645,22 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +706,19 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (windmove-install-defaults modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25  9:53                         ` Philip Kaludercic
                                             ` (2 preceding siblings ...)
  2021-05-25 19:16                           ` Lars Ingebrigtsen
@ 2021-05-25 20:18                           ` Juri Linkov
  2021-05-25 21:45                             ` Philip Kaludercic
  3 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2021-05-25 20:18 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen

> -  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
> -  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
> -  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
> -  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
> +  (windmove-install-defaults modifiers
> +                             '((windmove-delete-left left)
> +                               (windmove-delete-right right)
> +                               (windmove-delete-up up)
> +                               (windmove-delete-down down))))

I haven't yet tested your patch, but after reading it seems 'prefix' is unused now?





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 20:18                           ` Juri Linkov
@ 2021-05-25 21:45                             ` Philip Kaludercic
  2021-05-26 21:35                               ` Juri Linkov
  0 siblings, 1 reply; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-25 21:45 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, Lars Ingebrigtsen

[-- Attachment #1: Type: text/plain, Size: 1177 bytes --]

Juri Linkov <juri@linkov.net> writes:

>> -  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
>> -  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
>> -  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
>> -  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
>> +  (windmove-install-defaults modifiers
>> +                             '((windmove-delete-left left)
>> +                               (windmove-delete-right right)
>> +                               (windmove-delete-up up)
>> +                               (windmove-delete-down down))))
>
> I haven't yet tested your patch, but after reading it seems 'prefix' is unused now?

You are right, I didn't test that specific function
properly. windmove-install-defaults had to be extended by another
argument to fix this.

What I don't really like is that only
windmove-delete-default-keybindings can make use of prefixes, while all
commands only use modifiers. Could it make sense to deprecate these
functions in favour of either new functions or user-options?

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Improve-windmove-default-keybindings-fuctions.patch --]
[-- Type: text/x-diff, Size: 8010 bytes --]

From ecbed85db9622ef5b1680472273163cb7789ae3f Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 25 May 2021 11:47:51 +0200
Subject: [PATCH] Improve windmove-*-default-keybindings fuctions

* windmove.el (windmove-mode-map): Add special map for windmove
commands
(windmove-mode): Add minor mode for activating windmove-mode-map
(windmove-install-defaults): Add general function for manipulating
windmove-mode-map
(windmove-default-keybindings): Use windmove-install-defaults
(windmove-display-default-keybindings): Use windmove-install-defaults
(windmove-delete-default-keybindings): Use windmove-install-defaults
(windmove-swap-states-default-keybindings): Use
windmove-install-defaults
---
 lisp/windmove.el | 87 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 66 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..d7c1d25d82 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,49 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-mode-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(define-minor-mode windmove-mode
+  "Global minor mode for default windmove commands."
+  :keymap windmove-mode-map
+  :init-value t
+  :global t)
+
+(defun windmove-install-defaults (prefix modifiers alist)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, adding PREFIX to the beginning, before
+installing the key.  Previous bindings of FN are unbound."
+  (dolist (bind alist)
+    (when (or (memq (cadr bind) '(left right up down))
+              (not (null modifiers)))
+      (dolist (old (where-is-internal (car bind) windmove-mode-map))
+        (define-key windmove-mode-map old nil))
+      (let ((key (vconcat (if (eq prefix 'none) nil prefix)
+                          (list (append modifiers (cdr bind))))))
+        (let ((old-fn (lookup-key windmove-mode-map key)))
+          (when old-fn
+            (warn "Overriding %S with %S" old-fn (car bind))))
+        (define-key windmove-mode-map key (car bind))))))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +576,21 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +652,22 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (windmove-install-defaults prefix modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +713,19 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-25 21:45                             ` Philip Kaludercic
@ 2021-05-26 21:35                               ` Juri Linkov
  2021-05-27 11:09                                 ` Philip Kaludercic
  0 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2021-05-26 21:35 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen

> What I don't really like is that only
> windmove-delete-default-keybindings can make use of prefixes, while all
> commands only use modifiers. Could it make sense to deprecate these
> functions in favour of either new functions or user-options?

Maybe it's possible to add new user options without deprecating the
existing functions?  Then for users an alternative way would be to
customize these options, and enable windmove-mode in the init file.
Or maybe there will be a need to create separate modes for every
keymap, e.g. windmove-display-mode, windmove-delete-mode?





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-26 21:35                               ` Juri Linkov
@ 2021-05-27 11:09                                 ` Philip Kaludercic
  2021-05-30 22:11                                   ` Juri Linkov
  0 siblings, 1 reply; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-27 11:09 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, Lars Ingebrigtsen

[-- Attachment #1: Type: text/plain, Size: 822 bytes --]

Juri Linkov <juri@linkov.net> writes:

>> What I don't really like is that only
>> windmove-delete-default-keybindings can make use of prefixes, while all
>> commands only use modifiers. Could it make sense to deprecate these
>> functions in favour of either new functions or user-options?
>
> Maybe it's possible to add new user options without deprecating the
> existing functions?  Then for users an alternative way would be to
> customize these options, and enable windmove-mode in the init file.

Of course, why not? The patches below should implement that.

> Or maybe there will be a need to create separate modes for every
> keymap, e.g. windmove-display-mode, windmove-delete-mode?

I don't see why that should be necessary, as the proposed windmove-mode
doesn't even have the interest the user.

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Improve-windmove-default-keybindings-fuctions.patch --]
[-- Type: text/x-diff, Size: 8244 bytes --]

From 42a66e87af83817b9e989624fdbf9c7ee7c347c7 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 25 May 2021 11:47:51 +0200
Subject: [PATCH 1/2] Improve windmove-*-default-keybindings fuctions

* windmove.el (windmove-mode-map): Add special map for windmove
commands
(windmove-mode): Add minor mode for activating windmove-mode-map
(windmove-install-defaults): Add general function for manipulating
windmove-mode-map
(windmove-default-keybindings): Use windmove-install-defaults
(windmove-display-default-keybindings): Use windmove-install-defaults
(windmove-delete-default-keybindings): Use windmove-install-defaults
(windmove-swap-states-default-keybindings): Use
windmove-install-defaults
---
 lisp/windmove.el | 91 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 70 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..cd8592f341 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,53 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-mode-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(define-minor-mode windmove-mode
+  "Global minor mode for default windmove commands."
+  :keymap windmove-mode-map
+  :init-value t
+  :global t)
+
+(defun windmove-install-defaults (prefix modifiers alist &optional uninstall)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, adding PREFIX to the beginning, before
+installing the key.  Previous bindings of FN are unbound.
+If UNINSTALL is non-nil, just remove the keys from ALIST."
+  (dolist (bind alist)
+    (dolist (old (where-is-internal (car bind) windmove-mode-map))
+      (define-key windmove-mode-map old nil))
+    (unless uninstall
+      (let ((key (vconcat (if (or (equal prefix [ignore])
+                                  (eq prefix 'none))
+                              nil prefix)
+                          (list (append modifiers (cdr bind))))))
+        (when (eq (key-binding key) #'self-insert-command)
+          (warn "Command %S is shadowing self-insert-key" (car bind)))
+        (let ((old-fn (lookup-key windmove-mode-map key)))
+          (when old-fn
+            (warn "Overriding %S with %S" old-fn (car bind))))
+        (define-key windmove-mode-map key (car bind))))))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +580,21 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +656,22 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (windmove-install-defaults prefix modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +717,19 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-Add-user-options-for-default-windmove-commands.patch --]
[-- Type: text/x-diff, Size: 3780 bytes --]

From 21a8a8854249d24d62d4dd8e17c1f1d20de04fd6 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Thu, 27 May 2021 12:24:42 +0200
Subject: [PATCH 2/2] Add user options for default windmove commands

* windmove.el (windmove--default-keybindings-type): Add type
(windmove-default-keybindings): Add user option
(windmove-display-default-keybindings): Add user option
(windmove-delete-default-keybindings): Add user option
(windmove-swap-states-default-keybindings): Add user option
---
 lisp/windmove.el | 80 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index cd8592f341..488962c063 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -731,6 +731,86 @@ windmove-swap-states-default-keybindings
                                (windmove-swap-states-up up)
                                (windmove-swap-states-down down))))
 
+\f
+
+(defconst windmove--default-keybindings-type
+  `(choice (const :tag "Don't bind" nil)
+           (cons :tag "Bind using"
+                 (key-sequence :tag "Prefix")
+                 (set :tag "Modifier"
+                      :greedy t
+                      ;; See `(elisp) Keyboard Events'
+                      (const :tag "Meta" meta)
+                      (const :tag "Control" control)
+                      (const :tag "Shift" shift)
+                      (const :tag "Hyper" hyper)
+                      (const :tag "Super" super)
+                      (const :tag "Alt" alt))))
+  "Customisation type for windmove modifiers.")
+
+(defcustom windmove-default-keybindings nil
+  "Default bindings for regular windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-left left)
+            (windmove-right right)
+            (windmove-up up)
+            (windmove-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
+(defcustom windmove-display-default-keybindings nil
+  "Default bindings for display windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-display-left left)
+            (windmove-display-right right)
+            (windmove-display-up up)
+            (windmove-display-down down)
+            (windmove-display-same-window ?0)
+            (windmove-display-new-frame ?f)
+            (windmove-display-new-tab ?t))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
+(defcustom windmove-delete-default-keybindings nil
+  "Default bindings for delete windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-delete-left left)
+            (windmove-delete-right right)
+            (windmove-delete-up up)
+            (windmove-delete-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
+(defcustom windmove-swap-states-default-keybindings nil
+  "Default bindings for swap-state windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-swap-states-left left)
+            (windmove-swap-states-right right)
+            (windmove-swap-states-up up)
+            (windmove-swap-states-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
 \f
 (provide 'windmove)
 
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-27 11:09                                 ` Philip Kaludercic
@ 2021-05-30 22:11                                   ` Juri Linkov
  2021-05-31  8:50                                     ` Philip Kaludercic
  0 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2021-05-30 22:11 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen

>> Maybe it's possible to add new user options without deprecating the
>> existing functions?  Then for users an alternative way would be to
>> customize these options, and enable windmove-mode in the init file.
>
> Of course, why not? The patches below should implement that.

Thanks, I tried out your patches.  The customization saved them
in such format:

  '(windmove-default-keybindings '([ignore] hyper))
  '(windmove-delete-default-keybindings '("\30" hyper))
  '(windmove-display-default-keybindings '([ignore] meta hyper))
  '(windmove-swap-states-default-keybindings '([ignore] shift hyper))

But I guess it's not a problem that it saves nil as [ignore].

The real problem is that after replacing this with a manual configuration:

  (use-package windmove
    :custom
    (windmove-default-keybindings '(nil hyper))
    (windmove-delete-default-keybindings `(,(kbd "C-x") hyper))
    (windmove-display-default-keybindings '(nil meta hyper))
    (windmove-swap-states-default-keybindings '(nil shift hyper)))

Then every startup pops up the *Warnings* buffer with:

  Warning (emacs): Overriding 1 with windmove-delete-left [Disable showing] [Disable logging]

But still all keybindings work correctly.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-30 22:11                                   ` Juri Linkov
@ 2021-05-31  8:50                                     ` Philip Kaludercic
  2021-05-31 20:15                                       ` Juri Linkov
  0 siblings, 1 reply; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-31  8:50 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, Lars Ingebrigtsen

[-- Attachment #1: Type: text/plain, Size: 1891 bytes --]

Juri Linkov <juri@linkov.net> writes:

>>> Maybe it's possible to add new user options without deprecating the
>>> existing functions?  Then for users an alternative way would be to
>>> customize these options, and enable windmove-mode in the init file.
>>
>> Of course, why not? The patches below should implement that.
>
> Thanks, I tried out your patches.  The customization saved them
> in such format:
>
>   '(windmove-default-keybindings '([ignore] hyper))
>   '(windmove-delete-default-keybindings '("\30" hyper))
>   '(windmove-display-default-keybindings '([ignore] meta hyper))
>   '(windmove-swap-states-default-keybindings '([ignore] shift hyper))
>
> But I guess it's not a problem that it saves nil as [ignore].
>
> The real problem is that after replacing this with a manual configuration:
>
>   (use-package windmove
>     :custom
>     (windmove-default-keybindings '(nil hyper))
>     (windmove-delete-default-keybindings `(,(kbd "C-x") hyper))
>     (windmove-display-default-keybindings '(nil meta hyper))
>     (windmove-swap-states-default-keybindings '(nil shift hyper)))
>
> Then every startup pops up the *Warnings* buffer with:
>
>   Warning (emacs): Overriding 1 with windmove-delete-left [Disable showing] [Disable logging]
>
> But still all keybindings work correctly.

I was under the impression that this was fixed, but it turns out I did
not read the lookup-key doc string carefully enough:

        A number as value means KEY is "too long";
        that is, characters or symbols in it except for the last one
        fail to be a valid sequence of prefix characters in KEYMAP.
        The number is how many characters at the front of KEY
        it takes to reach a non-prefix key.

But this case can be safely ignored, as define-key will take care of the
prefix. To solve this, the warning is only trigged when a function is
over-riden.

-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Improve-windmove-default-keybindings-fuctions.patch --]
[-- Type: text/x-diff, Size: 8244 bytes --]

From 42a66e87af83817b9e989624fdbf9c7ee7c347c7 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 25 May 2021 11:47:51 +0200
Subject: [PATCH 1/2] Improve windmove-*-default-keybindings fuctions

* windmove.el (windmove-mode-map): Add special map for windmove
commands
(windmove-mode): Add minor mode for activating windmove-mode-map
(windmove-install-defaults): Add general function for manipulating
windmove-mode-map
(windmove-default-keybindings): Use windmove-install-defaults
(windmove-display-default-keybindings): Use windmove-install-defaults
(windmove-delete-default-keybindings): Use windmove-install-defaults
(windmove-swap-states-default-keybindings): Use
windmove-install-defaults
---
 lisp/windmove.el | 91 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 70 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..cd8592f341 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,53 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-mode-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(define-minor-mode windmove-mode
+  "Global minor mode for default windmove commands."
+  :keymap windmove-mode-map
+  :init-value t
+  :global t)
+
+(defun windmove-install-defaults (prefix modifiers alist &optional uninstall)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, adding PREFIX to the beginning, before
+installing the key.  Previous bindings of FN are unbound.
+If UNINSTALL is non-nil, just remove the keys from ALIST."
+  (dolist (bind alist)
+    (dolist (old (where-is-internal (car bind) windmove-mode-map))
+      (define-key windmove-mode-map old nil))
+    (unless uninstall
+      (let ((key (vconcat (if (or (equal prefix [ignore])
+                                  (eq prefix 'none))
+                              nil prefix)
+                          (list (append modifiers (cdr bind))))))
+        (when (eq (key-binding key) #'self-insert-command)
+          (warn "Command %S is shadowing self-insert-key" (car bind)))
+        (let ((old-fn (lookup-key windmove-mode-map key)))
+          (when old-fn
+            (warn "Overriding %S with %S" old-fn (car bind))))
+        (define-key windmove-mode-map key (car bind))))))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +580,21 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +656,22 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (windmove-install-defaults prefix modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +717,19 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-Add-user-options-for-default-windmove-commands.patch --]
[-- Type: text/x-diff, Size: 3780 bytes --]

From 21a8a8854249d24d62d4dd8e17c1f1d20de04fd6 Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Thu, 27 May 2021 12:24:42 +0200
Subject: [PATCH 2/2] Add user options for default windmove commands

* windmove.el (windmove--default-keybindings-type): Add type
(windmove-default-keybindings): Add user option
(windmove-display-default-keybindings): Add user option
(windmove-delete-default-keybindings): Add user option
(windmove-swap-states-default-keybindings): Add user option
---
 lisp/windmove.el | 80 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index cd8592f341..488962c063 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -731,6 +731,86 @@ windmove-swap-states-default-keybindings
                                (windmove-swap-states-up up)
                                (windmove-swap-states-down down))))
 
+\f
+
+(defconst windmove--default-keybindings-type
+  `(choice (const :tag "Don't bind" nil)
+           (cons :tag "Bind using"
+                 (key-sequence :tag "Prefix")
+                 (set :tag "Modifier"
+                      :greedy t
+                      ;; See `(elisp) Keyboard Events'
+                      (const :tag "Meta" meta)
+                      (const :tag "Control" control)
+                      (const :tag "Shift" shift)
+                      (const :tag "Hyper" hyper)
+                      (const :tag "Super" super)
+                      (const :tag "Alt" alt))))
+  "Customisation type for windmove modifiers.")
+
+(defcustom windmove-default-keybindings nil
+  "Default bindings for regular windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-left left)
+            (windmove-right right)
+            (windmove-up up)
+            (windmove-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
+(defcustom windmove-display-default-keybindings nil
+  "Default bindings for display windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-display-left left)
+            (windmove-display-right right)
+            (windmove-display-up up)
+            (windmove-display-down down)
+            (windmove-display-same-window ?0)
+            (windmove-display-new-frame ?f)
+            (windmove-display-new-tab ?t))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
+(defcustom windmove-delete-default-keybindings nil
+  "Default bindings for delete windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-delete-left left)
+            (windmove-delete-right right)
+            (windmove-delete-up up)
+            (windmove-delete-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
+(defcustom windmove-swap-states-default-keybindings nil
+  "Default bindings for swap-state windmove commands."
+  :set (lambda (sym val)
+         (windmove-install-defaults
+          (car val) (cdr val)
+          '((windmove-swap-states-left left)
+            (windmove-swap-states-right right)
+            (windmove-swap-states-up up)
+            (windmove-swap-states-down down))
+          (null val))
+         (set-default sym val))
+  :type windmove--default-keybindings-type
+  :version "28.1"
+  :group 'windmove)
+
 \f
 (provide 'windmove)
 
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-31  8:50                                     ` Philip Kaludercic
@ 2021-05-31 20:15                                       ` Juri Linkov
  2021-05-31 21:27                                         ` Philip Kaludercic
  0 siblings, 1 reply; 838+ messages in thread
From: Juri Linkov @ 2021-05-31 20:15 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen

> I was under the impression that this was fixed, but it turns out I did
> not read the lookup-key doc string carefully enough:
>
>         A number as value means KEY is "too long";
>         that is, characters or symbols in it except for the last one
>         fail to be a valid sequence of prefix characters in KEYMAP.
>         The number is how many characters at the front of KEY
>         it takes to reach a non-prefix key.
>
> But this case can be safely ignored, as define-key will take care of the
> prefix. To solve this, the warning is only trigged when a function is
> over-riden.

Did you intend to send a new patch?  (the patches attached were the same as previous)





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-31 20:15                                       ` Juri Linkov
@ 2021-05-31 21:27                                         ` Philip Kaludercic
  2021-06-03 20:36                                           ` Juri Linkov
  0 siblings, 1 reply; 838+ messages in thread
From: Philip Kaludercic @ 2021-05-31 21:27 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 41438, Lars Ingebrigtsen

[-- Attachment #1: Type: text/plain, Size: 998 bytes --]

Juri Linkov <juri@linkov.net> writes:

>> I was under the impression that this was fixed, but it turns out I did
>> not read the lookup-key doc string carefully enough:
>>
>>         A number as value means KEY is "too long";
>>         that is, characters or symbols in it except for the last one
>>         fail to be a valid sequence of prefix characters in KEYMAP.
>>         The number is how many characters at the front of KEY
>>         it takes to reach a non-prefix key.
>>
>> But this case can be safely ignored, as define-key will take care of the
>> prefix. To solve this, the warning is only trigged when a function is
>> over-riden.
>
> Did you intend to send a new patch?  (the patches attached were the same as previous)

Oops, I must have forgotten to regenerate patches. The important
difference was

+        (let ((old-fn (lookup-key windmove-mode-map key)))
+          (when (functionp old-fn)
+            (warn "Overriding %S with %S" old-fn (car bind))))


-- 
	Philip K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Improve-windmove-default-keybindings-fuctions.patch --]
[-- Type: text/x-diff, Size: 8256 bytes --]

From 7e31b789da74655e931adc937b5a22a48d4f676e Mon Sep 17 00:00:00 2001
From: Philip Kaludercic <philipk@posteo.net>
Date: Tue, 25 May 2021 11:47:51 +0200
Subject: [PATCH 1/2] Improve windmove-*-default-keybindings fuctions

* windmove.el (windmove-mode-map): Add special map for windmove
commands
(windmove-mode): Add minor mode for activating windmove-mode-map
(windmove-install-defaults): Add general function for manipulating
windmove-mode-map
(windmove-default-keybindings): Use windmove-install-defaults
(windmove-display-default-keybindings): Use windmove-install-defaults
(windmove-delete-default-keybindings): Use windmove-install-defaults
(windmove-swap-states-default-keybindings): Use
windmove-install-defaults
---
 lisp/windmove.el | 92 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 71 insertions(+), 21 deletions(-)

diff --git a/lisp/windmove.el b/lisp/windmove.el
index e4ea8e0f69..ba59e95624 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -426,19 +426,53 @@ windmove-down
 ;; I don't think these bindings will work on non-X terminals; you
 ;; probably want to use different bindings in that case.
 
+(defvar windmove-mode-map (make-sparse-keymap)
+  "Map used by `windmove-install-defaults'.")
+
+(define-minor-mode windmove-mode
+  "Global minor mode for default windmove commands."
+  :keymap windmove-mode-map
+  :init-value t
+  :global t)
+
+(defun windmove-install-defaults (prefix modifiers alist &optional uninstall)
+  "Install keys as specified by ALIST.
+Every element of ALIST has the form (FN KEY), where KEY is
+appended to MODIFIERS, adding PREFIX to the beginning, before
+installing the key.  Previous bindings of FN are unbound.
+If UNINSTALL is non-nil, just remove the keys from ALIST."
+  (dolist (bind alist)
+    (dolist (old (where-is-internal (car bind) windmove-mode-map))
+      (define-key windmove-mode-map old nil))
+    (unless uninstall
+      (let ((key (vconcat (if (or (equal prefix [ignore])
+                                  (eq prefix 'none))
+                              nil prefix)
+                          (list (append modifiers (cdr bind))))))
+        (when (eq (key-binding key) #'self-insert-command)
+          (warn "Command %S is shadowing self-insert-key" (car bind)))
+        (let ((old-fn (lookup-key windmove-mode-map key)))
+          (when (functionp old-fn)
+            (warn "Overriding %S with %S" old-fn (car bind))))
+        (define-key windmove-mode-map key (car bind))))))
+
 ;;;###autoload
 (defun windmove-default-keybindings (&optional modifiers)
   "Set up keybindings for `windmove'.
 Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift'."
   (interactive)
   (unless modifiers (setq modifiers 'shift))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-left left)
+                               (windmove-right right)
+                               (windmove-up up)
+                               (windmove-down down))))
 
 \f
 ;;; Directional window display and selection
@@ -546,17 +581,21 @@ windmove-display-default-keybindings
 Keys are bound to commands that display the next buffer in the specified
 direction.  Keybindings are of the form MODIFIERS-{left,right,up,down},
 where MODIFIERS is either a list of modifiers or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to
+the arrow keys.
 Default value of MODIFIERS is `shift-meta'."
   (interactive)
   (unless modifiers (setq modifiers '(shift meta)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-display-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-display-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-display-down)
-  (global-set-key (vector (append modifiers '(?0)))    'windmove-display-same-window)
-  (global-set-key (vector (append modifiers '(?f)))    'windmove-display-new-frame)
-  (global-set-key (vector (append modifiers '(?t)))    'windmove-display-new-tab))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-display-left left)
+                               (windmove-display-right right)
+                               (windmove-display-up up)
+                               (windmove-display-down down)
+                               (windmove-display-same-window ?0)
+                               (windmove-display-new-frame ?f)
+                               (windmove-display-new-tab ?t))))
 
 \f
 ;;; Directional window deletion
@@ -618,16 +657,22 @@ windmove-delete-default-keybindings
 Keys are bound to commands that delete windows in the specified
 direction.  Keybindings are of the form PREFIX MODIFIERS-{left,right,up,down},
 where PREFIX is a prefix key and MODIFIERS is either a list of modifiers or
-a single modifier.  Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
+a single modifier.
+If PREFIX is `none', no prefix is used. If MODIFIERS is `none', the keybindings
+are directly bound to the arrow keys.
+Default value of PREFIX is `C-x' and MODIFIERS is `shift'."
   (interactive)
   (unless prefix (setq prefix '(?\C-x)))
+  (when (eq prefix 'none) (setq prefix nil))
   (unless (listp prefix) (setq prefix (list prefix)))
   (unless modifiers (setq modifiers '(shift)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector prefix (append modifiers '(left)))  'windmove-delete-left)
-  (global-set-key (vector prefix (append modifiers '(right))) 'windmove-delete-right)
-  (global-set-key (vector prefix (append modifiers '(up)))    'windmove-delete-up)
-  (global-set-key (vector prefix (append modifiers '(down)))  'windmove-delete-down))
+  (windmove-install-defaults prefix modifiers
+                             '((windmove-delete-left left)
+                               (windmove-delete-right right)
+                               (windmove-delete-up up)
+                               (windmove-delete-down down))))
 
 \f
 ;;; Directional window swap states
@@ -673,14 +718,19 @@ windmove-swap-states-default-keybindings
 Keys are bound to commands that swap the states of the selected window
 with the window in the specified direction.  Keybindings are of the form
 MODIFIERS-{left,right,up,down}, where MODIFIERS is either a list of modifiers
-or a single modifier.  Default value of MODIFIERS is `shift-super'."
+or a single modifier.
+If MODIFIERS is `none', the keybindings will be directly bound to the
+arrow keys.
+Default value of MODIFIERS is `shift-super'."
   (interactive)
   (unless modifiers (setq modifiers '(shift super)))
+  (when (eq modifiers 'none) (setq modifiers nil))
   (unless (listp modifiers) (setq modifiers (list modifiers)))
-  (global-set-key (vector (append modifiers '(left)))  'windmove-swap-states-left)
-  (global-set-key (vector (append modifiers '(right))) 'windmove-swap-states-right)
-  (global-set-key (vector (append modifiers '(up)))    'windmove-swap-states-up)
-  (global-set-key (vector (append modifiers '(down)))  'windmove-swap-states-down))
+  (windmove-install-defaults nil modifiers
+                             '((windmove-swap-states-left left)
+                               (windmove-swap-states-right right)
+                               (windmove-swap-states-up up)
+                               (windmove-swap-states-down down))))
 
 \f
 (provide 'windmove)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 838+ messages in thread

* bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers
  2021-05-31 21:27                                         ` Philip Kaludercic
@ 2021-06-03 20:36                                           ` Juri Linkov
  0 siblings, 0 replies; 838+ messages in thread
From: Juri Linkov @ 2021-06-03 20:36 UTC (permalink / raw)
  To: Philip Kaludercic; +Cc: 41438, Lars Ingebrigtsen

tags 41438 fixed
close 41438 28.0.50
thanks

>> Did you intend to send a new patch?  (the patches attached were the same as previous)
>
> Oops, I must have forgotten to regenerate patches. The important
> difference was
>
> +        (let ((old-fn (lookup-key windmove-mode-map key)))
> +          (when (functionp old-fn)
> +            (warn "Overriding %S with %S" old-fn (car bind))))

Thanks, I've tested your patches, and everything work nicely.
So pushed now.





^ permalink raw reply	[flat|nested] 838+ messages in thread

* bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files'
  2019-07-11  5:51   ` Mike Kupfer
  2019-07-11 14:04     ` Lars Ingebrigtsen
  2019-07-11 14:18     ` Drew Adams
@ 2022-01-22 14:43     ` Lars Ingebrigtsen
  2 siblings, 0 replies; 838+ messages in thread
From: Lars Ingebrigtsen @ 2022-01-22 14:43 UTC (permalink / raw)
  To: Mike Kupfer; +Cc: 35367

Mike Kupfer <mkupfer@alum.berkeley.edu> writes:

> The bit about
>
>    If it return value is a list, TARGET is a generalized
>     directory (e.g. some sort of archive).  The first element of
>     this list must be a function with at least four arguments:
>
> looks like it might be useful when the target is, for example, a tar
> file.  By default, copying a single file would replace the tar file.
> But this could be overridden (I think) to add or replace entries in the
> tar file.

I've now added something like this to the doc string in Emacs 29, and
that should hopefully clarify the use case slightly.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 838+ messages in thread

end of thread, other threads:[~2022-01-22 14:43 UTC | newest]

Thread overview: 838+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-05-21 16:56 bug#41438: [PATCH] Allow windmove keys to be bound without prefix or modifiers Philip K.
2020-05-21 22:18 ` Juri Linkov
2020-05-22 18:26   ` Philip K.
2020-05-22 18:26   ` Philip K.
2020-05-22 19:15     ` Drew Adams
2020-05-23 22:12     ` Juri Linkov
2020-06-26 19:46 ` Philip K.
2020-06-27 23:53   ` Juri Linkov
2020-06-28  8:30     ` Philip K.
2020-06-28 23:37       ` Juri Linkov
2020-08-05 18:05         ` Lars Ingebrigtsen
2020-08-05 23:40           ` Juri Linkov
2020-08-06  9:28             ` Philip K.
2020-08-06 23:43               ` Juri Linkov
2020-08-07 10:53                 ` Philip K.
2020-08-08 23:54                   ` Juri Linkov
2021-05-12 20:38                   ` Lars Ingebrigtsen
2021-05-12 21:27                     ` Philip Kaludercic
2021-05-22 20:29                     ` Philip Kaludercic
2021-05-22 21:09                       ` Philip Kaludercic
2021-05-23  6:49                         ` Eli Zaretskii
2021-05-23 12:36                           ` Philip Kaludercic
2021-05-25  5:12                       ` Lars Ingebrigtsen
2021-05-25  7:25                         ` Philip Kaludercic
2021-05-25  9:53                         ` Philip Kaludercic
2021-05-25 11:16                           ` Arthur Miller
2021-05-25 11:42                             ` Philip Kaludercic
2021-05-25 13:31                               ` Arthur Miller
2021-05-25 14:39                                 ` Philip Kaludercic
2021-05-25 11:36                           ` Arthur Miller
2021-05-25 11:46                             ` Philip Kaludercic
2021-05-25 13:58                               ` Arthur Miller
2021-05-25 19:13                             ` Lars Ingebrigtsen
2021-05-25 19:16                           ` Lars Ingebrigtsen
2021-05-25 19:25                             ` Philip Kaludercic
2021-05-25 20:18                           ` Juri Linkov
2021-05-25 21:45                             ` Philip Kaludercic
2021-05-26 21:35                               ` Juri Linkov
2021-05-27 11:09                                 ` Philip Kaludercic
2021-05-30 22:11                                   ` Juri Linkov
2021-05-31  8:50                                     ` Philip Kaludercic
2021-05-31 20:15                                       ` Juri Linkov
2021-05-31 21:27                                         ` Philip Kaludercic
2021-06-03 20:36                                           ` Juri Linkov
  -- strict thread matches above, loose matches on Subject: below --
2020-11-01 16:08 bounds-of-thing-at-point for paragraphs Christopher Dimech
2020-11-01 18:22 ` Jean Louis
2020-11-01 18:34   ` Christopher Dimech
2020-11-01 18:45     ` Drew Adams
2020-11-01 18:52       ` Jean Louis
2020-11-01 19:00         ` Drew Adams
2020-11-01 20:07           ` Christopher Dimech
2020-11-01 22:06             ` Drew Adams
2020-11-01 22:36               ` Christopher Dimech
2020-11-01 22:47                 ` Jean Louis
2020-11-01 22:52                   ` Drew Adams
2020-11-01 23:14                     ` Christopher Dimech
2020-11-02  1:07                       ` Drew Adams
2020-11-02  4:09                         ` Robert Thorpe
2020-11-02 15:41                           ` Drew Adams
2020-11-03  6:00                             ` Corwin Brust
2020-11-03  6:40                               ` Stefan Kangas
2020-11-03  7:41                                 ` Corwin Brust
2020-11-03 16:07                                   ` Drew Adams
2020-11-06 23:45                                     ` Corwin Brust
2020-11-07  1:26                                       ` Stefan Kangas
2020-11-02  6:07                     ` finder-commentary Jean Louis
2020-11-02 15:48                       ` finder-commentary Drew Adams
2020-11-02 16:02                         ` finder-commentary Drew Adams
2020-11-02 16:58                           ` finder-commentary Jean Louis
2020-11-02 17:27                             ` finder-commentary Drew Adams
2020-11-01 22:49                 ` RE: RE: bounds-of-thing-at-point for paragraphs Jean Louis
2020-11-01 22:51                 ` Drew Adams
2020-11-01 23:10                   ` Christopher Dimech
2020-11-02  1:05                     ` Drew Adams
2020-11-01 20:36           ` Jean Louis
2020-11-01 21:32             ` Michael Heerdegen
2020-11-01 21:43               ` Jean Louis
2020-11-01 21:43               ` Jean Louis
2020-11-01 19:27         ` Eli Zaretskii
2020-11-01 19:51           ` Christopher Dimech
2020-11-01 20:00             ` Eli Zaretskii
2020-11-01 20:09               ` Christopher Dimech
2020-11-01 20:13                 ` Eli Zaretskii
2020-11-01 20:27                 ` Emanuel Berg via Users list for the GNU Emacs text editor
2020-11-01 20:31                   ` Christopher Dimech
2020-11-01 22:10                     ` Emanuel Berg via Users list for the GNU Emacs text editor
2020-11-01 21:46             ` Drew Adams
2020-11-01 20:23           ` Michael Heerdegen
2020-11-01 20:29             ` Christopher Dimech
2020-11-01 22:10               ` Drew Adams
2020-11-01 21:01             ` Stefan Monnier
2020-11-01 18:45     ` Jean Louis
2020-11-01 18:51       ` Drew Adams
2020-10-08 15:30 Proposal for an Emacs User Survey Adrien Brochard
2020-10-08 17:27 ` Philip K.
2020-10-08 17:45   ` Adrien Brochard
2020-10-09 11:30     ` Philip K.
2020-10-09 14:37       ` tomas
2020-10-09 17:23       ` Adrien Brochard
2020-10-09 18:17         ` Philip K.
2020-10-09 19:52           ` Adrien Brochard
2020-10-10  3:56             ` Richard Stallman
2020-10-10  9:36               ` Philip K.
2020-10-10 16:33                 ` Drew Adams
2020-10-10 18:02                   ` Dmitry Gutov
2020-10-11 10:46                 ` Jean Louis
2020-10-11 18:42                   ` Philip K.
2020-10-11 19:46                     ` Jean Louis
2020-10-11  1:00               ` Drew Adams
2020-10-10 10:35             ` Philip K.
2020-10-11  5:24               ` Richard Stallman
2020-10-11 17:59                 ` Philip K.
2020-10-12  2:03                   ` Richard Stallman
2020-10-11  7:31               ` Tomas Hlavaty
2020-10-11 12:04                 ` Jean Louis
2020-10-11 17:47                 ` Philip K.
2020-10-09 17:59     ` Jean Louis
2020-10-09  0:41 ` Karl Fogel
2020-10-09  1:26   ` Adrien Brochard
2020-10-10  3:52   ` Richard Stallman
2020-10-10 21:44     ` Dmitry Gutov
2020-10-12  2:04       ` Richard Stallman
2020-10-09  3:35 ` Richard Stallman
2020-10-09 18:01   ` Jean Louis
2020-10-09 23:12   ` Adrien Brochard
2020-10-09 23:31     ` Drew Adams
2020-10-09 23:36       ` Adrien Brochard
2020-10-10  2:21         ` Drew Adams
2020-10-10  2:40           ` Adrien Brochard
2020-10-10  3:53             ` Drew Adams
2020-10-10  8:09     ` Teemu Likonen
2020-10-10 10:45       ` Rasmus
2020-10-11 10:32       ` Jean Louis
2020-10-11 15:15         ` Drew Adams
2020-10-11 18:25           ` Jean Louis
2020-10-11 19:47             ` Drew Adams
2020-10-11 20:36               ` Jean Louis
2020-10-13  3:48             ` How to request changes in Emacs Richard Stallman
2020-10-13  4:59               ` Jean Louis
2020-10-16  4:00                 ` Richard Stallman
2020-10-16  4:47                   ` Drew Adams
2020-10-13 15:56               ` Drew Adams
2020-10-14  4:42                 ` Richard Stallman
2020-10-14  5:12                   ` Drew Adams
2020-10-11 20:19           ` Proposal for an Emacs User Survey Drew Adams
2020-10-11 20:42             ` Jean Louis
2020-10-11 18:33         ` Philip K.
2020-10-11 18:45           ` Jean Louis
2020-10-13  3:48             ` Richard Stallman
2020-10-11 19:47           ` Drew Adams
2020-10-11 20:33             ` Jean Louis
2020-10-11 23:24               ` Drew Adams
2020-10-12  4:10                 ` Jean Louis
2020-10-12 17:35                   ` Drew Adams
2020-10-12 18:33                     ` Jean Louis
2020-10-12 18:41                       ` Drew Adams
2020-10-11 20:54           ` Jean Louis
2020-10-12 14:32       ` Adrien Brochard
2020-10-10 10:54     ` Thibaut Verron
2020-10-10 13:50       ` Philip K.
2020-10-12 14:36         ` Adrien Brochard
2020-10-11 11:58       ` Jean Louis
2020-10-12 14:36       ` Adrien Brochard
2020-10-10 13:17     ` Rasmus
2020-10-12 14:41       ` Adrien Brochard
2020-10-11  5:23     ` Richard Stallman
2020-10-11  7:35       ` Vasilij Schneidermann
2020-10-11 12:08         ` Jean Louis
2020-10-11 12:50           ` Vasilij Schneidermann
2020-10-11 17:15             ` Jean Louis
2020-10-11 17:36               ` Thibaut Verron
2020-10-11 18:13                 ` Brett Gilio
2020-10-11 18:27                   ` Thibaut Verron
2020-10-11 18:44                     ` Jean Louis
2020-10-11 18:58                       ` Thibaut Verron
2020-10-11 20:12                         ` Jean Louis
2020-10-11 18:34                 ` Jean Louis
2020-10-11 19:15                   ` Thibaut Verron
2020-10-11 19:22                     ` Qiantan Hong
2020-10-13  3:47                       ` Richard Stallman
2020-10-11 20:26                     ` Jean Louis
2020-10-12  2:04             ` Richard Stallman
2020-10-12  3:32               ` Thibaut Verron
2020-10-12  5:04                 ` Jean Louis
2020-10-12  5:33                   ` Thibaut Verron
2020-10-12  6:29                     ` Jean Louis
2020-10-12  6:58                       ` Thibaut Verron
2020-10-12  8:16                         ` Jean Louis
2020-10-12  8:37                           ` Thibaut Verron
2020-10-12 14:09                             ` Jean Louis
2020-10-12  7:54                       ` Ihor Radchenko
2020-10-12  8:34                         ` Jean Louis
2020-10-12  8:54                           ` Ihor Radchenko
2020-10-12 16:36                             ` Jean Louis
2020-10-13  3:53                     ` Richard Stallman
2020-10-13  5:25                       ` Jean Louis
2020-10-15  3:59                         ` Richard Stallman
2020-10-15  5:19                           ` Jean Louis
2020-10-13  3:53                     ` Richard Stallman
2020-10-13  5:27                       ` Jean Louis
2020-10-16  3:59                         ` Richard Stallman
2020-10-16  6:02                           ` Marcel Ventosa
2020-10-16  6:52                             ` Thibaut Verron
2020-10-16  7:24                               ` Marcel Ventosa
2020-10-16  7:53                                 ` Thibaut Verron
2020-10-16  8:25                                   ` Marcel Ventosa
2020-10-16 12:17                                     ` Dmitry Gutov
2020-10-16 13:45                                       ` Marcel Ventosa
2020-10-16 14:04                                         ` Dmitry Gutov
2020-10-16 14:33                                           ` Marcel Ventosa
2020-10-16 14:58                                             ` Thibaut Verron
2020-10-16 15:51                                               ` Alfred M. Szmidt
2020-10-16 16:10                                                 ` Thibaut Verron
2020-10-16 16:16                                                   ` Alfred M. Szmidt
2020-10-16 16:32                                                     ` Thibaut Verron
2020-10-16 16:50                                                       ` Alfred M. Szmidt
2020-10-16 17:16                                                         ` Thibaut Verron
2020-10-16 17:32                                                           ` Alfred M. Szmidt
2020-10-16 17:55                                                             ` Thibaut Verron
2020-10-16 18:16                                                               ` Alfred M. Szmidt
2020-10-17  4:20                                               ` Richard Stallman
2020-10-17  4:50                                                 ` Thibaut Verron
2020-10-17  5:44                                                   ` Jean Louis
2020-10-17  6:42                                                     ` Thibaut Verron
2020-10-17  7:52                                                       ` Jean Louis
2020-10-18  4:16                                                       ` Richard Stallman
2020-10-18  5:49                                                         ` Jean Louis
2020-10-18  4:16                                                       ` Richard Stallman
2020-10-18  5:52                                                         ` Jean Louis
2020-10-18  4:16                                                       ` Richard Stallman
2020-10-18  8:36                                                         ` Thibaut Verron
2020-10-20  5:10                                                           ` Richard Stallman
2020-10-17  9:42                                                   ` Yuri Khan
2020-10-16 15:36                                             ` Ergus
2020-10-16 19:08                                             ` Dmitry Gutov
2020-10-16 19:52                                               ` Jean Louis
2020-10-16 20:16                                                 ` Dmitry Gutov
2020-10-16 20:17                                               ` Alfred M. Szmidt
2020-10-17 11:40                                               ` Marcel Ventosa
2020-10-17 19:51                                                 ` Dmitry Gutov
2020-10-17 21:38                                                   ` Alfred M. Szmidt
2020-10-18  2:58                                                   ` Marcel Ventosa
2020-10-16 19:22                                             ` Jean Louis
2020-10-16 19:17                                           ` Jean Louis
2020-10-16 19:36                                             ` Dmitry Gutov
2020-10-16 19:43                                               ` Dmitry Gutov
2020-10-16 20:03                                               ` Jean Louis
2020-10-16 20:29                                                 ` Thibaut Verron
2020-10-16 20:40                                                   ` Jean Louis
2020-10-17  4:19                                                   ` Richard Stallman
2020-10-17  5:02                                                     ` Thibaut Verron
2020-10-17 13:13                                                       ` Stefan Monnier
2020-10-17  5:07                                                     ` Jean Louis
2020-10-17 12:34                                                     ` Andy Moreton
2020-10-17 15:56                                                       ` Alfred M. Szmidt
2020-10-17 16:13                                                         ` Eli Zaretskii
2020-10-17 21:38                                                           ` Alfred M. Szmidt
2020-10-18  2:40                                                             ` Eli Zaretskii
2020-10-18  4:13                                                           ` Richard Stallman
2020-10-18 15:20                                                             ` Alfred M. Szmidt
2020-10-16 21:10                                                 ` Dmitry Gutov
2020-10-16 22:02                                                   ` Jean Louis
2020-10-16 19:08                                         ` Jean Louis
2020-10-16 19:47                                           ` Drew Adams
2020-10-16 20:15                                             ` Jean Louis
2020-10-16 20:59                                               ` Drew Adams
2020-10-16 21:50                                                 ` Jean Louis
2020-10-17  4:19                                                 ` Richard Stallman
2020-10-17  4:19                                               ` Richard Stallman
2020-10-16 13:57                                       ` Ergus
2020-10-16 15:31                                         ` Eli Zaretskii
2020-10-16 19:11                                         ` Jean Louis
2020-10-16 16:09                                       ` Alfred M. Szmidt
2020-10-16 17:29                                     ` Jean Louis
2020-10-16 19:11                                       ` Thibaut Verron
2020-10-16 19:54                                         ` Jean Louis
2020-10-16 20:20                                           ` Thibaut Verron
2020-10-17  4:22                                     ` Richard Stallman
2020-10-17  4:31                                       ` Qiantan Hong
2020-10-19 10:12                                         ` Robert Pluim
2020-10-19 16:15                                           ` Qiantan Hong
2020-10-20 13:45                                             ` Dmitry Gutov
2020-10-16 18:57                                   ` Jean Louis
2020-10-16 17:08                                 ` Jean Louis
2020-10-16 17:04                               ` Jean Louis
2020-10-16 17:39                                 ` Vasilij Schneidermann
2020-10-18  4:09                               ` Richard Stallman
2020-10-16 16:33                             ` MELPA issues - " Jean Louis
2020-10-16 18:09                               ` Dmitry Gutov
2020-10-16 22:00                                 ` Qiantan Hong
2020-10-16 22:08                                   ` Dmitry Gutov
2020-10-17  4:18                                   ` Richard Stallman
2020-10-17  4:59                                     ` chad
2020-10-17  5:05                                       ` Qiantan Hong
2020-10-17  5:06                                       ` Thibaut Verron
2020-10-17  2:59                               ` Marcel Ventosa
2020-10-18  4:12                                 ` Richard Stallman
2020-10-18  5:16                                   ` Jean Louis
2020-10-18  4:10                             ` Richard Stallman
2020-10-18  7:51                               ` Marcel Ventosa
2020-10-18  9:29                                 ` Dmitry Gutov
2020-10-18  9:36                                 ` Jean Louis
2020-10-18  8:57                               ` Thibaut Verron
2020-10-19  3:44                                 ` Richard Stallman
2020-10-18 15:57                               ` Philip K.
2020-10-19  3:48                                 ` Richard Stallman
2020-10-19 11:36                                   ` Dmitry Gutov
2020-10-19 12:43                                     ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
2020-10-19 15:55                                       ` Stefan Kangas
2020-10-19 16:38                                         ` Jean Louis
2020-10-19 17:30                                           ` Stefan Monnier
2020-10-19 17:47                                             ` Jean Louis
2020-10-19 18:02                                               ` Stefan Monnier
2020-10-19 19:04                                                 ` Jean Louis
2020-10-19 20:17                                                   ` Stefan Monnier
2020-10-19 21:02                                                     ` Jean Louis
     [not found]                                                       ` <jwvft69evmy.fsf-monnier+emacs@gnu.org>
2020-10-20  7:40                                                         ` Jean Louis
2020-10-22 21:25                                                           ` Stefan Monnier
2020-10-23  9:17                                                             ` Jean Louis
2020-10-23 14:52                                                               ` Stefan Monnier
2020-10-23 16:59                                                                 ` Jean Louis
2020-10-23 18:25                                                                   ` Stefan Monnier
2020-10-24  6:26                                                                     ` Jean Louis
2020-10-24 15:29                                                                       ` Stefan Monnier
2020-10-19 18:53                                             ` Stefan Kangas
2020-10-19 18:57                                               ` Vasilij Schneidermann
2020-10-19 19:20                                               ` Stefan Monnier
2020-10-19 18:28                                       ` Vasilij Schneidermann
2020-10-19 19:00                                         ` ELPA security (was: Proposal to include obligatory PGP verification of packages from any repository) Stefan Monnier
2020-10-19 19:50                                         ` Proposal to include obligatory PGP verification of packages from any repository Jean Louis
2020-10-20  5:17                                         ` Richard Stallman
2020-10-20  5:52                                           ` Stefan Monnier
2020-10-21  4:46                                             ` Richard Stallman
2020-10-20 16:17                                           ` Vasilij Schneidermann
2020-10-19 15:46                                     ` Proposal for an Emacs User Survey Drew Adams
2020-10-19 16:42                                       ` Jean Louis
2020-10-20  5:19                                         ` Richard Stallman
2020-10-19 16:42                                       ` Thibaut Verron
2020-10-19 16:53                                         ` Drew Adams
2020-10-20  5:14                                     ` Richard Stallman
2020-10-20 10:47                                       ` Dmitry Gutov
2020-10-16  7:05                           ` Thibaut Verron
2020-10-16 13:23                             ` Philip K.
2020-10-16 18:46                             ` Jean Louis
2020-10-17  4:22                             ` Richard Stallman
2020-10-15  3:52                     ` Richard Stallman
2020-10-15  5:57                       ` Thibaut Verron
2020-10-12  5:36                 ` Jean Louis
2020-10-12  5:52                   ` Thibaut Verron
2020-10-12  2:04         ` Richard Stallman
2020-10-12  2:04         ` Richard Stallman
2020-10-12 15:16       ` Adrien Brochard
2020-10-12 16:55         ` Jean Louis
2020-10-12 17:15         ` Drew Adams
2020-10-13  3:49         ` Richard Stallman
2020-10-11 20:54     ` Bonface M. K.
2020-10-16 13:30     ` Philip K.
2020-10-19 16:20 ` Philip K.
2020-10-19 19:44   ` Dmitry Gutov
2020-10-20  5:19   ` Richard Stallman
2020-10-20  8:22     ` Thibaut Verron
2020-10-20  9:48       ` Jean Louis
2020-10-20 11:03         ` Thibaut Verron
2020-10-20 11:38           ` Jean Louis
2020-10-26 17:43             ` Teemu Likonen
2020-10-26 19:36               ` Jean Louis
2020-10-26 19:58               ` Jean Louis
2020-10-27  3:44               ` Richard Stallman
2020-10-26 18:13             ` Ivan Yonchovski
2020-10-26 20:21               ` Jean Louis
     [not found] <<fdimdgyaxf.fsf@norden.tntech.edu>
     [not found] ` <<83r1s4ftc7.fsf@gnu.org>
2020-08-18 16:13   ` Delete variables obsolete since Emacs 23 Drew Adams
2020-08-18 19:27     ` Stefan Monnier
2020-08-18 20:21       ` Drew Adams
2020-08-18 21:00       ` Gregory Heytings via Emacs development discussions.
2020-08-18 21:55         ` Stefan Monnier
2020-08-18 21:30       ` Jeff Norden
2020-07-30  4:01 bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work Brett Randall
     [not found] ` <handler.42611.B.159608273314264.ack@debbugs.gnu.org>
     [not found]   ` <(Brett>
2020-10-17  8:41 ` Lars Ingebrigtsen
2020-10-27 10:36   ` brett.randall
     [not found]     ` <(brett>
     [not found]       ` <randall's>
     [not found]         ` <"Tue,>
2020-10-27 10:43     ` Lars Ingebrigtsen
2020-10-27 10:49       ` Brett Randall
2020-10-27 11:08         ` Lars Ingebrigtsen
     [not found]           ` <(Lars>
     [not found]             ` <Ingebrigtsen's>
     [not found]               ` <12:08:50>
2020-10-27 11:19           ` bug#42611: (no subject) Lars Ingebrigtsen
     [not found]             ` <877drbhq6c.fsf@gnus.org>
     [not found]               ` <handler.42611.C.160379757411378.notifdonectrl.0@debbugs.gnu.org>
2020-10-27 22:22                 ` bug#42611: 26.3; edit-abbrevs lets me type and commit, but doesn't store anywhere and abbrevs don't work Brett Randall
     [not found] <20200515175844.18941.61355@vcs0.savannah.gnu.org>
     [not found] ` <20200515175845.997EC20999@vcs0.savannah.gnu.org>
2020-05-15 18:38   ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Monnier
2020-05-15 20:58     ` Stefan Kangas
2020-08-07 15:42       ` [PATCH] Remove obsolete fast-lock and lazy-lock libraries (was: Re: Deleting old `:version` from defcustoms) Stefan Kangas
2020-08-08  2:19         ` [PATCH] Remove obsolete fast-lock and lazy-lock libraries Stefan Monnier
2020-05-16 13:18     ` Delete variables obsolete since Emacs 23 Stefan Kangas
2020-05-16 15:49       ` Paul Eggert
2020-05-17  2:52       ` Stefan Monnier
2020-05-17 11:39         ` Dmitry Gutov
2020-08-08  0:28       ` Stefan Kangas
2020-08-14 11:11         ` Stefan Kangas
2020-08-14 15:42         ` Stefan Kangas
2020-08-14 18:56           ` Drew Adams
2020-08-14 19:00             ` Lars Ingebrigtsen
2020-08-14 19:14               ` Drew Adams
2020-08-14 19:55             ` Ulrich Mueller
2020-08-14 23:37             ` Stefan Kangas
2020-08-15  1:28               ` Drew Adams
2020-08-15 12:51                 ` Stefan Monnier
2020-08-15 19:54                   ` Drew Adams
2020-08-16  4:13                 ` Richard Stallman
2020-08-16  5:30                   ` Drew Adams
2020-08-16 13:46                     ` Stefan Monnier
2020-08-17  3:23                     ` Richard Stallman
2020-08-17 14:20                       ` Drew Adams
2020-08-17 14:45                         ` Gregory Heytings via Emacs development discussions.
2020-08-18  1:55                         ` Jeff Norden
2020-08-18  4:53                           ` Eli Zaretskii
2020-08-19  8:31                             ` Gregory Heytings via Emacs development discussions.
2020-08-19 13:26                               ` Drew Adams
2020-08-19 13:39                               ` Stefan Monnier
2020-08-19 13:54                                 ` Gregory Heytings via Emacs development discussions.
2020-08-19 15:15                                   ` Eli Zaretskii
2020-08-20  0:33                                     ` Jeff Norden
2020-08-19 14:36                               ` Eli Zaretskii
2020-08-18 16:14                           ` Drew Adams
2020-08-18  4:06                         ` Richard Stallman
2020-08-18 16:13                           ` Drew Adams
2020-08-18 11:17             ` Lars Ingebrigtsen
2020-08-24  2:28               ` Stefan Kangas
2020-08-25  3:46                 ` Richard Stallman
2020-08-25  4:06                   ` Drew Adams
2020-08-26  1:57                     ` Richard Stallman
2020-08-26  8:59                       ` Gregory Heytings via Emacs development discussions.
2020-08-26 13:22                         ` Stefan Kangas
2020-08-27  2:51                           ` Richard Stallman
2020-08-27  3:51                             ` Stefan Kangas
2020-08-26 17:39                       ` Drew Adams
2020-08-26 18:16                         ` Stefan Monnier
2020-09-04 17:04                 ` Stefan Kangas
2020-09-05 12:39                   ` Lars Ingebrigtsen
2020-09-11 20:01                     ` Stefan Kangas
2020-05-17  3:18     ` Deleting old `:version` from defcustoms (was: master b76cdd0: Delete libraries obsolete since 23.1 and 23.2) Stefan Kangas
2020-05-17 15:18       ` Eli Zaretskii
2020-05-17 16:59         ` Deleting old `:version` from defcustoms Stefan Monnier
2019-04-21 19:30 bug#35367: 26.2; `dired-copy-how-to-fn' and HOW-TO arg of `dired-create-files' Drew Adams
2019-07-09 14:21 ` Lars Ingebrigtsen
2019-07-11  5:51   ` Mike Kupfer
2019-07-11 14:04     ` Lars Ingebrigtsen
2019-07-11 14:18     ` Drew Adams
2019-07-12  3:20       ` Mike Kupfer
2019-07-12  3:33         ` Drew Adams
2022-01-22 14:43     ` Lars Ingebrigtsen
     [not found] <mailman.5042.1543777897.1284.help-gnu-emacs@gnu.org>
2018-12-04  9:04 ` using setq to create lists based on other lists Barry Margolin
2018-12-04 13:56   ` Stefan Monnier
2018-12-05  1:07   ` Robert Thorpe
2018-12-05  2:32     ` Drew Adams
2018-12-05  6:45       ` Jean-Christophe Helary
2018-12-05  8:00         ` Marcin Borkowski
2018-12-05  8:11           ` Jean-Christophe Helary
2018-12-05 14:57         ` Drew Adams
     [not found]         ` <mailman.5218.1544021892.1284.help-gnu-emacs@gnu.org>
2018-12-05 16:59           ` Barry Margolin
     [not found]     ` <mailman.5186.1543978155.1284.help-gnu-emacs@gnu.org>
2018-12-05 16:50       ` Barry Margolin
     [not found]   ` <mailman.5145.1543931778.1284.help-gnu-emacs@gnu.org>
2018-12-05 16:47     ` Barry Margolin
     [not found] <mailman.7307.1515801433.27995.help-gnu-emacs@gnu.org>
2018-01-13  0:43 ` info-find-source Emanuel Berg
2018-01-13  3:43   ` info-find-source Robert Thorpe
2018-01-13  5:23     ` info-find-source Marcin Borkowski
2018-01-13 16:31       ` info-find-source Drew Adams
2018-01-14  7:03         ` info-find-source Marcin Borkowski
2018-01-16 23:10           ` info-find-source Drew Adams
2018-01-13 15:50     ` info-find-source Drew Adams
     [not found]     ` <mailman.7314.1515821013.27995.help-gnu-emacs@gnu.org>
2018-01-14  2:57       ` info-find-source Emanuel Berg
2018-01-14  7:00         ` info-find-source Marcin Borkowski
     [not found]         ` <mailman.7369.1515913231.27995.help-gnu-emacs@gnu.org>
2018-01-15  4:17           ` info-find-source Emanuel Berg
2018-01-15 18:54             ` info-find-source Marcin Borkowski
     [not found]             ` <mailman.7435.1516042498.27995.help-gnu-emacs@gnu.org>
2018-01-15 19:55               ` info-find-source Emanuel Berg
2018-01-16 23:58                 ` info-find-source Robert Thorpe
2018-01-19  6:22                 ` info-find-source Marcin Borkowski
     [not found]                 ` <mailman.7609.1516342943.27995.help-gnu-emacs@gnu.org>
2018-01-19  7:12                   ` info-find-source Emanuel Berg
2018-01-19 20:31                     ` info-find-source Marcin Borkowski
2018-01-19 21:05                       ` info-find-source Drew Adams
     [not found]                       ` <mailman.7653.1516395915.27995.help-gnu-emacs@gnu.org>
2018-01-19 22:19                         ` info-find-source Emanuel Berg
2018-01-19 23:21                           ` info-find-source Drew Adams
     [not found]                           ` <mailman.7656.1516404112.27995.help-gnu-emacs@gnu.org>
2018-01-20 19:49                             ` info-find-source Emanuel Berg
2018-01-20 20:18                               ` info-find-source Eli Zaretskii
     [not found]                               ` <<83bmhos2qd.fsf@gnu.org>
2018-01-20 23:50                                 ` info-find-source Drew Adams
2018-01-21  0:04                               ` info-find-source Drew Adams
     [not found]                               ` <mailman.7695.1516493072.27995.help-gnu-emacs@gnu.org>
2018-01-21 11:49                                 ` info-find-source Emanuel Berg
     [not found]                     ` <mailman.7650.1516393881.27995.help-gnu-emacs@gnu.org>
2018-01-19 20:43                       ` info-find-source Emanuel Berg
2018-01-13  5:17   ` info-find-source Marcin Borkowski
     [not found]   ` <mailman.7313.1515820700.27995.help-gnu-emacs@gnu.org>
2018-01-14  2:54     ` info-find-source Emanuel Berg
2018-01-15 18:52       ` info-find-source Marcin Borkowski
     [not found]       ` <mailman.7433.1516042345.27995.help-gnu-emacs@gnu.org>
2018-01-15 19:50         ` info-find-source Emanuel Berg
2017-11-11  9:17 Reload file from disk Florian Weimer
2017-11-11 10:29 ` Eli Zaretskii
2017-11-11 10:40   ` Eli Zaretskii
2017-11-11 10:54     ` Florian Weimer
2017-11-11 11:55       ` Eli Zaretskii
2017-11-11 13:45         ` Ken Olum
2017-11-11 14:11           ` Eli Zaretskii
2017-11-11 15:03             ` Ken Olum
2017-11-11 16:48               ` Drew Adams
2017-11-11 11:59     ` Andreas Schwab
2017-11-11 12:44 ` Noam Postavsky
2017-11-12 18:28 ` Joost Kremers
2017-11-13 17:24   ` Tom Tromey
2017-09-18 21:57 [PATCH] Fixing package-initialize, adding early init file Radon Rosborough
2017-09-19 12:30 ` Stefan Monnier
2017-09-25 16:27   ` Radon Rosborough
2017-09-25 16:54     ` John Wiegley
2017-09-25 19:38       ` Radon Rosborough
2017-09-25 21:23         ` Mark Oteiza
2017-09-25 22:16           ` Radon Rosborough
2017-09-25 23:15             ` Mark Oteiza
2017-09-26  3:00               ` Radon Rosborough
2017-09-29 10:22               ` Eli Zaretskii
2017-09-25 16:58     ` Stefan Monnier
2017-09-25 19:40       ` Radon Rosborough
2017-10-09 23:17     ` Radon Rosborough
2017-10-10 16:52 ` Robert Weiner
2017-10-10 16:59   ` Eli Zaretskii
2017-10-14 21:30     ` Mark Oteiza
2017-10-14 21:52       ` Stefan Monnier
2017-10-15  1:18       ` Radon Rosborough
2017-10-15 14:16       ` Eli Zaretskii
2017-10-15 16:26         ` Stefan Monnier
2017-10-25 22:13           ` Radon Rosborough
2017-10-26  0:11             ` Stefan Monnier
2017-12-18  0:45               ` Radon Rosborough
2018-01-25  4:35                 ` Radon Rosborough
2018-01-25 15:43                   ` Clément Pit-Claudel
2018-01-25 16:03                     ` Stefan Monnier
2018-01-25 16:22                       ` Clément Pit-Claudel
2018-01-25 17:12                         ` Stefan Monnier
2018-01-26  9:31                         ` Eli Zaretskii
2018-01-26 14:34                         ` Loading a package applies automatically to future sessions? Richard Stallman
2018-01-26 17:03                           ` Stefan Monnier
2018-01-28 12:07                             ` Richard Stallman
2018-01-28 13:24                               ` Stefan Monnier
2018-01-29  1:50                                 ` Richard Stallman
2018-01-29  5:56                                   ` Radon Rosborough
2018-02-02  2:14                                     ` Richard Stallman
2018-02-02  3:05                                       ` Clément Pit-Claudel
2018-02-04  3:08                                         ` Richard Stallman
2018-02-04 15:21                                           ` Clément Pit-Claudel
2018-02-04 21:27                                             ` Tim Cross
2018-02-05 10:07                                               ` George Plymale II
2018-02-05 21:27                                                 ` Tim Cross
2018-02-05  1:08                                             ` Richard Stallman
2018-02-05  4:15                                               ` Clément Pit-Claudel
2018-02-05 20:36                                                 ` Richard Stallman
2018-01-26 19:24                           ` Radon Rosborough
2018-01-26 20:02                             ` Eli Zaretskii
2018-01-28 18:20                               ` Radon Rosborough
2018-01-29  1:52                                 ` Richard Stallman
2018-02-10 12:00                                 ` Eli Zaretskii
2018-02-11  1:23                                   ` George Plymale II
2018-02-13 21:14                                     ` Stefan's patch to improve package loading (was Loading a package applies automatically to future sessions?) George Plymale II
2018-02-14  2:56                                       ` John Wiegley
2018-02-14 23:32                                         ` George Plymale II
2018-03-09  2:54                                           ` Stefan's patch to improve package loading George Plymale II
2018-02-15  4:40                                   ` Loading a package applies automatically to future sessions? Radon Rosborough
2018-01-27 20:44                             ` Richard Stallman
2018-01-28  6:30                               ` Radon Rosborough
2018-01-28  9:33                                 ` Charles A. Roelli
2018-01-28 13:21                                 ` Stefan Monnier
2018-01-28 17:32                                   ` Radon Rosborough
2018-01-28 22:11                                     ` Stefan Monnier
2018-01-29  1:08                                       ` T.V Raman
2018-01-29  5:53                                       ` Radon Rosborough
2018-01-29  7:21                                         ` John Wiegley
2018-01-29 18:54                                         ` Stefan Monnier
2018-01-29 19:19                                           ` John Wiegley
2018-01-29 19:55                                             ` Stefan Monnier
2018-01-29  6:55                                       ` John Wiegley
2018-01-29 19:08                                         ` Stefan Monnier
2018-01-29 19:55                                           ` John Wiegley
2018-01-29 21:50                                             ` Stefan Monnier
2018-01-29 23:13                                               ` Clément Pit-Claudel
2018-01-30  1:37                                               ` T.V Raman
2018-01-29 20:18                                           ` Clément Pit-Claudel
2018-01-30 15:11                                             ` Stefan Monnier
2018-01-30 22:33                                               ` George Plymale II
2018-01-30 22:56                                                 ` George Plymale II
2018-01-31  3:47                                                 ` Stefan Monnier
2018-01-31  5:17                                                   ` George Plymale II
2018-01-31 20:49                                                     ` George Plymale II
2018-01-31 21:35                                                       ` Stefan Monnier
2018-01-31 21:58                                                         ` George Plymale II
2018-01-31 22:06                                                           ` George Plymale II
2018-02-01 14:48                                                             ` Stefan Monnier
2018-02-01 17:47                                                               ` George Plymale II
2018-02-01 19:11                                                                 ` Stefan Monnier
2018-02-01 19:19                                                                 ` Stephen Berman
2018-02-01 19:28                                                                   ` Stephen Berman
2018-02-01 21:44                                                                   ` George Plymale II
2018-02-01 22:16                                                                     ` Stephen Berman
2018-02-01 23:02                                                                       ` George Plymale II
2018-02-02  8:43                                                                         ` Eli Zaretskii
2018-02-02 17:19                                                                           ` George Plymale II
2018-02-02 17:57                                                                             ` Stefan Monnier
2018-02-02 18:06                                                                             ` Eli Zaretskii
2018-02-02 12:19                                                                         ` Phillip Lord
2018-02-02 19:20                                                                           ` Radon Rosborough
2018-02-02 22:53                                                                         ` Richard Stallman
2018-02-05  9:17                                                                           ` A response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
2018-02-05 12:55                                                                             ` Clément Pit-Claudel
2018-02-06 23:34                                                                               ` George Plymale II
2018-02-05 20:36                                                                             ` Richard Stallman
2018-02-06 23:42                                                                               ` George Plymale II
2018-02-07 20:45                                                                                 ` Richard Stallman
2018-02-05 20:36                                                                             ` Richard Stallman
2018-02-05 20:36                                                                             ` Richard Stallman
2018-02-06 15:06                                                                         ` Loading a package applies automatically to future sessions? Sam Steingold
2018-02-02 22:53                                                                       ` Richard Stallman
2018-02-02 23:12                                                                         ` Stephen Berman
2018-02-03 19:13                                                                           ` Richard Stallman
2018-02-03 20:40                                                                           ` Stephen Berman
2018-02-04  3:07                                                                             ` Richard Stallman
2018-02-05  9:26                                                                             ` George Plymale II
2018-02-05  9:22                                                                           ` Finding an online resource for the agreement (was Loading a package applies automatically to future sessions?) George Plymale II
2018-02-02  2:14                                                                     ` Loading a package applies automatically to future sessions? Richard Stallman
2018-02-02  7:25                                                                       ` George Plymale II
2018-02-02  9:39                                                                       ` Eli Zaretskii
2018-02-02 17:07                                                                         ` George Plymale II
2018-02-02 17:59                                                                         ` Stefan Monnier
2018-02-02 22:56                                                                         ` Richard Stallman
2018-02-14 22:28                                                                         ` Richard Stallman
2018-02-14 23:18                                                                           ` George Plymale II
2018-02-02  8:39                                                                     ` Eli Zaretskii
2018-02-02 17:21                                                                       ` George Plymale II
2018-02-02 18:08                                                                         ` Eli Zaretskii
2018-02-02  2:12                                                                   ` Richard Stallman
2018-02-02  6:15                                                                     ` George Plymale II
2018-02-04  3:07                                                                       ` Richard Stallman
2018-02-05  9:35                                                                         ` Another response to RMS (was Loading a package applies automatically to future sessions?) George Plymale II
2018-02-05 20:37                                                                           ` Richard Stallman
2018-02-06 23:47                                                                             ` George Plymale II
2018-02-02  2:13                                                               ` Loading a package applies automatically to future sessions? Richard Stallman
2018-02-01 19:24                                                             ` Richard Stallman
2018-02-01 21:36                                                               ` George Plymale II
2018-02-02  2:08                                                                 ` Tim Landscheidt
2018-02-02 22:53                                                                   ` Richard Stallman
2018-02-02  2:17                                                                 ` Richard Stallman
2018-02-02  6:26                                                                   ` George Plymale II
2018-02-02  9:26                                                                   ` Eli Zaretskii
2018-02-02 17:14                                                                     ` George Plymale II
2018-02-02 22:56                                                                     ` Richard Stallman
2018-02-05  9:19                                                                       ` George Plymale II
2018-02-05 20:36                                                                         ` Richard Stallman
2018-02-06 23:44                                                                           ` George Plymale II
2018-02-02  2:17                                                                 ` Richard Stallman
2018-02-02  7:33                                                                   ` George Plymale II
2018-02-02 18:38                                                                     ` Drew Adams
2018-02-02 19:05                                                                       ` Generations (was: Loading a package applies automatically to future sessions?) Stefan Monnier
2018-02-02 21:40                                                                         ` Drew Adams
2018-02-02 22:57                                                                         ` Richard Stallman
2018-02-02 23:03                                                                           ` Drew Adams
2018-02-02 20:36                                                                     ` Loading a package applies automatically to future sessions? Phillip Lord
2018-02-02  2:17                                                                 ` Richard Stallman
2018-02-02  7:24                                                                   ` George Plymale II
2018-02-02 22:28                                                                     ` Paul Eggert
2018-02-05  8:21                                                                       ` George Plymale II
2018-02-05 20:36                                                                         ` Richard Stallman
2018-02-04  3:09                                                                     ` Richard Stallman
2018-02-02 13:37                                                                 ` Clément Pit-Claudel
2018-02-02 17:20                                                                   ` Drew Adams
2018-02-05  4:51                                                                 ` Herring, Davis
2018-02-01 19:47                                                     ` Stefan Monnier
2018-02-01 22:10                                                       ` George Plymale II
2018-02-01 22:44                                                         ` George Plymale II
2018-02-02  1:54                                                           ` Stefan Monnier
2018-02-02 20:32                                                             ` George Plymale II
2018-01-31  3:51                                                 ` T.V Raman
2018-01-31  5:18                                                   ` George Plymale II
2018-01-31  6:56                                                     ` Tim Cross
2018-01-31  7:07                                                       ` George Plymale II
2018-01-31  8:05                                                       ` John Wiegley
2018-02-01  7:26                                                         ` Tim Cross
2018-02-01 15:00                                                           ` Stefan Monnier
2018-02-01 16:23                                                           ` T.V Raman
2018-02-03  0:39                                                             ` Tim Cross
2018-02-05  9:24                                                               ` George Plymale II
2018-01-29  1:50                                   ` Richard Stallman
2018-01-25 17:07                   ` [PATCH] Fixing package-initialize, adding early init file Stefan Monnier
2018-01-28 19:42                     ` Radon Rosborough
2018-01-30 15:02                       ` Stefan Monnier
2018-01-30 15:44                         ` Eli Zaretskii
2018-02-01  3:12                           ` Mark Oteiza
2018-02-01  4:22                             ` Radon Rosborough
2018-02-01 13:36                               ` Stefan Monnier
2018-02-18  5:40                                 ` Stefan Monnier
2018-02-08  5:54                           ` Radon Rosborough
2018-02-08 15:27                             ` Eli Zaretskii
2018-01-30 19:30                         ` Radon Rosborough
2018-02-10 11:56                       ` Eli Zaretskii
2018-02-10 23:37                         ` Stefan Monnier
2018-02-11  3:26                           ` Radon Rosborough
2018-02-11 14:45                             ` Stefan Monnier
2018-02-11 13:31                           ` Basil L. Contovounesios
2018-02-15  4:38                         ` Radon Rosborough
2018-02-15 15:54                           ` Drew Adams
2018-02-15 16:25                             ` Stefan Monnier
2018-02-15 19:32                             ` John Wiegley
2018-02-15 21:13                               ` Stefan Monnier
2018-02-16  7:00                                 ` John Wiegley
2018-02-17 11:38                           ` Eli Zaretskii
2018-02-17 14:14                             ` Clément Pit-Claudel
2018-02-17 18:17                             ` Radon Rosborough
2018-02-18 18:26                               ` Basil L. Contovounesios
2018-02-18 18:55                                 ` Radon Rosborough
2018-02-19  3:10                                 ` Stefan Monnier
2018-02-20 19:13                                   ` Basil L. Contovounesios
2018-02-20 19:26                                     ` Basil L. Contovounesios
2018-02-20 20:35                                       ` Radon Rosborough
2018-02-21  3:48                                         ` T.V Raman
2018-02-21  8:16                                         ` Stefan Monnier
2018-02-21 20:48                                           ` Radon Rosborough
2018-02-21 21:26                                             ` Stefan Monnier
2018-02-21  3:43                                       ` T.V Raman
2017-10-10 19:03   ` Radon Rosborough
2017-10-10 19:31     ` Robert Weiner
2017-10-10 19:41       ` Radon Rosborough
2017-10-13 21:29         ` John Wiegley
2017-10-14  0:49           ` Radon Rosborough
2017-10-14  5:15             ` João Távora
2017-10-14  6:19               ` Radon Rosborough
2017-10-14  9:04                 ` João Távora
2017-10-14 13:47               ` Stefan Monnier
2016-08-03  9:30 How to get back to a place in a buffer, or: what is a window configuration? Marcin Borkowski
2016-08-03 11:25 ` Kaushal Modi
2016-08-03 18:31   ` Marcin Borkowski
2016-08-03 14:42 ` Drew Adams
2016-08-03 18:42   ` Marcin Borkowski
2016-08-03 19:39     ` Drew Adams
2016-08-03 21:47 ` Robert Thorpe
2016-08-03 22:06   ` Drew Adams
2016-05-13 14:20 Overriding emacs key bindings xiongtk
2016-05-16 18:04 ` Eli Zaretskii
2016-05-16 21:15   ` xiongtk
2016-05-16 18:59 ` Emanuel Berg
2016-05-16 21:14   ` xiongtk
2016-05-16 23:29     ` Emanuel Berg
2016-05-17  1:55       ` Robert Thorpe
2016-05-17  2:41         ` Emanuel Berg
2016-05-17  4:07           ` Drew Adams
2016-05-17  3:25         ` Kaushal Modi
2016-05-17  4:07           ` Drew Adams
2016-05-17  4:15           ` Emanuel Berg
2016-05-17 20:38           ` Robert Thorpe
2016-05-17  4:07         ` Drew Adams
2016-05-18  1:42           ` Emacs conventions (was: Re: Overriding emacs key bindings) Emanuel Berg
2016-05-18  4:38             ` Drew Adams
2016-05-18  5:22               ` Emanuel Berg
2016-05-18  5:36                 ` "First line is not a complete sentence" (was: Re: Emacs conventions (was: Re: Overriding emacs key bindings)) Emanuel Berg
     [not found]                 ` <mailman.40.1463549841.6543.help-gnu-emacs@gnu.org>
2016-05-18 13:27                   ` Joost Kremers
2016-05-19  4:32                     ` Emanuel Berg
     [not found]             ` <mailman.37.1463546355.6543.help-gnu-emacs@gnu.org>
2016-05-18 14:31               ` Emacs conventions (was: Re: Overriding emacs key bindings) Barry Margolin
2016-05-19  4:38                 ` Emanuel Berg
2016-05-17  4:44         ` Overriding emacs key bindings Marcin Borkowski
2016-05-17 20:37           ` Robert Thorpe
2016-05-18  2:21             ` Emanuel Berg
2016-05-18 20:34               ` Robert Thorpe
2016-05-19  1:33                 ` Emanuel Berg
2016-05-18 17:52             ` Marcin Borkowski
2016-05-18 20:30               ` Robert Thorpe
2016-05-17  4:43       ` Marcin Borkowski
2016-05-18  1:51         ` Emanuel Berg
2016-05-17  4:49       ` Marcin Borkowski
2016-05-18  2:02         ` Emanuel Berg
2015-03-03  0:47 Opening a bookmark in the init file Robert Thorpe
2015-03-03  0:56 ` Drew Adams
2015-03-03  2:32   ` Robert Thorpe
2015-03-08 19:18     ` Robert Thorpe
2015-03-08 21:24       ` Drew Adams
2015-03-08 21:48         ` Robert Thorpe
2015-03-08 22:52           ` Drew Adams
2015-01-14 22:12 Info: how to get back from a footnote Marcin Borkowski
2015-01-15  2:42 ` Robert Thorpe
2015-01-15  3:11   ` Drew Adams
2015-01-15  5:51   ` Marcin Borkowski
2015-01-16  2:38     ` Robert Thorpe
     [not found] <mailman.16504.1419019164.1147.help-gnu-emacs@gnu.org>
2014-12-29  4:21 ` Abbrevs for the most frequent elisp symbols Emanuel Berg
2014-12-29 11:24   ` Marcin Borkowski
2014-12-29 13:09     ` Robert Thorpe
2014-12-29 15:28       ` Drew Adams
2014-12-29 16:28         ` Robert Thorpe
2014-12-29 13:26     ` Stefan Monnier
2014-12-29 13:40       ` Marcin Borkowski
2014-12-29 14:57         ` Stefan Monnier
2014-12-29 15:49   ` Tom
     [not found]   ` <mailman.16844.1419852282.1147.help-gnu-emacs@gnu.org>
2015-01-03  2:25     ` Emanuel Berg
2015-01-04  0:19       ` Artur Malabarba
     [not found]       ` <mailman.17204.1420330787.1147.help-gnu-emacs@gnu.org>
2015-01-05 21:16         ` Emanuel Berg
2015-01-08 20:53           ` Artur Malabarba
2015-01-03  2:31     ` Emanuel Berg
2014-11-24 16:40 When do you prefer frames instead of windows? Raffaele Ricciardi
2014-11-24 17:20 ` Drew Adams
2014-11-25  8:03   ` Gian Uberto Lauri
2014-11-25 15:46     ` Drew Adams
2014-11-25 15:54       ` Gian Uberto Lauri
2014-11-25  8:33   ` When do you prefer windows instead of frames? Was: " H. Dieter Wilhelm
2014-11-25 15:46     ` Drew Adams
2014-11-25 18:40       ` MBR
2014-11-25 18:52         ` Drew Adams
2014-11-26  2:31         ` Yuri Khan
2014-12-19 16:08         ` Jude DaShiell
2014-11-25  8:52   ` Rainer M Krug
     [not found] ` <mailman.14479.1416849631.1147.help-gnu-emacs@gnu.org>
2014-11-24 17:47   ` Barry Margolin
2014-11-24 18:06     ` Jai Dayal
2014-11-25 17:32   ` Joost Kremers
     [not found]   ` <<slrnm79f8k.a37.joost.m.kremers@j.kremers4.news.arnhem.chello.nl>
2014-11-25 18:09     ` Drew Adams
2014-11-24 19:10 ` MBR
2014-11-24 19:14   ` Drew Adams
2014-11-24 22:12 ` H. Dieter Wilhelm
     [not found] ` <mailman.14497.1416867184.1147.help-gnu-emacs@gnu.org>
2014-11-25  0:59   ` Barry Margolin
2014-11-25  1:29 ` Robert Thorpe
2014-11-25  4:21   ` Drew Adams
2014-11-25  8:54     ` Rainer M Krug
2014-11-25 15:47       ` Drew Adams
2014-11-25  1:45 ` Yuri Khan
2014-11-25  9:27 ` Ralf Fassel
2014-11-25 15:47   ` Drew Adams
     [not found]   ` <mailman.14554.1416930453.1147.help-gnu-emacs@gnu.org>
2014-11-25 15:57     ` Ralf Fassel
2014-11-25 16:57       ` Drew Adams
     [not found]       ` <mailman.14564.1416934703.1147.help-gnu-emacs@gnu.org>
2014-11-25 17:16         ` Ralf Fassel
2014-11-25 18:09           ` Drew Adams
2014-11-25 22:08             ` Subhan Michael Tindall
2014-11-25 22:22               ` Drew Adams
     [not found]             ` <mailman.14600.1416953316.1147.help-gnu-emacs@gnu.org>
2014-11-26  9:34               ` Joost Kremers
2014-11-25 22:02           ` Subhan Michael Tindall
2014-11-26  5:02       ` Yuri Khan
2014-11-25 22:28 ` Bob Proulx
2014-11-25 22:54   ` Drew Adams
2014-11-26  8:12     ` Alan Schmitt
2014-11-26 13:42       ` H. Dieter Wilhelm
2014-11-28 13:51       ` Tom Davey
2014-11-28 15:39         ` Drew Adams
2014-11-26 16:37 ` Ken Goldman
2014-11-27 21:02 ` Chris F.A. Johnson
2014-07-23 21:37 when you gotta have a variable value for a symbol name Buchs, Kevin J.
2014-07-23 22:02 ` Drew Adams
     [not found]   ` <(message>
     [not found]     ` <from>
     [not found]       ` <Eli>
     [not found]       ` <Barry>
     [not found]       ` <Juri>
     [not found]       ` <Raffaele>
     [not found]       ` <Robert>
     [not found]       ` <Emanuel>
     [not found]       ` <Drew>
     [not found]         ` <Adams>
     [not found]           ` <on>
     [not found]             ` <Tue>
     [not found]               ` <17>
     [not found]                 ` <May>
     [not found]                   ` <2016>
     [not found]                     ` <01:29:37>
     [not found]                   ` <2020>
     [not found]                     ` <17:07:29>
     [not found]                       ` <-0800>
     [not found]                     ` <23:56:00>
     [not found]                     ` <01:18:18>
     [not found]                     ` <04:01:05>
     [not found]               ` <03>
     [not found]             ` <Mon>
     [not found]               ` <24>
     [not found]                 ` <Nov>
     [not found]                   ` <2017>
     [not found]               ` <29>
     [not found]             ` <Wed>
     [not found]               ` <23>
     [not found]                 ` <Jul>
     [not found]                   ` <2019>
     [not found]                     ` <07:18:26>
     [not found]                     ` <16:21:24>
     [not found]                   ` <2014>
     [not found]                     ` <15:02:38>
     [not found]                       ` <-0700>
     [not found]                     ` <17:40:42>
     [not found]               ` <14>
     [not found]                 ` <Jan>
     [not found]                   ` <2015>
     [not found]                     ` <02:32:50>
     [not found]                   ` <2018>
     [not found]                     ` <21:17:16>
     [not found]             ` <Sun>
     [not found]             ` <Fri>
     [not found]             ` <Sat>
     [not found]             ` <Thu>
     [not found]               ` <01>
     [not found]       ` <Marcin>
     [not found]       ` <Richard>
2014-07-24 21:57   ` Robert Thorpe
2014-07-25  0:06     ` Drew Adams
     [not found] ` <mailman.5936.1406152985.1147.help-gnu-emacs@gnu.org>
2014-07-23 22:12   ` Pascal J. Bourguignon
     [not found] <Your>
     [not found] ` <message>
     [not found]   ` <of>
     [not found]     ` <"Tue>
     [not found]       ` <09>
     [not found]         ` <Oct>
     [not found]     ` <"Thu,>

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.