all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Matt Price <moptop99@gmail.com>
To: John Kitchin <jkitchin@andrew.cmu.edu>
Cc: Org Mode <emacs-orgmode@gnu.org>
Subject: Re: access a let* value whe ndefining a function?
Date: Wed, 24 Oct 2018 07:58:09 -0400	[thread overview]
Message-ID: <CAN_Dec_JjOsfRjdTbXzBmZ=cLW3j+rty5gm0kb_qm8w_+wsJ7A@mail.gmail.com> (raw)
In-Reply-To: <m2sh0wfllm.fsf@andrew.cmu.edu>

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

On Tue, Oct 23, 2018 at 4:34 PM John Kitchin <jkitchin@andrew.cmu.edu>
wrote:

>
> Matt Price <moptop99@gmail.com> writes:
>
> > On Tue, Oct 23, 2018 at 2:32 PM John Kitchin <jkitchin@andrew.cmu.edu>
> > wrote:
> >
> >> I think that what you really want to do here is modify org-mime-compose
> so
> >> that you can use the send-actions argument to message-mail. In
> >> scimax-email.el I use that to be able to turn an org-heading into an
> email,
> >> send it, and then jump back to the heading to insert some information
> about
> >> the email into the heading properties after it is sent. A lot of the
> >> information gets passed via global variables. Maybe there is a better
> way
> >> to do that, I wrote that code a long time ago.
> >>
> >>
> > I'm trying to use mu4e~compose-mail instead of message-compose, I guess
> > mostly because I want to be able to use the mu4e email address completion
> > features in the `To:` header.  And it wouldalso be nice to save the email
> > to the appropriate mu folder.   But I didn't seem to be able to make mu4e
> > bounce back to my buffer no matter what I do, and though
> mu4e~compose-mail
> > accepts a return-action argument it doesn't actually use it :-(.
>
> This is kind of tricky. Here is an approach that seems to work:
>
> (defun my-compose ()
>  (interactive)
>  (mu4e~compose-mail)
>  (advice-add 'mu4e~switch-back-to-mu4e-buffer :after
>              `(lambda ()
>                 (switch-to-buffer (get-buffer ,(buffer-name) ))
>                 (advice-remove 'mu4e~switch-back-to-mu4e-buffer
> "om-temp-advice"))
>              '((name . "om-temp-advice"))))
>
> You just call M-x my-compose to get this behavior. I guess you could
> advise mu4e~compose too to add the advice.
>
> Right now I am adding my advice from inside of ~org-mime-org-*-htmlize~ in
the org-mime code (which I guess you no longer use, since you have written
your own email handler). It seems to be a good place for it & is minimally
invasive to other packages.  Here's the code ` code I attempted but which
didn't work for me:

(advice-add 'mu4e~switch-back-to-mu4e-buffer :after
                (eval
                 `(lambda ()
                    (switch-to-buffer (get-buffer ,(buffer-name) ))
                    (advice-remove 'mu4e~switch-back-to-mu4e-buffer
"om-temp-advice")
                    '((name . "om-temp-advice")  ))))

Seems like maybe the problem fore me is the extra "eval".  What maybe I
don't understand is why the backquote works when the ordinary way to add an
advice is the unquoted

(advice-add 'sym (lambda () (message "I am an advice"))

while IIUC yours should evaluate to

(advice-add 'sym '(lambda () (message "I am an advice"))

There should be a difference, shouldn't there?  But clearly I don't
understand.


> It seems necessary to use a temporary advice here. I wasn't aware of the
> name way of removing advice, that is pretty nice here, since we use a
> changing anonymous function.
>
> yes it's nice right?


> >> Otherwise, you need to figure out how to use something like a macro that
> >> captures the current-buffer and creates a lambda function with that
> >> information in it, and attaches it to the message-buffer hook somehow.
> For
> >> example this will display a message-box for me after the message is
> sent.
> >>
> >> (let ((f `(lambda ()
> >>     (message-box "Came from %s" ,(current-buffer)))))
> >>   (message-mail)
> >>   (add-hook 'kill-buffer-hook f nil t))
> >>
> >> Some important notes is this hook is added in local mode, so it only
> >> affects that email buffer.
> >>
> >>
> > Can you explain to me what yo umean by "added in local mode" -- how is
> that
> > achieved?
>
> This is what the final t argument in the add-hood function does. I think
> it makes the hook local to the buffer it runs in, as opposed to in every
> buffer.
>
>
OK thanks that's very helpful. I guess my problem was that there was no
built-in hook that executed *after* mu4e~switch-back-to-buffer.
Which is why I have had to learn about advice.

> >
> > Meanwhile, htis is what I've done and it seems to work:
> >
> > (eval (car (read-from-string
> >             (concat
> >              "(advice-add 'mu4e~switch-back-to-mu4e-buffer  :after
> >                             (lambda ()
> >                               (switch-to-buffer
> >                                (get-buffer \""
> >              (buffer-name)
> >              "\" ))
> >                               (advice-remove
> > 'mu4e~switch-back-to-mu4e-buffer \"om-temp-advice\"))
> >                             '((name . \"om-temp-advice\")))"))))
>
> This is practically the same as my `, solution above, you just use
> strings to protect some parts of code from evaluation, regular function
> calls in places, and then you concat it all together and read it. The `,
> syntax is optional, but without it you have to use list and quotes to
> build up the code in a similar way:
>
> (let ((f (list
>           'lambda ()
>           (list 'message-box "Came from %s" (current-buffer)))))
>   (message-mail)
>   (add-hook 'kill-buffer-hook f nil t))
>
> here the ' means treat something like a symbol, and don't evaluate it.
> We build up the lambda expression using runtime information, e.g. what
> is the current-buffer when the code is run.
>

cool to see the unquoted code here. thank you.

>
> > seems a little baroque. Maybe what you have there is way better.  I don't
> > really undertand backquotes and leading ocmmas even now.
>
> It takes some practice. Suppose you have some variables defined, e.g.
> a=3, then here are two ways to make a list where you put the value of a
> into the first place, and a symbol b in the second place.
>
> (list a 'b)  => '(3 'b)
>
> `(,a b) => '(3 'b)
>
> This lets you build up expressions, including functions that are defined
> at runtime. Lots of macros use this syntax to build up expressions that
> are later evaluated.
>
>

THanks for the tutorial, John, htis is veyr helpful. Now also maybe I will
finally learn the difference between functions and macros.  :-)

[-- Attachment #2: Type: text/html, Size: 8457 bytes --]

      reply	other threads:[~2018-10-24 12:17 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-23 17:40 access a let* value whe ndefining a function? Matt Price
2018-10-23 18:31 ` John Kitchin
2018-10-23 19:38   ` Matt Price
2018-10-23 20:05     ` Matt Price
2018-10-23 20:34     ` John Kitchin
2018-10-24 11:58       ` Matt Price [this message]

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='CAN_Dec_JjOsfRjdTbXzBmZ=cLW3j+rty5gm0kb_qm8w_+wsJ7A@mail.gmail.com' \
    --to=moptop99@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=jkitchin@andrew.cmu.edu \
    /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.