unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
@ 2014-11-29 18:13 Drew Adams
       [not found] ` <mailman.14952.1417284925.1147.bug-gnu-emacs@gnu.org>
                   ` (2 more replies)
  0 siblings, 3 replies; 21+ messages in thread
From: Drew Adams @ 2014-11-29 18:13 UTC (permalink / raw)
  To: 19217

Enhancement request.  This has probably been requested before, but
here goes...

It is not uncommon to have a `defface' inside a condition such as (when
(> emacs-major-version 23)...).  Currently, `C-M-x' has no effect on
such a `defface' occurrence.  In order to have Emacs DTRT, I find myself
working around this limitation by temporarily moving the `defface' to
bol.

How about letting users redefine a `defface' with `C-M-x' even in this
case?

At least optionally.  For example, let a non-positive prefix arg do
this, and have edebug instrumentation done only for a non-negative
prefix arg.

Or maybe always (not optionally)?  Is there a good reason for doing this
only at top-level?

If the reason is that `eval-defun' cannot recognize the defun
(`defface') unless it is at top level, then surely there is some way to
make this more flexible.

In GNU Emacs 25.0.50.1 (i686-pc-mingw32)
 of 2014-10-20 on LEG570
Bzr revision: 118168 rgm@gnu.org-20141020195941-icp42t8ttcnud09g
Windowing system distributor `Microsoft Corp.', version 6.1.7601
Configured using:
 `configure --enable-checking=yes,glyphs CPPFLAGS=-DGLYPH_DEBUG=1'





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
       [not found] ` <mailman.14952.1417284925.1147.bug-gnu-emacs@gnu.org>
@ 2014-11-29 19:10   ` Alan Mackenzie
  0 siblings, 0 replies; 21+ messages in thread
From: Alan Mackenzie @ 2014-11-29 19:10 UTC (permalink / raw)
  To: Drew Adams; +Cc: 19217

Hi, Drew.

In article <mailman.14952.1417284925.1147.bug-gnu-emacs@gnu.org> you wrote:
> Enhancement request.  This has probably been requested before, but
> here goes...

> It is not uncommon to have a `defface' inside a condition such as (when
> (> emacs-major-version 23)...).  Currently, `C-M-x' has no effect on
> such a `defface' occurrence.  In order to have Emacs DTRT, I find myself
> working around this limitation by temporarily moving the `defface' to
> bol.

You can also move point to just after the closing ) and do C-x C-e
(`eval-last-sexp').

> How about letting users redefine a `defface' with `C-M-x' even in this
> case?

How is Emacs to determine which depth of parenthesis is to be considered
the opening one?  For example, if a defface is contained within a
defmacro, which one is to be executed on C-M-x?

> At least optionally.  For example, let a non-positive prefix arg do
> this, and have edebug instrumentation done only for a non-negative
> prefix arg.

> Or maybe always (not optionally)?  Is there a good reason for doing this
> only at top-level?

I think it is to make it unambiguous, which form is to be evaluated.

> If the reason is that `eval-defun' cannot recognize the defun
> (`defface') unless it is at top level, then surely there is some way to
> make this more flexible.

> In GNU Emacs 25.0.50.1 (i686-pc-mingw32)
> of 2014-10-20 on LEG570
> Bzr revision: 118168 rgm@gnu.org-20141020195941-icp42t8ttcnud09g
> Windowing system distributor `Microsoft Corp.', version 6.1.7601
> Configured using:
> `configure --enable-checking=yes,glyphs CPPFLAGS=-DGLYPH_DEBUG=1'

-- 
Alan Mackenzie (Nuremberg, Germany).






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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
       [not found] ` <<20141129191023.34112.qmail@mail.muc.de>
@ 2014-11-29 20:08   ` Drew Adams
  2014-11-30 19:58     ` Alan Mackenzie
  0 siblings, 1 reply; 21+ messages in thread
From: Drew Adams @ 2014-11-29 20:08 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 19217

> You can also move point to just after the closing ) and do C-x C-e
> (`eval-last-sexp').

I too thought that was the case, but it does not seem to be.  I just
tried it, starting with emacs -Q in several Emacs versions (22, 24.4,
25 dev build).

> > How about letting users redefine a `defface' with `C-M-x' even in
> > this case?
> 
> How is Emacs to determine which depth of parenthesis is to be
> considered the opening one?  For example, if a defface is contained
> within a defmacro, which one is to be executed on C-M-x?

I really don't care about corner cases, if in fact there are any.

You could even require that point be on the symbol `defface' in the
sexp, for all I care.  Then it should be trivial to grab the `defface'
sexp (e.g., use `(list-at-point)').

The point is to have some way to reevaluate the defface sexp.  If
`C-x C-e' worked, that would be enough, but AFAICT it does not work.

> > Is there a good reason for doing this only at top-level?
> 
> I think it is to make it unambiguous, which form is to be evaluated.

Dunno how `C-x C-e' could be ambiguous wrt the sexp that precedes
point.  If the sexp preceding point is ambiguous then I think we're
probably in a world of trouble. ;-)

Coming back to `C-M-x': Then don't seek perfection.  Require that
point be closer to the list enclosing `defface' than to another
list when you try `C-M-x', in order for it to unambiguously pick
up the right sexp.

What am I missing?





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-11-29 20:08   ` bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level Drew Adams
@ 2014-11-30 19:58     ` Alan Mackenzie
  2014-11-30 20:51       ` Drew Adams
  0 siblings, 1 reply; 21+ messages in thread
From: Alan Mackenzie @ 2014-11-30 19:58 UTC (permalink / raw)
  To: Drew Adams; +Cc: 19217

Hello, Drew.

On Sat, Nov 29, 2014 at 12:08:14PM -0800, Drew Adams wrote:
> > You can also move point to just after the closing ) and do C-x C-e
> > (`eval-last-sexp').

> I too thought that was the case, but it does not seem to be.  I just
> tried it, starting with emacs -Q in several Emacs versions (22, 24.4,
> 25 dev build).

I've never had a problem with C-x C-e that I can remember, and that
includes several times with point after a random ) inside a defun.  What
happens when you do C-x C-e with point just after the `defface' form?

> > > How about letting users redefine a `defface' with `C-M-x' even in
> > > this case?

> > How is Emacs to determine which depth of parenthesis is to be
> > considered the opening one?  For example, if a defface is contained
> > within a defmacro, which one is to be executed on C-M-x?

> I really don't care about corner cases, if in fact there are any.

What exactly are you suggesting?  That `defface' be made a special case,
and that if any of the sequence of enclosing (s opens a `defface' form,
this should be the one chosen for execution?  Or should any defining
function count?  What is special about `defface'?

> You could even require that point be on the symbol `defface' in the
> sexp, for all I care.  Then it should be trivial to grab the `defface'
> sexp (e.g., use `(list-at-point)').

> The point is to have some way to reevaluate the defface sexp.  If
> `C-x C-e' worked, that would be enough, but AFAICT it does not work.

What happens when you try it?

> > > Is there a good reason for doing this only at top-level?

> > I think it is to make it unambiguous, which form is to be evaluated.

> Dunno how `C-x C-e' could be ambiguous wrt the sexp that precedes
> point.  If the sexp preceding point is ambiguous then I think we're
> probably in a world of trouble. ;-)

Neither C-M-x not C-x C-e are ambiguous.  The first evaluates the top
level form containing point, the second the sexp immediately preceding
point.

> Coming back to `C-M-x': Then don't seek perfection.  Require that
> point be closer to the list enclosing `defface' than to another
> list when you try `C-M-x', in order for it to unambiguously pick
> up the right sexp.

I'm not sure how you're going to construe "closer", given that a list
typically extends over many characters and when point is within it, that
must count as distance zero.  Or something.

> What am I missing?

A detailed clear specification of what you want.

-- 
Alan Mackenzie (Nuremberg, Germany).





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-11-30 19:58     ` Alan Mackenzie
@ 2014-11-30 20:51       ` Drew Adams
  2014-11-30 23:20         ` Alan Mackenzie
  2014-12-06 19:10         ` Alan Mackenzie
  0 siblings, 2 replies; 21+ messages in thread
From: Drew Adams @ 2014-11-30 20:51 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 19217

> > > You can also move point to just after the closing ) and do C-x
> > > C-e (`eval-last-sexp').
> 
> > I too thought that was the case, but it does not seem to be.  I
> > just tried it, starting with emacs -Q in several Emacs versions
> > (22, 24.4, 25 dev build).
> 
> I've never had a problem with C-x C-e that I can remember, and that
> includes several times with point after a random ) inside a defun.
> What happens when you do C-x C-e with point just after the `defface'
> form?

As I said, nothing happens.

emacs -Q
Put this in *scratch*, and evaluate it:
(when t
  (defface foo '((((background dark)) (:foreground "#58DFFA4FFFFF"))
                 (t (:foreground "Firebrick")))
    "A face." :group 'help)
  )

`M-x customize-face' shows that it is defined as it should be.

Edit the definition, replacing "Firebrick" with "Blue".  Put point
just after the defface sexp and hit `C-x C-e'.  `M-x customize-face'
shows that no change was made.  Feel free to blow away the Customize
buffer completely, so you are sure that you're not just seeing what
was there before. ;-)

Edit the color to "Green".  Put point on the symbol `defface' and
hit `C-M-x' - likewise, still no change to the face.

> > > > How about letting users redefine a `defface' with `C-M-x' even
> > > > in this case?
> 
> > > How is Emacs to determine which depth of parenthesis is to be
> > > considered the opening one?  For example, if a defface is
> > > contained within a defmacro, which one is to be executed on C-M-x?
> 
> > I really don't care about corner cases, if in fact there are any.
> 
> What exactly are you suggesting?

See above.  (1) `C-x C-e' should work as you say it works.
(2) `C-M-x' with point inside a defface sexp should also work.
If the latter cannot easily be made to work with point anywhere
inside the sexp, then at least make it work with point on `defface'
or near it (e.g. at the same list level).

> That `defface' be made a special case,

If that's necessary, yes.  It should be made to work, whether that
means special-casing it or not.

Currently, `C-M-x' inside a defun that is not at top level does not
have the problem that defface has.  Repeat the above recipe, but
with (defun toto () "Toto." (forward-char)) in place of the defface
sexp.  Edit it after evalling, to use `backward-char', and use
`C-M-x' again.  Check the definition before and after editing, using
(symbol-function 'toto).  No problem.  Not so, for defface.

> and that if any of the sequence of enclosing (s opens a `defface'
> form, this should be the one chosen for execution?  Or should any
> defining function count?  What is special about `defface'?

No idea what you are going on about; sorry.

> > You could even require that point be on the symbol `defface' in
> > the sexp, for all I care.  Then it should be trivial to grab the
> > `defface' sexp (e.g., use `(list-at-point)').
> 
> > The point is to have some way to reevaluate the defface sexp.  If
> > `C-x C-e' worked, that would be enough, but AFAICT it does not
> > work.
> 
> What happens when you try it?

See above.  100% reproducible from emacs -Q.  What happens when
you try it? ;-)

> > > > Is there a good reason for doing this only at top-level?
> 
> > > I think it is to make it unambiguous, which form is to be
> > > evaluated.
> 
> > Dunno how `C-x C-e' could be ambiguous wrt the sexp that precedes
> > point.  If the sexp preceding point is ambiguous then I think
> > we're probably in a world of trouble. ;-)
> 
> Neither C-M-x not C-x C-e are ambiguous.  The first evaluates the
> top level form containing point, the second the sexp immediately
> preceding point.

They should.  But they do not, in the case of defface.  See above.
Try it.

> > Coming back to `C-M-x': Then don't seek perfection.  Require that
> > point be closer to the list enclosing `defface' than to another
> > list when you try `C-M-x', in order for it to unambiguously pick
> > up the right sexp.
> 
> I'm not sure how you're going to construe "closer", given that a
> list typically extends over many characters and when point is
> within it, that must count as distance zero.  Or something.

It's trivial to determine whether point is at the same list level
as the `defface' symbol.

> > What am I missing?
> 
> A detailed clear specification of what you want.

I don't think I'm (or you are) missing that.  Have you tried it?





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-11-30 20:51       ` Drew Adams
@ 2014-11-30 23:20         ` Alan Mackenzie
  2014-12-01  0:00           ` Drew Adams
  2014-12-06 19:10         ` Alan Mackenzie
  1 sibling, 1 reply; 21+ messages in thread
From: Alan Mackenzie @ 2014-11-30 23:20 UTC (permalink / raw)
  To: Drew Adams; +Cc: 19217

Hello, Drew.

On Sun, Nov 30, 2014 at 12:51:59PM -0800, Drew Adams wrote:
> > > > You can also move point to just after the closing ) and do C-x
> > > > C-e (`eval-last-sexp').

> > > I too thought that was the case, but it does not seem to be.  I
> > > just tried it, starting with emacs -Q in several Emacs versions
> > > (22, 24.4, 25 dev build).

> > I've never had a problem with C-x C-e that I can remember, and that
> > includes several times with point after a random ) inside a defun.
> > What happens when you do C-x C-e with point just after the `defface'
> > form?

> As I said, nothing happens.

Ah.  Yes, `defface' is like `defvar', in that if you defface a face
twice, the second try does not overwrite the first.  I had to look at the
fine source to see this, the documentation being somewhat suboptimal.

There's presumably some way of deleting a face, but I'm dashed if I can
find it in the info pages.  Something like `makunbound', but for faces.
I suspect that this will also be only to be found by perusal of the fine
source, possibly the C source.  <A bit later>  I've had a look at
xfaces.c, and it would seem there is no way to delete a face.  Faces are
simply stored in an array of Lisp_object's, starting at element 0, and
counting up from there each time you add a new face.

It was also said, somewhere, that C-M-x takes special action for a
variable, customisable something-or-other, or face.  So how does it do
this?  Well, a bit of digging around, and the answer's in `eval-defun-1'
in lisp-mode.el.

So I now see what you're complaining about, and I think would too, if I
were doing anything at all with faces.  Having defined a face with
`defface', the _ONLY_ way to tweak it at the source code level, is either
to restart Emacs or use C-M-x.  And for the latter, you need the opening
paren at top level.  If I were you, I'd hack something together for my
own use based on what's in lisp-mode.el.

Phew!

> emacs -Q
> Put this in *scratch*, and evaluate it:
> (when t
>   (defface foo '((((background dark)) (:foreground "#58DFFA4FFFFF"))
>                  (t (:foreground "Firebrick")))
>     "A face." :group 'help)
>   )

> `M-x customize-face' shows that it is defined as it should be.

> > What exactly are you suggesting?

> See above.  (1) `C-x C-e' should work as you say it works.

You could probably fix this with a bit of advice (whether old-style or
new-style ;-).

> (2) `C-M-x' with point inside a defface sexp should also work.
> If the latter cannot easily be made to work with point anywhere
> inside the sexp, then at least make it work with point on `defface'
> or near it (e.g. at the same list level).

> > That `defface' be made a special case,

> If that's necessary, yes.  It should be made to work, whether that
> means special-casing it or not.

Given how much of a special case faces already are, in terms of
awkwardness and inflexibility, maybe that's not too much to ask for.  But
beware of what you're asking for - you might get it.  Then when you do
C-M-x, expecting to evaluate a defun, you accidentally get a face defined
instead, which you then can't get rid of.

[ .... ]

> > I'm not sure how you're going to construe "closer", given that a
> > list typically extends over many characters and when point is
> > within it, that must count as distance zero.  Or something.

> It's trivial to determine whether point is at the same list level
> as the `defface' symbol.

That would indeed be one way of doing it.

-- 
Alan Mackenzie (Nuremberg, Germany).





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-11-30 23:20         ` Alan Mackenzie
@ 2014-12-01  0:00           ` Drew Adams
  0 siblings, 0 replies; 21+ messages in thread
From: Drew Adams @ 2014-12-01  0:00 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 19217

> Ah.  Yes, `defface' is like `defvar', in that if you defface a face
> twice, the second try does not overwrite the first.

`defvar' too should be fixed, for the same cases & reasons.  There
is no user-oriented reason that `C-M-x' should not re-evaluate the
sexp, redefining the variable or the face.

There can be implementation reasons (too hard to do, or whatever),
but I see no user reason.

And wrt the implementation, I see no reason why TRT cannot be done,
at least for common, simple use cases (e.g., point on the symbol
being redefined).

> So I now see what you're complaining about, and I think would too,
> if I were doing anything at all with faces.

> ... use C-M-x.  And for the latter, you need the opening paren
> at top level.

1. That evaluates more than the defface inside that opening paren.
   E.g., in the test case I gave, the opening top-level paren is
   for (when... ).

2. Even if that did the right thing, which does not (see #1), it
   is far too restrictive - far more restrictive than it needs to
   be.  See what I wrote above.

> If I were you, I'd hack something together for
> my own use based on what's in lisp-mode.el.
...
> You could probably fix this with a bit of advice (whether
> old-style or new-style ;-).

Thanks for the advice, but I prefer to file this bug report
and hope that Emacs gets fixed.  I've lived with it this way
for decades already.  It is for Emacs, not for me, that I file
the bug report.

> > (2) `C-M-x' with point inside a defface sexp should also work.
> > If the latter cannot easily be made to work with point anywhere
> > inside the sexp, then at least make it work with point on
> `defface'
> > or near it (e.g. at the same list level).
> 
> > > That `defface' be made a special case,
> 
> > If that's necessary, yes.  It should be made to work, whether that
> > means special-casing it or not.
> 
> Given how much of a special case faces already are, in terms of
> awkwardness and inflexibility, maybe that's not too much to ask for.
> But beware of what you're asking for - you might get it.  Then
> when you do C-M-x, expecting to evaluate a defun, you accidentally
> get a face defined instead, which you then can't get rid of.

Why can't I "get rid of it"?

Anyway, I can live with `C-M-x' redefining the stuff I use it on.
I will expect it to do that.  If I don't want to do that then I
can use `eval-region' or similar, which perform normal load-like
evaluation.

> > > I'm not sure how you're going to construe "closer", given that a
> > > list typically extends over many characters and when point is
> > > within it, that must count as distance zero.  Or something.
> 
> > It's trivial to determine whether point is at the same list level
> > as the `defface' symbol.
> 
> That would indeed be one way of doing it.

Thanks for taking a look, in any case.  Should someone decide to
fix this bug, it might be good to (a) take a user poll and (b)
provide a way (e.g. a user option) to return to the previous (i.e.,
current), lame behavior for those who prefer it.





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-11-29 18:13 Drew Adams
       [not found] ` <mailman.14952.1417284925.1147.bug-gnu-emacs@gnu.org>
@ 2014-12-01  3:51 ` Stefan Monnier
  2014-12-01  4:29   ` Drew Adams
       [not found] ` <mailman.15037.1417408221.1147.bug-gnu-emacs@gnu.org>
  2 siblings, 1 reply; 21+ messages in thread
From: Stefan Monnier @ 2014-12-01  3:51 UTC (permalink / raw)
  To: Drew Adams; +Cc: 19217

> It is not uncommon to have a `defface' inside a condition such as (when
> (> emacs-major-version 23)...).

Obviously, I'm blindsided by looking mostly at bundled Elisp code, but
to get an idea of how common it might be, could you explain why you'd
want to wrap it in that way?
Also, pointers to code that do that would help.

> Currently, `C-M-x' has no effect on such a `defface' occurrence.

Yes, same problem for defvar/defcustom, of course.

> How about letting users redefine a `defface' with `C-M-x' even in this
> case?

I think I'd welcome a patch which fixes this well enough (including in
the case of C-u C-M-x).  The current way C-M-x handled defvar/defface is
hackish and ugly.  Extending this hack to code wrapped in a conditional
test would not be welcome.  But replacing the hack with something a bit
more generic would be nice.


        Stefan





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-12-01  3:51 ` Stefan Monnier
@ 2014-12-01  4:29   ` Drew Adams
  2014-12-01 13:49     ` Stefan Monnier
  0 siblings, 1 reply; 21+ messages in thread
From: Drew Adams @ 2014-12-01  4:29 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 19217

> > It is not uncommon to have a `defface' inside a condition such as
> > (when (> emacs-major-version 23)...).
> 
> Obviously, I'm blindsided by looking mostly at bundled Elisp code,
> but to get an idea of how common it might be, could you explain why
> you'd want to wrap it in that way?

I just did - when the defface (e.g. the given face itself) makes
sense only for certain Emacs versions.  It doesn't matter how
common it is - it is common enough.  There is no reason users should
not have a simple way to redefine a defface, defvar, or defcustom,
at top level or not.

This should not need to be justified by showing how commonly it is
needed.  Obviously this is only a nice-to-have; we've been getting
along without it for decades.  So what?

The current limitation to top-level is for what reason?  For users?
I'm guessing that the only answer is that this limitation simplifies
the *implementation*, not that it simplifies things for users.
30 years later, we ought to be able to do a little better (for users).

I suggested a simple improvement that can be made easily - let users
do it at least when point is on the defface etc. symbol.  That's a
limitation, but it at least gives you some way to easily redefine the
critter.

The point is that there is currently *no* way for a user to do it.
It's not about making things super general.  Just give us some easy
way to do it.  Let's not let the search for something ideal become
the enemy of making a simple improvement.

> > How about letting users redefine a `defface' with `C-M-x' even in
> > this case?
> 
> I think I'd welcome a patch which fixes this well enough
> (including in the case of C-u C-M-x).

I don't have a patch.  I too welcome a simple improvement here. 

> The current way C-M-x handled defvar/defface is hackish and ugly.

I assume you're talking about the implementation and not the way
users interact with Emacs using it.  The current user interaction
is simple and useful.

> Extending this hack to code wrapped in a conditional test would
> not be welcome.

Sounds like we're in for a few more decades of the same.

> But replacing the hack with something a bit more generic would
> be nice.

Provided we don't lose other functionality or convenience.
"Beware the generic rewrite improvement."  This should not be
a big deal.





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-12-01  4:29   ` Drew Adams
@ 2014-12-01 13:49     ` Stefan Monnier
  0 siblings, 0 replies; 21+ messages in thread
From: Stefan Monnier @ 2014-12-01 13:49 UTC (permalink / raw)
  To: Drew Adams; +Cc: 19217

> I just did - when the defface (e.g. the given face itself) makes
> sense only for certain Emacs versions.

That just paraphrases in ambiguous English the perfectly precise Elisp
code you quoted.  So it's not what I'm after.

> It doesn't matter how common it is

It matters to me, obviously.

> - it is common enough.  There is no reason users should not have
> a simple way to redefine a defface, defvar, or defcustom, at top level
> or not.

Irrelevant.  Frequency of occurrence and typical contexts can give very
useful hints at what the best solution is.  The answer you quote already
makes it clear I agree it should be solved, so stop arguing this point,
you're just wasting people's time.

I stopped reading your rant here.


        Stefan





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
       [not found] ` <mailman.15037.1417408221.1147.bug-gnu-emacs@gnu.org>
@ 2014-12-01 17:02   ` Alan Mackenzie
  0 siblings, 0 replies; 21+ messages in thread
From: Alan Mackenzie @ 2014-12-01 17:02 UTC (permalink / raw)
  To: Drew Adams; +Cc: 19217

Hello again, Drew.

In article <mailman.15037.1417408221.1147.bug-gnu-emacs@gnu.org> you wrote:

> The current limitation to top-level is for what reason?  For users?

For both users and implementors.  "The top level construct containing
point (or the one following point)" is wonderfully consistent and clear
for all concerned.

> I'm guessing that the only answer is that this limitation simplifies
> the *implementation*, not that it simplifies things for users.
> 30 years later, we ought to be able to do a little better (for users).

I wasn't really aware of the special handling for `defvar', `defface',
etc. in C-M-x until just now.  In fact I thought C-M-x and C-x C-e did
the same thing.

As a suggestion, why not enhance C-x C-e also to handle these defining
constructs specially?

> I suggested a simple improvement that can be made easily - let users
> do it at least when point is on the defface etc. symbol.  That's a
> limitation, but it at least gives you some way to easily redefine the
> critter.

It's not rocket science, no, but it is still a bit tricky to do.

> The point is that there is currently *no* way for a user to do it.
> It's not about making things super general.  Just give us some easy
> way to do it.  Let's not let the search for something ideal become
> the enemy of making a simple improvement.

Again, I suggest enhancing C-x C-e.

> I don't have a patch.  I too welcome a simple improvement here. 

You don't have a patch _yet_.  You could write one.  I think there's a
good chance Stefan would accept it.

>> The current way C-M-x handled defvar/defface is hackish and ugly.

> I assume you're talking about the implementation and not the way
> users interact with Emacs using it.  The current user interaction
> is simple and useful.

Yes, the implementation is ugly.  Given how it breaks the rules about not
redefining defxxx's, I don't see how it can be other than ugly.

-- 
Alan Mackenzie (Nuremberg, Germany).






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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-11-30 20:51       ` Drew Adams
  2014-11-30 23:20         ` Alan Mackenzie
@ 2014-12-06 19:10         ` Alan Mackenzie
  2014-12-10 22:20           ` Drew Adams
  2020-09-18 13:36           ` Lars Ingebrigtsen
  1 sibling, 2 replies; 21+ messages in thread
From: Alan Mackenzie @ 2014-12-06 19:10 UTC (permalink / raw)
  To: Drew Adams; +Cc: 19217

Hi, Drew.

On Sun, Nov 30, 2014 at 12:51:59PM -0800, Drew Adams wrote:
> > > > You can also move point to just after the closing ) and do C-x
> > > > C-e (`eval-last-sexp').

> > > I too thought that was the case, but it does not seem to be.  I
> > > just tried it, starting with emacs -Q in several Emacs versions
> > > (22, 24.4, 25 dev build).

> > I've never had a problem with C-x C-e that I can remember, and that
> > includes several times with point after a random ) inside a defun.
> > What happens when you do C-x C-e with point just after the `defface'
> > form?

> As I said, nothing happens.

OK.  I've hacked the following patch together, which wasn't actually all
that difficult.  I've tested it out on a defvar, and it works there.  It
gives C-x C-e the same special handling that C-M-x has for defvar's,
defcustom's, defface's, etc.  It's incomplete (no documentation has been
changed), but it might do what you need.  Please try it out.



diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 2be81a5..830ae2b 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -811,10 +811,11 @@ and level of lists, and include additional formats for integers
   (let ((standard-output (if eval-last-sexp-arg-internal (current-buffer) t)))
     ;; Setup the lexical environment if lexical-binding is enabled.
     (elisp--eval-last-sexp-print-value
-     (eval (eval-sexp-add-defvars (elisp--preceding-sexp)) lexical-binding)
+     (eval (eval-sexp-add-defvars
+	    (elisp--eval-defun-1 (macroexpand (elisp--preceding-sexp))))
+	   lexical-binding)
      eval-last-sexp-arg-internal)))
 
-
 (defun elisp--eval-last-sexp-print-value (value &optional eval-last-sexp-arg-internal)
   (let ((unabbreviated (let ((print-length nil) (print-level nil))
 			 (prin1-to-string value)))



-- 
Alan Mackenzie (Nuremberg, Germany).





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-12-06 19:10         ` Alan Mackenzie
@ 2014-12-10 22:20           ` Drew Adams
  2014-12-13  3:07             ` Drew Adams
  2020-09-18 13:36           ` Lars Ingebrigtsen
  1 sibling, 1 reply; 21+ messages in thread
From: Drew Adams @ 2014-12-10 22:20 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 19217

Hi Alan,

> > > What happens when you do C-x C-e with point just after the
> > > `defface' form?
> 
> > As I said, nothing happens.
> 
> OK.  I've hacked the following patch together, which wasn't actually
> all that difficult.  I've tested it out on a defvar, and it works there.
> It gives C-x C-e the same special handling that C-M-x has for defvar's,
> defcustom's, defface's, etc.  It's incomplete (no documentation has
> been changed), but it might do what you need.  Please try it out.

Sorry for the delay.  I tried it, for both defface and defvar, using
this:

(when t
  (defface foo '((((background dark)) (:foreground "#58DFFA4FFFFF"))
                 (t (:foreground "Firebrick")))
    "A face." :group 'help);
  )

(when t
  (defvar toto 42
    "Forty-two.");
  )

After evaling the sexps and then modifying the values
(e.g. Firebrick -> Blue, 42 -> 56), I put point before the `;'
and tried C-x C-e.

Starting from emacs -Q, it works, for both face & var.  With my
setup, however, it does not work (no change from before).  Dunno why.
Tried it with `lexical-binding' t and nil - neither worked.

I'll bisect my setup when I get a moment, to try to find out why it
doesn't work for me.

Thanks for working on this.





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-12-10 22:20           ` Drew Adams
@ 2014-12-13  3:07             ` Drew Adams
  0 siblings, 0 replies; 21+ messages in thread
From: Drew Adams @ 2014-12-13  3:07 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 19217

Hi Alan,

> Starting from emacs -Q, it works, for both face & var.  With my
> setup, however, it does not work (no change from before).  Dunno
> why.  Tried it with `lexical-binding' t and nil - neither worked.
> 
> I'll bisect my setup when I get a moment, to try to find out why it
> doesn't work for me.
> 
> Thanks for working on this.

I found the explanation.  I bind `C-x C-e' to `pp-eval-last-sexp',
not to `eval-last-sexp'.  Apparently the latter got considerably
redefined after Emacs 24.4, so that `pp-eval-last-sexp' is no
longer parallel with `eval-last-sexp' - the code is very different.

Your fix seems good for `eval-last-sexp'.  But I would like to
also see a similar fix for `pp-eval-last-sexp'.  Could you
perhaps take a look at fixing that as well?

I filed a separate bug (#19362) for bringing `pp.el' into line
with the changes that were made in moving from `lisp-mode.el'
to `elisp-mode.el'.  I'm not sure about all that might be
involved for such a fix, as I don't know just what has changed.
So that bug report is worded vaguely.

But I would at least like to see `pp-eval-last-sexp' updated
similarly to how `eval-last-sexp' was (for Emacs-Lisp buffers).
A quick glance suggests that the change involves respecting
`lexical-binding', but it might be more or other than that.

Could you perhaps take a look?  I would like to be able to
get both (a) any advantages brought to `eval-last-sexp' by
the Emacs 25 changes to it and (b) the advantage of your
fix to it (this bug).  But I also want to be able to continue
using `pp-eval-last-sexp' instead of `eval-last-sexp'.
I just want the former to enjoy the same advantages as latter.

I have my own enhancement to `pp-eval-expression' (which is
used by `pp-eval-last-sexp'), but the changes I make to that
are probably orthogonal and I will be able to make them to
whatever updated definition of `pp-eval-last-sexp' there is.

---

FYI, the changes I make to `pp-eval-expression' are these:

1. Read with completion using `pp-read-expression-map'.
2. Progress message added.
3. Added optional arg and insertion behavior.
4. Respect `pp-eval-expression-print-length',
   `pp-eval-expression-print-level', and
   `eval-expression-debug-on-error'.

#1 means bindings for `lisp-indent-line', `lisp-complete-symbol',
   `indent-sexp', `eval-defun', and `indent-pp-sexp'.

#3 means this:
With a prefix arg, insert the value into the current buffer at point.
 With a negative prefix arg, if the value is a string then insert it
 into the buffer without double-quotes (`"').

#4 means you can use different values from the same
options without the prefix `pp-'.

---

FYI, I do this, wrt keys:
(substitute-key-definition 'eval-last-sexp
                           'pp-eval-last-sexp global-map)
(substitute-key-definition 'eval-expression
                           'pp-eval-expression global-map))





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2014-12-06 19:10         ` Alan Mackenzie
  2014-12-10 22:20           ` Drew Adams
@ 2020-09-18 13:36           ` Lars Ingebrigtsen
  2020-09-18 15:53             ` Drew Adams
  2020-10-15 14:28             ` Lars Ingebrigtsen
  1 sibling, 2 replies; 21+ messages in thread
From: Lars Ingebrigtsen @ 2020-09-18 13:36 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Stefan Monnier, 19217

Alan Mackenzie <acm@muc.de> writes:

> OK.  I've hacked the following patch together, which wasn't actually all
> that difficult.  I've tested it out on a defvar, and it works there.  It
> gives C-x C-e the same special handling that C-M-x has for defvar's,
> defcustom's, defface's, etc.  It's incomplete (no documentation has been
> changed), but it might do what you need.  Please try it out.

The patch no longer applies to Emacs 28, so I've respun it:

diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 72b94a57b4..7682e099f5 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -1190,7 +1190,8 @@ elisp--eval-last-sexp
     ;; Setup the lexical environment if lexical-binding is enabled.
     (elisp--eval-last-sexp-print-value
      (eval (macroexpand-all
-            (eval-sexp-add-defvars (elisp--preceding-sexp)))
+            (eval-sexp-add-defvars
+             (elisp--eval-defun-1 (macroexpand (elisp--preceding-sexp)))))
            lexical-binding)
      (if insert-value (current-buffer) t) no-truncate char-print-limit)))
 
To recap, this allows `C-x C-e' on defvar/defface to work the same as
`C-M-x' on those (when they are top-level).

That these two work differently is a source of frustration, so I think
it makes conceptual sense, but I'm not sure what the repercussions would
be otherwise...

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2020-09-18 13:36           ` Lars Ingebrigtsen
@ 2020-09-18 15:53             ` Drew Adams
  2020-09-19 14:10               ` Lars Ingebrigtsen
  2020-10-15 14:28             ` Lars Ingebrigtsen
  1 sibling, 1 reply; 21+ messages in thread
From: Drew Adams @ 2020-09-18 15:53 UTC (permalink / raw)
  To: Lars Ingebrigtsen, Alan Mackenzie; +Cc: Stefan Monnier, 19217

What about `pp-eval-last-sexp'?
Could we get that updated similarly?

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19217#44





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2020-09-18 15:53             ` Drew Adams
@ 2020-09-19 14:10               ` Lars Ingebrigtsen
  0 siblings, 0 replies; 21+ messages in thread
From: Lars Ingebrigtsen @ 2020-09-19 14:10 UTC (permalink / raw)
  To: Drew Adams; +Cc: Alan Mackenzie, Stefan Monnier, 19217

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

> What about `pp-eval-last-sexp'?
> Could we get that updated similarly?

Sure, if we decide to alter `eval-last-sexp' in this way.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2020-09-18 13:36           ` Lars Ingebrigtsen
  2020-09-18 15:53             ` Drew Adams
@ 2020-10-15 14:28             ` Lars Ingebrigtsen
  2020-10-15 15:29               ` Drew Adams
  1 sibling, 1 reply; 21+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-15 14:28 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Stefan Monnier, 19217

Lars Ingebrigtsen <larsi@gnus.org> writes:

> To recap, this allows `C-x C-e' on defvar/defface to work the same as
> `C-M-x' on those (when they are top-level).
>
> That these two work differently is a source of frustration, so I think
> it makes conceptual sense, but I'm not sure what the repercussions would
> be otherwise...

There were no protests, so I've now gone ahead and done this.  This may
perhaps be controversial, but I've never understood why `C-x C-e'
shouldn't do "the obvious thing" on defvar (etc) forms, so I've done it
anyway.

However, if this somehow gets in the way of people's way of working, it
could be reversed, I guess.  

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2020-10-15 14:28             ` Lars Ingebrigtsen
@ 2020-10-15 15:29               ` Drew Adams
  2020-10-15 15:35                 ` Lars Ingebrigtsen
  0 siblings, 1 reply; 21+ messages in thread
From: Drew Adams @ 2020-10-15 15:29 UTC (permalink / raw)
  To: Lars Ingebrigtsen, Alan Mackenzie; +Cc: Stefan Monnier, 19217

> > To recap, this allows `C-x C-e' on defvar/defface to work the same as
> > `C-M-x' on those (when they are top-level).
> >
> > That these two work differently is a source of frustration, so I think
> > it makes conceptual sense, but I'm not sure what the repercussions would
> > be otherwise...
> 
> There were no protests, so I've now gone ahead and done this.  This may
> perhaps be controversial, but I've never understood why `C-x C-e'
> shouldn't do "the obvious thing" on defvar (etc) forms, so I've done it
> anyway.
> 
> However, if this somehow gets in the way of people's way of working, it
> could be reversed, I guess.

Thanks for doing this.
But did you also fix `pp-eval-last-sexp'?

You said this:

> Saturday, September 19, 2020 7:11 AM
> > What about `pp-eval-last-sexp'?
> > Could we get that updated similarly?
> 
> Sure, if we decide to alter `eval-last-sexp' in this way.





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2020-10-15 15:29               ` Drew Adams
@ 2020-10-15 15:35                 ` Lars Ingebrigtsen
  2020-10-15 16:15                   ` Drew Adams
  0 siblings, 1 reply; 21+ messages in thread
From: Lars Ingebrigtsen @ 2020-10-15 15:35 UTC (permalink / raw)
  To: Drew Adams; +Cc: Alan Mackenzie, Stefan Monnier, 19217

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

> But did you also fix `pp-eval-last-sexp'?

Yes.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





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

* bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level
  2020-10-15 15:35                 ` Lars Ingebrigtsen
@ 2020-10-15 16:15                   ` Drew Adams
  0 siblings, 0 replies; 21+ messages in thread
From: Drew Adams @ 2020-10-15 16:15 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Alan Mackenzie, Stefan Monnier, 19217

Great! Thank you.

> > But did you also fix `pp-eval-last-sexp'?
> 
> Yes.





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

end of thread, other threads:[~2020-10-15 16:15 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <<mailman.14952.1417284925.1147.bug-gnu-emacs@gnu.org>
     [not found] ` <<20141129191023.34112.qmail@mail.muc.de>
2014-11-29 20:08   ` bug#19217: 25.0.50; `C-M-x' (`eval-defun') on a `defface' that is not top-level Drew Adams
2014-11-30 19:58     ` Alan Mackenzie
2014-11-30 20:51       ` Drew Adams
2014-11-30 23:20         ` Alan Mackenzie
2014-12-01  0:00           ` Drew Adams
2014-12-06 19:10         ` Alan Mackenzie
2014-12-10 22:20           ` Drew Adams
2014-12-13  3:07             ` Drew Adams
2020-09-18 13:36           ` Lars Ingebrigtsen
2020-09-18 15:53             ` Drew Adams
2020-09-19 14:10               ` Lars Ingebrigtsen
2020-10-15 14:28             ` Lars Ingebrigtsen
2020-10-15 15:29               ` Drew Adams
2020-10-15 15:35                 ` Lars Ingebrigtsen
2020-10-15 16:15                   ` Drew Adams
2014-11-29 18:13 Drew Adams
     [not found] ` <mailman.14952.1417284925.1147.bug-gnu-emacs@gnu.org>
2014-11-29 19:10   ` Alan Mackenzie
2014-12-01  3:51 ` Stefan Monnier
2014-12-01  4:29   ` Drew Adams
2014-12-01 13:49     ` Stefan Monnier
     [not found] ` <mailman.15037.1417408221.1147.bug-gnu-emacs@gnu.org>
2014-12-01 17:02   ` Alan Mackenzie

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).