all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Aaron Meurer <asmeurer@gmail.com>
To: Doug Lewan <dougl@shubertticketing.com>
Cc: "help-gnu-emacs@gnu.org" <help-gnu-emacs@gnu.org>
Subject: Re: Clear trailing whitespace on save, but not at the cursor
Date: Fri, 23 Mar 2012 13:57:58 -0600	[thread overview]
Message-ID: <CAKgW=6LN1HA1SZfmCaZpjMfjs13CSOBVDbgyOvK7jfTFJSYfiQ@mail.gmail.com> (raw)
In-Reply-To: <495248DFDEA08C469BBDED2D4AA6C614409AB6@DAKIYA1.pegasus.local>

On Thu, Mar 22, 2012 at 3:08 PM, Doug Lewan <dougl@shubertticketing.com> wrote:
> Aaron Meurer writes:
>
>> But it seems to me that the whole emacs lisp system is designed
>> from the ground up to do hooking (by the way, where I come from, "hooking"
>> is given the much auspicious name "monkey patching").
>
> First:
>
> Today I learned "monkey patching" (and, by going to Wikipedia, it's synonym "duck punching"). Thanks for giving me a techno-chuckle.
>
> Second:
>
> (Assuming I understand the meaning of monkey patching) Hooks are /not/ the same thing. Hooks are favors you ask for when something happens. Hooks are easily removed. Often they are if they are badly behaved. See the documentation for after-change-functions.

I guess they're not the same in the sense that they're officially
supported.  This was kind of the whole point of my question, which is,
to what point are these things supposed to be the way you do things?

Like I said, they can be problematic.  For example, take the seemingly
innocent (add-hook 'before-save-hook 'delete-trailing-whitespace),
which is the universally recommended way make emacs to clear
whitespace on save.  As far as I can tell, with this active, it is
impossible to save without clearing whitespace, unless you clear the
hook.  With the global-set-key solution, I can easily save without
clearing by doing M-x save-buffer.

Hooks are fine if all they do is enable some mode, because I can
easily turn that off if I don't want it. But other than that, you run
into the above issue. Or maybe there's an easy way to bypass hooks
that I just don't know about.

There's other potential problems that are shared by hooks and monkey
patching, like expected invariants that are no longer met.  I suppose
the very existence of hooks means that there really can be no expected
invariants about anything. But to me, this is impossible (you have to
expect that what you use will work, or else you can't really say
anything about your program).

And by the way, I wasn't just referring to defadvice for monkey
patching.  That actually seems like a better way to do it, because at
least it warns you.  I was also talking about how in emacs lisp,
pretty much everything is a global variable, so you can often "fix"
something by just changing some internal variable to do what you want
(usually with knowledge of how it is used internally).

Aaron Meurer

>
> Advice seem like they fit the definition of monkey patching. A piece of advice can be enabled and disabled, but it stays once it has been (defadvice)d.
>
> The emacs lisp manual has lots of warnings about advice. It has legitimate uses, but they are rare -- typically there's-no-other-darn-way-to-do-this kind of things. It's usually worthwhile spending time to find another way because it's hard to write interesting advice that doesn't have unexpected consequences.
>
> The emacs lisp manual has no general warnings about hooks.
>
> There's probably something to that.
>
> ,Douglas
> Douglas Lewan
> Shubert Ticketing
> (201) 489-8600 ext 224
>
>
>



  reply	other threads:[~2012-03-23 19:57 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-22 21:08 Clear trailing whitespace on save, but not at the cursor Doug Lewan
2012-03-23 19:57 ` Aaron Meurer [this message]
2012-03-25 14:12   ` Le Wang
  -- strict thread matches above, loose matches on Subject: below --
2012-03-05  0:48 Aaron Meurer
2012-03-05 11:02 ` Thien-Thi Nguyen
2012-03-05 15:07   ` Juanma Barranquero
2012-03-06  8:23     ` Thien-Thi Nguyen
2012-03-22  0:13       ` Aaron Meurer
2012-03-22 15:45         ` Le Wang
2012-03-22 16:56           ` Aaron Meurer
2012-03-05 16:04   ` Deniz Dogan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAKgW=6LN1HA1SZfmCaZpjMfjs13CSOBVDbgyOvK7jfTFJSYfiQ@mail.gmail.com' \
    --to=asmeurer@gmail.com \
    --cc=dougl@shubertticketing.com \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.